【问题标题】:Add event handler to button in c++将事件处理程序添加到 C++ 中的按钮
【发布时间】:2016-12-15 20:55:12
【问题描述】:

我在c++中创建了一个按钮如下:

HWND btn = CreateWindow(
    "BUTTON",
    "OK",
    WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
    10,
    10,
    100, 
    100,
    hWnd, 
    NULL, 
    (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE),
    NULL);

按钮显示在主窗口 (hWnd) 中,但我不知道如何或在何处为其提供事件处理程序。有什么帮助吗?

【问题讨论】:

  • 在任何人尝试回答之前,先给一些建议——不要在没有一本好书或参考资料的情况下尝试编写 Windows API 代码。 API 过于复杂,无法盲目编写代码。有几本书、参考资料等准确地展示了如何创建窗口和添加事件处理程序。
  • 在 winapi 术语中它是 c 而不是 c++。第二:这不是脚本。你不能只是粘贴并运行。
  • 选择其他内容开始。 stackoverflow.com/questions/20640330/…
  • 开始here 然后得到Petzold's 书。至于你的具体问题,需要处理WM_COMMAND message

标签: c++ winapi events button


【解决方案1】:

有三种方法可以检测被点击的按钮。

  1. 首选方法是将WM_COMMAND 处理程序添加到按钮父窗口的窗口过程。单击按钮时,它会向其父窗口发送BN_CLICKED 通知。按钮的 MSDN 文档中对此进行了描述:

    Handling Messages from a Button

    Notification Messages from Buttons

  2. 如果您将按钮添加到不属于您的父窗口,您可以使用SetWindowsLongPtr(GWL_WNDPROC)SetWindowSubClass() 对父窗口进行子类化,然后您可以处理发送给它的消息,例如@987654333 @。这仅在子类化代码在拥有父窗口的同一线程中运行时才有效。

    或者,您可以子类化按钮本身并处理键盘和鼠标消息。

  3. 另一个选项是使用SetWinEventHook() 设置事件挂钩,请求接收EVENT_OBJECT_INVOKED 事件。在event callback procedure 中,提供的hwndIDidChild 参数将标识正在调用的控件,例如单击的按钮。

【讨论】:

    【解决方案2】:

    单击按钮时,它会向其父窗口发送BN_CLICKED 通知消息(由WM_COMMAND 消息携带)。 BN_CLICKED 通知代码在消息的wParamHIWORD 中。消息的wParamLOWORD 具有按钮的ID。消息的lParam 具有按钮的HWND。这些都在在线 Windows 文档中。谷歌BN_CLICKED

    考虑一下这个伪代码...它来自内存。基本上,将 WM_COMMAND 案例中的内容添加到您已经拥有的窗口过程中:

    LRESULT WINAPI YourWindowProc(HWND hWnd, UINT nMsg, WPARAM wp, LPARAM lp)
    {
       switch (nMsg)
       {
          case WM_COMMAND:
          {
             switch (HIWORD(wp))
             {
                case BN_CLICKED:
                {
                   switch (LOWORD(wp))
                   {
                      case IDC_BUTTON1: // or whatever the ID of your button is...
                      {
                         // do stuff for button...
                         break;
                      }
                   }
                   break;
                }
             }
             break;
          }
    
          default:
             return DefWindowProc(hWnd, nMsg, wp, lp);
       }
    
       return 0;
    }
    

    【讨论】:

      【解决方案3】:

      在倒数第二个参数中,键入 (HMENU)1

      在 WNDPROC 中:

      switch (uMsg)
      {
          case WM_COMMAND:
              switch (wParam)
              {
                  case 1:
                      // Code
              }
      }
      

      【讨论】:

        猜你喜欢
        • 2018-04-23
        • 2013-05-06
        • 1970-01-01
        • 1970-01-01
        • 2015-02-26
        • 2021-02-26
        • 2018-08-24
        • 2012-08-17
        • 2014-05-01
        相关资源
        最近更新 更多