none
关于按扭的WM_LBUTTONDOWN和WM_COMMAND消息 RRS feed

  • 问题

  • 您好:

           当鼠标在按扭上面点击时,父窗口会收到WM_COMMAND消息,子窗口会收到WM_LBUTTONDOWN和WM_LBUTTONUP消息。那么我想问一下这个WM_COMMAND消息的产生与WM_LBUTTONDOWN和WM_LBUTTONUP消息有没有关系。或者说WM_COMMAND消息的产生与WM_LBUTTONDOWN和WM_LBUTTONUP消息的处理是否有关系?

    2021年3月16日 2:08

全部回复

  • 你好,

    感谢您在MSDN中文论坛发帖提问。

    >>关于按扭的WM_LBUTTONDOWN和WM_COMMAND消息

    WM_COMMAND消息: 当用户从菜单中选择命令项,控件将通知消息发送到其父窗口。

    WM_LBUTTONDOWN消息:当光标在窗口的客户区域中时,用户按下鼠标左键时发布。 如果未捕获鼠标,则消息将发布到光标下方的窗口中。 否则,该消息将发布到捕获鼠标的窗口中。

    来自菜单、快捷键或工具栏按钮等的消息均是命令消息。这类消息都以WM_COMMAND形式呈现。当用户左击菜单中选择命令项时,控件将会发送WM_COMMAND消息到其父窗口。当用户左击鼠标时都会将WM_LBUTTONDOWN消息和WM_LBUTTONUP消息发布到捕获鼠标的窗口中。

    当按下一个确定按钮, 由于这个按钮有对应的ID,所以在响应的时候会到WM_COMMAND中寻找对应的ID产生的消息。当点击鼠标,或者键盘的时候,没有ID与它对应,但是有响应的有事件与此对应, 即WM_LBUTTONDOWN。

    Best Regards,

    Jeanine Zhang


    "Visual c++" forum will be migrating to a new home on Microsoft Q&A !
    We invite you to post new questions in the "Developing Universal Windows apps" forum’s new home on Microsoft Q&A !
    For more information, please refer to the sticky post.

    2021年3月16日 8:01
    版主
  • 你好:

          “当按下一个确定按钮, 由于这个按钮有对应的ID,所以在响应的时候会到WM_COMMAND中寻找对应的ID产生的消息”这句话不明白是什么意思。我想了解的是

    在按扭上点击产生的WM_COMMAND与WM_LBUTTONDOWN是否有关。

    2021年3月16日 11:03
  • 你好,

    WM_COMMAND消息是由用户菜单选择或菜单访问键生成。
    WM_LBUTTONDOWN消息是点击鼠标左键生成的。
    区分这两个消息的重点是鼠标左击点了什么。 只要点了鼠标左键就会生成WM_LBUTTONDOWN消息。如果点的是菜单上的按钮,不仅会生成WM_LBUTTONDOWN消息,还会生成WM_COMMAND消息以响应该按钮所要产生的消息。 当按钮接收到点击消息的时候,首先按下响应的是WM_LBUTTONDOWN消息,松开响应的是WM_LBUTTONUP消息。松开按钮的时候会发送WM_COMMAND消息给父窗口,由父窗口做点击事件响应。

    WM_LBUTTONDOWN消息是标准消息。WM_COMMAND消息是命令消息。所以我认为在按扭上点击产生的WM_COMMAND与WM_LBUTTONDOWN无关。

    WM_COMMAND消息是命令消息。ON_COMMAND专门用于处理命令消息。命令消息在CCmdTarget类是没有处理函数的, 也就是说不在消息映射表中。菜单项和按钮还有一些其他的控件都有其ID值,命令消息映射宏主要是将菜单, 按钮和其他一些控件的ID和处理函数映射起来。当命令目标对象收到具有指定ID的Windows WM_COMMAND消息时,ON_COMMAND将调用成员函数memberFxn来处理该消息。

    所以综上所述在按扭上点击产生的WM_COMMAND与WM_LBUTTONDOWN无关。

    Best Regards,

    Jeanine Zhang


    "Visual c++" forum will be migrating to a new home on Microsoft Q&A !
    We invite you to post new questions in the "Developing Universal Windows apps" forum’s new home on Microsoft Q&A !
    For more information, please refer to the sticky post.

    2021年3月17日 7:15
    版主
  • 我也为你问的问题进行了探索,实际情况是:

    1、子窗口收到WM_LBUTTONDOWN;

    2、子窗口收到WM_LBUTTONUP;

    3、子窗口向父窗口发送(SendMessage)WM_COMMAND。这里特别要注意,是发送而不是投递(PostMessage),意味着这个WM_COMMAND不会到达应用程序的主消息循环队列。如果你跟踪按钮的点击事件处理,你查看程序调用堆栈,程序正处于WM_COMMAND消息的上一条消息WM_LBUTTONUPPreTranslateMessage->user32.dll::IsDialogMessage->comctl32.dll::Button_NotifyParent->user32.dll::SendMessage。



    2021年4月13日 2:25
  • 从另外一种方法也可以确认:

    你建立一个对话框,在对话框上放置一个按钮,从CButton继承一个自定义类CButtonTest,把对话框的按钮以CButtonTest为类型建立一个变量m_ButtonTest,VC自动关联添加DDX_Control(pDX, IDC_BUTTON1, m_ButtonTest);其中IDC_BUTTON1是你的按钮ID。为CButtonTest建立WM_LBUTTONUP消息处理,在CButtonTest::OnLButtonUp中,会调用CButton::OnLButtonUp(nFlags, point),你在这条调用语句打一个断点(称断点1),在这条语句的下一条语句打一个断点(称断点2)。为对话框的IDC_BUTTON1控件(即前面的对话框)添加鼠标点击事件处理函数,在该函数中的返回语句(函数的结束"}"处)打一个断点(称断点3)。

    实验结果,你会清楚地看到,断点的顺序:断点1->断点3->断点2。这正说明按钮对父窗口的WM_COMMAND是在按钮的WM_LBUTTONUP的缺省处理过程中,翻译为对父窗口的WM_COMMAND而直接调用父窗口的点击事件处理函数的!

    2021年4月15日 9:26