首页 > 技术文章 > 关于SubclassWindow

cxiaoln 2015-04-12 13:30 原文

#define SubclassWindow(hwnd, lpfn) \
((WNDPROC)SetWindowLongPtr((hwnd), GWLP_WNDPROC, (LPARAM)(WNDPROC)(lpfn)))

从该宏可以看出是调用SetWindowLongPtr

具体的详解:http://blog.csdn.net/sunliangyuan/article/details/6028425

由于照着上面的链接敲的时候遇到了两个问题:

1、OnChar无法响应

2、当按回车键的时候整个程序直接退出了

 

一、其实也是看链接里面的介绍,要进行消息映射,而我只是简单的创建一个类,然后继承CEdit

.h

class SuperEdit : public CEdit
{
public:
    SuperEdit(void);
    ~SuperEdit(void);
    void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
};
View Code

这样一种无法进入onchar函数,后来觉得CEdit也应该是一个窗体,既然是窗体就应该要有自己的消息映射函数

于是就写如下代码

//.h
class SuperEdit : public CEdit
{
    DECLARE_DYNAMIC(SuperEdit)
public:
    SuperEdit(void);
    ~SuperEdit(void);
    void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
protected:
    DECLARE_MESSAGE_MAP()
};

// .cpp
#include "StdAfx.h"
#include "SuperEdit.h"

SuperEdit::SuperEdit(void)
{
}

SuperEdit::~SuperEdit(void)
{
}
IMPLEMENT_DYNAMIC(SuperEdit, CEdit)
void SuperEdit::OnChar( UINT nChar, UINT nRepCnt, UINT nFlags )
{
    // TODO: Add your message handler code here and/or call default
    TCHAR ch[20];
    GetWindowText(ch,20);
    if (wcslen(ch) == 1 && (nChar <= 'C' && nChar >= 'A'))
        return;
    if (nChar != 'A' && nChar != 'B' && nChar != 'C' )
        return;
    CEdit::OnChar(nChar, nRepCnt, nFlags);
}

BEGIN_MESSAGE_MAP(SuperEdit, CEdit)
    ON_WM_CHAR()
END_MESSAGE_MAP()
View Code

很幸运的成功了。 那究竟为何这样才能成功呢?

WNDPROC* lplpfn = GetSuperWndProcAddr();
    WNDPROC oldWndProc = (WNDPROC)::SetWindowLongPtr(hWnd, GWLP_WNDPROC,
        (INT_PTR)AfxGetAfxWndProc());

设置自身的回掉函数。具体如样例的描述解释。

 

 

 

二、第二个问题的解释

具体详解:http://tech.163.com/05/0906/09/1SV5EEQF00091589.html

推荐阅读