关于windows消息的理解

hztj2005 2012-12-17 04:20:51

我是先开始做项目,最近看《深入浅出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格式的发展,也是意义不明确的,程序员必须写函数代码,指定计算机如何运行的。

谢谢!
...全文
304 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
hztj2005 2012-12-18
  • 打赏
  • 举报
回复
引用 1 楼 happyparrot 的回复:
呵呵,和我类似啊。倒过来的。不过我现在也没看过深入浅出......
谢谢版主光顾! 在这个版认识了很多热心的朋友,增长了不少知识!
gfm688 2012-12-18
  • 打赏
  • 举报
回复
引用 13 楼 hztj2005 的回复:
不过,如果功能不复杂,不发送WM_COMMAND和另写函数响应,直接在这里写代码处理,可以吧?
可以
你妹的特盗不 2012-12-18
  • 打赏
  • 举报
回复
进来合影,学习. 顺便也说下个人看法. 首先要理解WINDOWS程序是由消息驱动的. 不同的消息做不同的事,然后根据这些行为,就不难理解,有的要参数,有的不要参数,有的消息需要自己处理 ,有的消息可以不用管,MS帮我们做好的.
Eleven 2012-12-18
  • 打赏
  • 举报
回复
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(只针对是控件的情况)消息的扩展,它更够携带更多的信息
hztj2005 2012-12-17
  • 打赏
  • 举报
回复
引用 12 楼 worldy 的回复:
除了系统消息,比如WM_NCPAINT 之类和非用户区有关的消息(这类消息可以直接传递给DefWindowProc 处理)外,程序都需要处理。 window是消息驱动系统,由消息产生消息而不断的驱动程序运行, 一些消息比较直接,比如键盘按键、鼠标相关等,是由程序操作者的动作产生 一些消息有系统内部状态改变产生,比如WM_CREATE由系统发出给用户的第一个消息、WM_PAINT消息,窗口的显……
谢谢! 消息驱动系统,我的感觉就是,所谓消息,就是系统运行时的各种时点,程序员要写代码告诉系统,当遇到某个时点时,系统下一步该如何运行。而此阶段又可以多方面产生更多消息:代码主动发出消息;键盘鼠标的消息;用户使用的消息,比如关闭窗口。而窗口之间的覆盖关系,会产生一系列的重画消息给相关窗口。 比如,我们程序员写一个响应鼠标左键点击某个控件的函数f1,那么当用户使用时左键点击某个控件,就系统执行这个函数f1。 Windows系统的好处就在消息的产生与响应非常灵活有效。
hztj2005 2012-12-17
  • 打赏
  • 举报
回复
case
 WM_LBUTTONUP:
   if (bDown)   { 
    SendMessage(GetParent(hWnd), WM_COMMAND, MAKEWPARAM(GetDlgCtrlID(hWnd), BN_CLICKED), (LPARAM)hWnd);
    bDown = FALSE; 
    return 0; 
  } 
明白了,这正是你说的: 鼠标左键点击按钮,发出的信息首先是WM_LBUTTONDOWN,然后WM_LBUTTONUP才向父窗口发WM_COMMAND 那么我们需要再写一个函数,响应WM_COMMAND消息了。 不过,如果功能不复杂,不发送WM_COMMAND和另写函数响应,直接在这里写代码处理,可以吧?
worldy 2012-12-17
  • 打赏
  • 举报
回复
除了系统消息,比如WM_NCPAINT 之类和非用户区有关的消息(这类消息可以直接传递给DefWindowProc 处理)外,程序都需要处理。 window是消息驱动系统,由消息产生消息而不断的驱动程序运行, 一些消息比较直接,比如键盘按键、鼠标相关等,是由程序操作者的动作产生 一些消息有系统内部状态改变产生,比如WM_CREATE由系统发出给用户的第一个消息、WM_PAINT消息,窗口的显示区受影响,由GDI子系统产生 一些消息由处理结果产生WM_CLOSE是在WM_QUIT 时调用PostQuitMessage产生, 一些消息是某个控件接收点击比如菜单 还有一些消息由用户定义,你也可以定义任意的消息传人窗口过程( WM_USER+n )
潇潇雨云 2012-12-17
  • 打赏
  • 举报
回复
学习学习学习
gfm688 2012-12-17
  • 打赏
  • 举报
回复
引用 8 楼 hztj2005 的回复:
鼠标左键点击按钮,产生的WM_LBUTTONDOWN消息是控件消息的第1种? 然后WM_LBUTTONUP才向父窗口发WM_COMMAND? 如果我们处理了WM_LBUTTONUP,也就不一定向父窗口发WM_COMMAND了?
是的, 大概会这样实现:

case WM_LBUTTONDBLCLK:
case WM_LBUTTONDOWN:
  bDown = TRUE;
  return 0;
