关于SubclassWindow
#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
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
class SuperEdit : public CEdit { public: SuperEdit(void); ~SuperEdit(void); void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags); };
这样一种无法进入onchar函数,后来觉得CEdit也应该是一个窗体,既然是窗体就应该要有自己的消息映射函数
于是就写如下代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
//.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()
很幸运的成功了。 那究竟为何这样才能成功呢?
WNDPROC* lplpfn = GetSuperWndProcAddr(); WNDPROC oldWndProc = (WNDPROC)::SetWindowLongPtr(hWnd, GWLP_WNDPROC, (INT_PTR)AfxGetAfxWndProc());
设置自身的回掉函数。具体如样例的描述解释。
二、第二个问题的解释
具体详解:http://tech.163.com/05/0906/09/1SV5EEQF00091589.html