关于windows消息的理解
我是先开始做项目,最近看《深入浅出MFC》中补课,以下是网上的文字:
1.标准Windows消息,又称为窗口消息。除WM_COMMAND外以WM_开头的消息,例如,WM_CREATE、WM_CLOSE。
2.命令消息。消息名为WM_COMMAND,消息中附带了标识符ID来区分是来自哪个菜单、工具栏按钮或加速键的消息。
3.通知消息。通知消息一般由列表框等子窗口发送给父窗口,消息名也是WM_COMMAND,其中附带了控件通知码来区分控件。
第一控件通知格式只是窗口消息的子集。它的特征格式如下:WM_XXXX。它主要来自下面的3种消息类型:
(1)表示一个控件窗口要么已经被创建或销毁,要么已经被鼠标单击的消息:WM_PARENTNOTIFY;(2)发送到父窗口,用来绘制自身窗口的消息,例如: WM_CTLCOLOR、WM_DRAWITEM、WM_MEASUREITEM、WM_DELETEITEM、WM_CHARTOITEM、WM_VKTOITEM、WM_COMMAND和WM_COMPAREITEM.(3)有滚动调控件发送,通知父窗口滚动窗口的消息:WM_VSCROLL和WM_HSCROLL
第二控件通知格式与命令消息共享,它的特征格式如下:WM_COMMAND。lParam用来区分是命令消息还是控件通知消息:如果lParam为NULL,则这是个命令消息,否则lParam里面放的必然就是控件的句柄,是一个控件通知消息。对于wParam则是低位放的是控件ID,高位放的是相应的消息事件。
第三控件通知格式特征格式:WM_NOTIFY。
下面是我的一些理解,请大家看看,我的理解是否正确,也帮我解答些问题:
a、标准Windows消息,又称为窗口消息,是对窗口做某种处理发出的,如WM_CREATE、WM_CLOSE,是有明确意义,系统有默认的处理代码。这个过程中,程序员,可以拦截,增加或替代系统默认的处理代码。
b、而命令消息,是由用户点击菜单、工具栏发出的,标记为WM_COMMAND,意义不明确的,程序员必须写函数代码,指定计算机如何运行的。
这种理解对不对?
关于控件消息,也叫控件通知消息:
c、WM_CTLCOLOR、WM_DRAWITEM之类的控件通知消息,意义也是明确的,类似上面的a,系统有默认的处理代码。这个过程中,程序员,可以拦截,增加或替代系统默认的处理代码。
WM_DRAWITEM这种消息,我的印象中好像只有ClistCtrl控件发出。
编辑框之类的控件是否能发出这种控件消息?
d、一种是WM_COMMAND格式的,但lParam里保存有控件的句柄。与上面的b类似,意义不明确的,程序员必须写函数代码,指定计算机如何运行的。
鼠标左键点击按钮,发出的信息,就是这种信息,对不对?
e、控件通知格式WM_NOTIFY,是对WM_COMMAND格式的发展,也是意义不明确的,程序员必须写函数代码,指定计算机如何运行的。
谢谢!
[解决办法]
呵呵,和我类似啊。倒过来的。不过我现在也没看过深入浅出......
[解决办法]
1.标准Windows消息,又称为窗口消息。除WM_COMMAND外以WM_开头的消息,例如,WM_CREATE、WM_CLOSE。
在MFC中WM_CREATE、WM_CLOSE都是些系统消息,系统都有对这些消息的默认出来方法,比如你可以向某个窗口发送WM_CLOSE消息来关闭窗口,MFC对该消息的响应函数是OnClose,当然用户也可以重写这些方法。
2.命令消息。消息名为WM_COMMAND,消息中附带了标识符ID来区分是来自哪个菜单、工具栏按钮或加速键的消息。
这些消息相对于上面的出来要相对麻烦写,需要自己写实现函数,和楼主的理解相符
3.通知消息。通知消息一般由列表框等子窗口发送给父窗口,消息名也是WM_COMMAND,其中附带了控件通知码来区分控件。
第一控件通知格式只是窗口消息的子集。它的特征格式如下:WM_XXXX。它主要来自下面的3种消息类型:
(1)表示一个控件窗口要么已经被创建或销毁,要么已经被鼠标单击的消息:WM_PARENTNOTIFY;(2)发送到父窗口,用来绘制自身窗口的消息,例如: WM_CTLCOLOR、WM_DRAWITEM、WM_MEASUREITEM、WM_DELETEITEM、WM_CHARTOITEM、WM_VKTOITEM、WM_COMMAND和WM_COMPAREITEM.(3)有滚动调控件发送,通知父窗口滚动窗口的消息:WM_VSCROLL和WM_HSCROLL
第二控件通知格式与命令消息共享,它的特征格式如下:WM_COMMAND。lParam用来区分是命令消息还是控件通知消息:如果lParam为NULL,则这是个命令消息,否则lParam里面放的必然就是控件的句柄,是一个控件通知消息。对于wParam则是低位放的是控件ID,高位放的是相应的消息事件。
第三控件通知格式特征格式:WM_NOTIFY。
第一控件通知格式只是窗口消息的子集。它的特征格式如下:WM_XXXX。
这类消息需要自己写处理函数,同时在发送消息的时候可以附加一个参数,多参数可以考虑结构体,
其他WM_CTLCOLOR、WM_DRAWITEM、WM_MEASUREITEM、WM_DELETEITEM、WM_CHARTOITEM、WM_VKTOITEM、WM_COMMAND和WM_COMPAREITEM.这些消息,系统都有相应的处理方法,用户只需必要时改写就可以
[解决办法]
wm_notify这个消息是wm-comand的扩展吧
list control, list box, treeview等会发出,
wm_commad只能处理小一点的信息。
个人理解。
[解决办法]
除了系统消息,比如WM_NCPAINT 之类和非用户区有关的消息(这类消息可以直接传递给DefWindowProc 处理)外,程序都需要处理。
window是消息驱动系统,由消息产生消息而不断的驱动程序运行,
一些消息比较直接,比如键盘按键、鼠标相关等,是由程序操作者的动作产生
一些消息有系统内部状态改变产生,比如WM_CREATE由系统发出给用户的第一个消息、WM_PAINT消息,窗口的显示区受影响,由GDI子系统产生
一些消息由处理结果产生WM_CLOSE是在WM_QUIT 时调用PostQuitMessage产生,
一些消息是某个控件接收点击比如菜单
还有一些消息由用户定义,你也可以定义任意的消息传人窗口过程( WM_USER+n )
------解决方案--------------------
c、WM_CTLCOLOR、WM_DRAWITEM之类的控件通知消息,意义也是明确的,类似上面的a,系统有默认的处理代码。这个过程中,程序员,可以拦截,增加或替代系统默认的处理代码。
WM_DRAWITEM这种消息,我的印象中好像只有ClistCtrl控件发出。
编辑框之类的控件是否能发出这种控件消息?
-------------------
很多控件都可以,CButton,CMenu,CListBox,CListCtrl,CComboBox等
d、一种是WM_COMMAND格式的,但lParam里保存有控件的句柄。与上面的b类似,意义不明确的,程序员必须写函数代码,指定计算机如何运行的。
鼠标左键点击按钮,发出的信息,就是这种信息,对不对?
----------------------------
菜单,加速键/快捷键,控件都可能会产出WM_COMMAND消息到父窗口,只有控件的lParam参数才表示该控件的HWND窗口句柄,另外两种情况为0
e、控件通知格式WM_NOTIFY,是对WM_COMMAND格式的发展,也是意义不明确的,程序员必须写函数代码,指定计算机如何运行的。
-------------------
可以理解为WM_COMMAND(只针对是控件的情况)消息的扩展,它更够携带更多的信息
[解决办法]
进来合影,学习.
顺便也说下个人看法.
首先要理解WINDOWS程序是由消息驱动的.
不同的消息做不同的事,然后根据这些行为,就不难理解,有的要参数,有的不要参数,有的消息需要自己处理 ,有的消息可以不用管,MS帮我们做好的.