虽然这是一个很简单的操作,但却耗费了我不少的时间,主要是我对消息机制没有充分的理解吧,最后终于在codeproject中找到了类似的例子,自己也顿开毛塞,写这篇文章的目的是对前面做的工作的一个总结,也想将自己的一些经验与大家分享,避免重走弯路.
一.消息的概念 【程序编程相关:线程的基础知识】要实现标题中所说的功能,首先要了解windows的消息机制,看了一篇专门讲述消息机制的文章,觉得很好,就将其中重要部分摘出来作为本文的铺垫(这篇文章来自雷神的«跟我学mfc教程»,写的确实很不错,本文大部分是引用自这个教程中对消息的描述,当然也加入了一些自己的理解),本文共分三个部分,第一部分讲述了消息的基本概念,第二部分讲述了如何添加自定义消息,第三部分讲述了如何实现触发右键菜单动作,如果您对本文的实现部分不太了解,可以好好看看本文前面的部分,一定会有收获. 【推荐阅读:工控系统串口通讯设计】二.如何添加自己的消息 【扩展信息:CBasePage显示图片界面的基类】消息简单的说就是指通过输入设备向程序发出指令要执行某个操作(说的通俗点就是类似某个人要干某项工作,他先给负责人打个招呼,告诉他要做相应的工作了,那么这个招呼就是消息,而相应的工作就是消息处理函数).在sdk中消息其实非常容易理解,当窗口建立后便会有一个函数(窗口处理函数)开始执行一个消息循环,我们还可以清楚的看到消息处理的脉络.一个switch case语句就可以搞定,消息循环直到遇到wm_quit消息才会结束,其余的消息均被拦截后调用相应的处理函数.但在封装了api的mfc中,消息似乎变的有些复杂了,我们看不到熟悉的switch case语句了,取而代之的是一个叫消息映射的东西.为什么mfc要引入消息映射机制,你可以想象一下,在现在的程序开发活动中,你的一个程序是否拥有多个窗体,主窗口就算只有一个,那菜单.工具条.控件这些都是子窗口,那我们需要写多少个switch case,并且还要为每个消息分配一个消息处理函数,这样做是多么的复杂呀.因此mfc采用了一种新的机制.利用一个数组,将窗口消息与相对应的消息处理函数进行映射,你可以理解成这是一个表.这种机制就是消息映射.这张表在窗口基类cwnd定义,派生类的消息映射表如果你没有动作它是空的,也就是说如果你不手工的增加消息处理函数,则当派生窗口接受一个消息时会执行父类的消息处理函数.这样做显然是高效的. 一个标准的消息处理程序是这个样子的在 cwnd 类中预定义了标准 windows 消息 (wm_xxxx wm是window message的缩写) 的默认处理程序.类库基于消息名命名这些处理程序.例如,wm_paint 消息的处理程序在 cwnd 中被声明为:afx_msg void onpaint();afx_msg 关键字通过使这些处理程序区别于其他 cwnd 成员函数来表明 c++ virtual 关键字的作用.但是请注意,这些函数实际上并不是虚拟的,而是通过消息映射实现的.我们在本文的一开始便说明了为什么要这样做.所有能够进行消息处理的类都是基于ccmdtarget类的,也就是说ccmdtarget类是所有可以进行消息处理类的父类.... 下一页