我是先开始做项目,最近看《深入浅出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.   

    其它大致如此吧。MARK一下,等专家来解答后加深印象
      

  2.   

    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.这些消息,系统都有相应的处理方法,用户只需必要时改写就可以
      

  3.   

    a、b 理解可以算是正确
    c、编辑框不会发出WM_DRAWITEM;能发出WM_DRAWITEM的控件一般有个OWNERDRAW的风格
    d、鼠标左键点击按钮,发出的信息首先是WM_LBUTTONDOWN,然后WM_LBUTTONUP才向父窗口发WM_COMMAND
    e、对于WM_NOTIFY的控件通知消息,程序员不一定必须写函数代码
      

  4.   


    wm_notify这个消息是wm-comand的扩展吧list control, list box, treeview等会发出,wm_commad只能处理小一点的信息。个人理解。
      

  5.   


    c 我说错了,WM_LBUTTONDOWN和WM_LBUTTONUP是接收到了,而不是发出
      

  6.   

    对于WM_COMMAND的控件通知消息,程序员也不一定必须写函数代码
    因为控件通知消息那么多,如果每个都处理,程序员就会很烦了,都是按需求来处理的
    当然,像按钮这种,你不对它的点击作出响应,会让人觉得没意义
      

  7.   


    这个我理解,就像按钮有很多消息种类,但我通常只处理左键单击。其它左键双击、右键单击就不处理了。这个我还没有理解。
    我还以为是产生控件消息的第2种WM_COMMAND,参数内含WM_LBUTTONDOWN信息。
    鼠标左键点击按钮,产生的WM_LBUTTONDOWN消息是控件消息的第1种?
    然后WM_LBUTTONUP才向父窗口发WM_COMMAND?
    如果我们处理了WM_LBUTTONUP,也就不一定向父窗口发WM_COMMAND了?能否就控件消息的第2种WM_COMMAND举个例子说明下?谢谢!
      

  8.   


    谢谢指教!如果说,鼠标左键点击按钮,产生的WM_LBUTTONDOWN消息是控件消息的第1种,
    那么就是说如果需要就自己写处理函数,否则不写,就是放弃处理。
    大多情况下左键双击、右键单击就不处理了。
      

  9.   


    是的, 大概会这样实现: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;
      

  10.   

    除了系统消息,比如WM_NCPAINT 之类和非用户区有关的消息(这类消息可以直接传递给DefWindowProc 处理)外,程序都需要处理。
    window是消息驱动系统,由消息产生消息而不断的驱动程序运行,
    一些消息比较直接,比如键盘按键、鼠标相关等,是由程序操作者的动作产生
    一些消息有系统内部状态改变产生,比如WM_CREATE由系统发出给用户的第一个消息、WM_PAINT消息,窗口的显示区受影响,由GDI子系统产生
    一些消息由处理结果产生WM_CLOSE是在WM_QUIT 时调用PostQuitMessage产生,
    一些消息是某个控件接收点击比如菜单
    还有一些消息由用户定义,你也可以定义任意的消息传人窗口过程( WM_USER+n )
      

  11.   

    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和另写函数响应,直接在这里写代码处理,可以吧?
      

  12.   


    谢谢!
    消息驱动系统,我的感觉就是,所谓消息,就是系统运行时的各种时点,程序员要写代码告诉系统,当遇到某个时点时,系统下一步该如何运行。而此阶段又可以多方面产生更多消息:代码主动发出消息;键盘鼠标的消息;用户使用的消息,比如关闭窗口。而窗口之间的覆盖关系,会产生一系列的重画消息给相关窗口。比如,我们程序员写一个响应鼠标左键点击某个控件的函数f1,那么当用户使用时左键点击某个控件,就系统执行这个函数f1。
    Windows系统的好处就在消息的产生与响应非常灵活有效。
      

  13.   

    c、WM_CTLCOLOR、WM_DRAWITEM之类的控件通知消息,意义也是明确的,类似上面的a,系统有默认的处理代码。这个过程中,程序员,可以拦截,增加或替代系统默认的处理代码。
     WM_DRAWITEM这种消息,我的印象中好像只有ClistCtrl控件发出。
     编辑框之类的控件是否能发出这种控件消息?
    -------------------
    很多控件都可以,CButton,CMenu,CListBox,CListCtrl,CComboBox等
    d、一种是WM_COMMAND格式的,但lParam里保存有控件的句柄。与上面的b类似,意义不明确的,程序员必须写函数代码,指定计算机如何运行的。
    鼠标左键点击按钮,发出的信息,就是这种信息,对不对?
    ----------------------------
    菜单,加速键/快捷键,控件都可能会产出WM_COMMAND消息到父窗口,只有控件的lParam参数才表示该控件的HWND窗口句柄,另外两种情况为0e、控件通知格式WM_NOTIFY,是对WM_COMMAND格式的发展,也是意义不明确的,程序员必须写函数代码,指定计算机如何运行的。
    -------------------
    可以理解为WM_COMMAND(只针对是控件的情况)消息的扩展,它更够携带更多的信息