消息的产生(针对mfc)

这是09年写的文章,07年毕的业,我也没有系统的看过mfc的书,看了也没仔细看,囫囵吞枣,自得奇异,若有不对,还望你海涵。后面看到写的垃圾稍加整理

题外话:王选先生曾说:当一个人出现在媒体的面前,说明这个人已经不再搞研发了,只好卖狗皮膏月一样在观众面前叫卖。我没资格被王选先生骂,因此继续。消息的产生很少讲,但我一直很想搞明白怎么回事。鼠标和键盘都可产生消息中断。只研究鼠标,比如它的左击事件。呵呵,下面看有趣的代码。
class CCustListCtrl : public CListCtrl{}//CListCtrl标准控件
void CCustListCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
AfxMessageBox("list down");
CListCtrl::OnLButtonDown(nFlags, point);
}//下面为dlg
void CC321Dlg::OnLButtonDown(UINT nFlags, CPoint point)
{
AfxMessageBox("dlg down");
CDialog::OnLButtonDown(nFlags, point);
}
CC321Dlg dlg;CCustListCtrl listctrl ;listctrl是dlg的一个变量;那么在"listctrl的区域"单击鼠标左键,上面的两个消息谁先处理,是否都能被激发。 CCustListCtrl::OnLButtonDown先被处理,并且 CC321Dlg::OnLButtonDown是不会被处理的。说明在哪个子控件上方单击鼠标,事件仅仅被送往此子控件处理,即使此子控件不处理,消息不会往下传递给父窗体,"因为并且"子控件的父类可以处理完毕。要是把上面"CListCtrl::OnLButtonDown(nFlags, point);"这句话屏蔽掉,那么listctrl是不会被重绘制的。说明CListCtrl::OnLButtonDown触发了Invalidate函数,造成基类的OnPaint事件被处理,控件重绘。
下个问题,假若有dlg上有成千个子控件,消息如何被送往对应的子控件。呵呵,你创建窗体的时候每个控件的位置都已经按一定的规律排列好的,用鼠标的点位置匹配控件的范围要不了几次判断。对?我个人的理解。比如windows界面这个大窗体上有两个对话框,其一对话框a上有成千个控件。鼠标左键单击对话框a上任控件,这时windows界面大线程会用鼠标坐标匹配是否在两个对话框其中一个内,判断后,把消息传给a;不在,就传给windows窗体的客户区域。接着再用鼠标坐标匹配对话框a中子控件的位置,很快的找到对应的控件,因为是排列有序的。
下面我整体上讲windows操作系统的整个界面消息处理流程。鼠标和键盘都是消息触发机,你看到的windows界面看做是个大MFC 对话框(说的有点仓促呀,应该是多文档容器或者更复杂的东西吧)。每个MFC有个主线程,接收消息,peek消息,分发消息,鼠标的消息传给windows界面,windows界面这个主线程的while函数peek到消息之后,开始分发,判断当前处于激活对话框是a,就发给a对话框;a对话框同理也有主线程,主线程也有个while,peek到消息,判断怎么分发呀,判断当前鼠标在哪个控件位置呀,就交给哪个控件对象处理。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值