case WM_LBUTTONUP:
  if (bDown)
  {
    SendMessage(GetParent(hWnd), WM_COMMAND, MAKEWPARAM(GetDlgCtrlID(hWnd), BN_CLICKED), (LPARAM)hWnd);
    bDown = FALSE;
    return 0;
  }
  break;
case WM_KEYUP:
  if(wParam==VK_SPACE)
  {	
    SendMessage(GetParent(hWnd), WM_COMMAND, MAKEWPARAM(GetDlgCtrlID(hWnd), BN_CLICKED), (LPARAM)hWnd);
    return 0;
  }
  break;
hztj2005 2012-12-17
  • 打赏
  • 举报
回复
引用 3 楼 kiven2010 的回复:
第一控件通知格式只是窗口消息的子集。它的特征格式如下:WM_XXXX。 这类消息需要自己写处理函数,同时在发送消息的时候可以附加一个参数,多参数可以考虑结构体.
谢谢指教! 如果说,鼠标左键点击按钮,产生的WM_LBUTTONDOWN消息是控件消息的第1种, 那么就是说如果需要就自己写处理函数,否则不写,就是放弃处理。 大多情况下左键双击、右键单击就不处理了。
hztj2005 2012-12-17
  • 打赏
  • 举报
回复
引用 7 楼 gfm688 的回复:
对于WM_COMMAND的控件通知消息,程序员也不一定必须写函数代码 因为控件通知消息那么多,如果每个都处理,程序员就会很烦了,都是按需求来处理的 当然,像按钮这种,你不对它的点击作出响应,会让人觉得没意义
这个我理解,就像按钮有很多消息种类,但我通常只处理左键单击。其它左键双击、右键单击就不处理了。
引用 6 楼 gfm688 的回复:
鼠标左键点击按钮,发出的信息首先是WM_LBUTTONDOWN,然后WM_LBUTTONUP才向父窗口发WM_COMMAND c 我说错了,WM_LBUTTONDOWN和WM_LBUTTONUP是接收到了,而不是发出
这个我还没有理解。 我还以为是产生控件消息的第2种WM_COMMAND,参数内含WM_LBUTTONDOWN信息。 鼠标左键点击按钮,产生的WM_LBUTTONDOWN消息是控件消息的第1种? 然后WM_LBUTTONUP才向父窗口发WM_COMMAND? 如果我们处理了WM_LBUTTONUP,也就不一定向父窗口发WM_COMMAND了? 能否就控件消息的第2种WM_COMMAND举个例子说明下? 谢谢!
gfm688 2012-12-17
  • 打赏
  • 举报
回复
对于WM_COMMAND的控件通知消息,程序员也不一定必须写函数代码 因为控件通知消息那么多,如果每个都处理,程序员就会很烦了,都是按需求来处理的 当然,像按钮这种,你不对它的点击作出响应,会让人觉得没意义
gfm688 2012-12-17
  • 打赏
  • 举报
回复
引用 4 楼 gfm688 的回复:
a、b 理解可以算是正确 c、编辑框不会发出WM_DRAWITEM;能发出WM_DRAWITEM的控件一般有个OWNERDRAW的风格 d、鼠标左键点击按钮,发出的信息首先是WM_LBUTTONDOWN,然后WM_LBUTTONUP才向父窗口发WM_COMMAND e、对于WM_NOTIFY的控件通知消息,程序员不一定必须写函数代码
c 我说错了,WM_LBUTTONDOWN和WM_LBUTTONUP是接收到了,而不是发出
bsnry 2012-12-17
  • 打赏
  • 举报
回复
引用 4 楼 gfm688 的回复:
a、b 理解可以算是正确 c、编辑框不会发出WM_DRAWITEM;能发出WM_DRAWITEM的控件一般有个OWNERDRAW的风格 d、鼠标左键点击按钮,发出的信息首先是WM_LBUTTONDOWN,然后WM_LBUTTONUP才向父窗口发WM_COMMAND e、对于WM_NOTIFY的控件通知消息,程序员不一定必须写函数代码
wm_notify这个消息是wm-comand的扩展吧 list control, list box, treeview等会发出, wm_commad只能处理小一点的信息。 个人理解。
gfm688 2012-12-17
  • 打赏
  • 举报
回复
a、b 理解可以算是正确 c、编辑框不会发出WM_DRAWITEM;能发出WM_DRAWITEM的控件一般有个OWNERDRAW的风格 d、鼠标左键点击按钮,发出的信息首先是WM_LBUTTONDOWN,然后WM_LBUTTONUP才向父窗口发WM_COMMAND e、对于WM_NOTIFY的控件通知消息,程序员不一定必须写函数代码
  • 打赏
  • 举报
回复
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.这些消息,系统都有相应的处理方法,用户只需必要时改写就可以
快乐鹦鹉 2012-12-17
  • 打赏
  • 举报
回复
其它大致如此吧。MARK一下,等专家来解答后加深印象
快乐鹦鹉 2012-12-17
  • 打赏
  • 举报
回复
呵呵,和我类似啊。倒过来的。不过我现在也没看过深入浅出......

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