关于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

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

转载于:https://www.cnblogs.com/cxiaoln/p/4419401.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值