Windows消息处理

这里简述一下关于window消息处理,主要在实际应用中;


在一个Windows程序中,一个程序的的消息是通过一个大循环来实现接收处理的;

这个可以查看win32程序的编写,具体可以详细查找相关资料;


在Windows编程中,尤其是MFC程序中,关于窗口消息是非常重要的;


窗口过程函数(接收处理窗口消息的函数),函数的主要实现在CWnd中:

LRESULT CWnd::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// OnWndMsg does most of the work, except for DefWindowProc call
LRESULT lResult = 0;
if (!OnWndMsg(message, wParam, lParam, &lResult))
lResult = DefWindowProc(message, wParam, lParam);
return lResult;
}

有上述代码可以看出,WindowProc接收到窗口的消息,首先给OnWndMsg处理,然后判断是否给DefWindowProc处理;



关于:

BOOL CWnd::OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult);

从上面的代码可以看出,所有被窗口过程函数WindowProc接收的消息,首先给OnWndMsg处理;

OnWndMsg函数同城处理的就是在窗口中添加的消息函数



下面给出应用的示例:

添加对话框OnWndMsg虚函数实现;

添加对话框DefWindowProc虚函数实现;

添加对话框OnLButtonDown想要消息函数;


BOOL CtmfcDlg::OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
// TODO: 在此添加专用代码和/或调用基类


switch( message )
{
case WM_LBUTTONDOWN:
MessageBox(L"OnWndMsg");//return 1; 
break;
}





return CDialogEx::OnWndMsg(message, wParam, lParam, pResult);
}





LRESULT CtmfcDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: 在此添加专用代码和/或调用基类




switch( message )
{
case WM_LBUTTONDOWN:
MessageBox(L"DefWindowProc");
break;
}




return CDialogEx::DefWindowProc(message, wParam, lParam);
}



void CtmfcDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值


MessageBox(L"OnLButtonDown");


CDialogEx::OnLButtonDown(nFlags, point);
}


然后鼠标右键单击对话框,会依次弹出:

OnWndMsg

OnLButtonDown

DefWindowProc


通过这个函数可以看出,OnWndMsg会将相关的消息通过消息表分发给相关的消息实现函数;


如果取消CDialogEx::OnLButtonDown(nFlags, point);这句话,则DefWindowProc不显示;

或者,在OnWndMsg中的相应消息后,return 1; 表示消息已经处理过了,不在向下传递;




自定义消息:

一般的自定义消息,可以通过模仿onbuttonclick消息的方法实现:

一般实现过程是:

定义 自定义消息

在头文件添加afx 函数,参数为wparm和lparm;

在cpp文件中的窗口的消息表BEGIN_MESSAGE_MAP中添加消息关联,

在cpp文件中实现函数;


但是这个过程有点麻烦,而且破坏了MFC的向导生成的代码,在VC6以后没有影响,只是不好看而已;


通过文章前面的描述,可以知道OnWndMsg虚函数接收处理所有的窗口消息,所以可以通过重载OnWndMsg函数,然后判断,如果消息等于自定义消息就直接处理;

这样程序会简明很多;


当然OnWndMsg中可以处理所有的Windows窗口消息,但是如果是Windows窗口消息,如果没有特殊处理,一般还是建议用添加消息函数的方法添加处理,就是在类的属性中添加相应的消息函数,不用将所有的消息处理放到OnWndMsg中;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chinabinlang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值