vs2010,重载windowProc,编写控件消息响应函数

vs2010,重载windowProc,编写控件消息响应函数

  (2012-11-06 21:27:21)
标签: 

杂谈

分类: MFC

来源:
http://blog.sina.com.cn/s/blog_6c8fad9f01014bt1.html

WM_COMMAND message:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms647591(v=vs.85).aspx

winProc(message, wParam, lParam)
选择是WM_COMMAN的message;
根据wParam的高16位确定控件定义的通知码,比如对于COMBOBOX控件中的CBN_SELCHANGE消息码,意义是当combo当前选中的行的内容发生改变;
根据wParam的低16位确定控件的标识码;
对消息进行响应。
例子:
LRESULT CTestSolutionDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
       // TODO: Add your specialized code here and/or call the base class
       switch(message){
       case WM_COMMAND:
                     if (LOWORD(wParam) >= IDC_CHECK_SELECT0 &&
                            LOWORD(wParam) <= IDC_CHECK_SELECT9) {
                                   enableWindowInLine(LOWORD(wParam) - IDC_CHECK_SELECT0,
                                          IsDlgButtonChecked(LOWORD(wParam)));
                     }
                     else if(HIWORD(wParam) == CBN_SELCHANGE &&
                                   LOWORD(wParam) >= IDC_COMBO_NAME0 &&
                                   LOWORD(wParam) <= IDC_COMBO_NAME9) {
                                          showMiContent(LOWORD(wParam) - IDC_COMBO_NAME0);
                     }
                     else if (LOWORD(wParam) >= IDC_EDIT_POS0 &&
                                     LOWORD(wParam) <= IDC_EDIT_POS9) {
                                          resetRange(LOWORD(wParam) - IDC_EDIT_POS0);
                     }
                     else if (LOWORD(wParam) >= IDC_EDIT_BITS0 &&
                                   LOWORD(wParam) <= IDC_EDIT_BITS9) {
                                            resetRange(LOWORD(wParam) - IDC_EDIT_BITS0);
                     }
                     break;
       }
       return CDialog::WindowProc(message, wParam, lParam);

}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MFC自定义控件消息响应方式一般有以下几种: 1. 消息映射法:在控件所在的窗口类中添加响应函数,然后在消息映射表中添加对应的消息映射。例如: ``` BEGIN_MESSAGE_MAP(CMyWnd, CWnd) ON_WM_PAINT() ON_WM_LBUTTONDOWN() END_MESSAGE_MAP() void CMyWnd::OnPaint() { // TODO: 在此处添加消息处理程序代码 } void CMyWnd::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: 在此处添加消息处理程序代码 } ``` 2. 消息钩子法:在控件类中重载虚函数PreTranslateMessage,然后在函数中进行消息处理。例如: ``` class CMyControl : public CWnd { public: virtual BOOL PreTranslateMessage(MSG* pMsg); }; BOOL CMyControl::PreTranslateMessage(MSG* pMsg) { if (pMsg->message == WM_LBUTTONDOWN) { // TODO: 在此处添加消息处理程序代码 return TRUE; } return CWnd::PreTranslateMessage(pMsg); } ``` 3. 消息分发法:在控件类中重载虚函数WindowProc,然后在函数中进行消息处理。例如: ``` class CMyControl : public CWnd { public: virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam); }; LRESULT CMyControl::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_PAINT: // TODO: 在此处添加消息处理程序代码 break; case WM_LBUTTONDOWN: // TODO: 在此处添加消息处理程序代码 break; default: break; } return CWnd::WindowProc(message, wParam, lParam); } ``` 以上三种方法都可以用来响应自定义控件消息,具体应该根据实际情况选择。其中,消息映射法是MFC中最常用的方式,也是最简单易懂的方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值