在C++中为按钮添加事件处理程序

3

我在 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);

5
在任何人尝试回答之前,提供一些建议--不要在没有好的书籍或参考资料的情况下编写Windows API代码。该API过于复杂,不可以盲目编写代码。有几本书籍、参考资料等可以详细展示如何创建窗口并添加事件处理程序。 - PaulMcKenzie
在WinAPI术语中,它是C而不是C ++。其次:这不是脚本。你不能只是粘贴并运行。 - Алексей Неудачин
选择其他的开始。https://dev59.com/-mIj5IYBdhLWcg3wGReM - Алексей Неудачин
3
这里开始,然后获取Petzold的书籍。至于您的具体问题,您需要处理WM_COMMAND消息 - AlwaysLearningNewStuff
3个回答

6
有三种方法可以检测按钮被点击。
  1. 首选方法是将WM_COMMAND处理程序添加到按钮父窗口的窗口过程中。当单击按钮时,它会向其父窗口发送BN_CLICKED通知。这在按钮的MSDN文档中有描述:

    处理来自按钮的消息

    按钮的通知消息

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

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

  3. 另一种选择是使用SetWinEventHook()设置事件钩子,请求接收EVENT_OBJECT_INVOKED事件。在事件回调过程中,提供的hwndIDidChild参数将标识被调用的控件,例如单击的按钮。


3
当按钮被点击时,它会向其父窗口发送一个BN_CLICKED通知消息(由WM_COMMAND消息携带)。BN_CLICKED通知代码位于消息的wParamHIWORD中。消息的wParamLOWORD具有按钮的ID。消息的lParam具有按钮的HWND。这些都在在线Windows文档中。Google搜索BN_CLICKED

考虑下面这个伪代码...它是从记忆中得来的。基本上,将WM_COMMAND case中的内容添加到您已经拥有的窗口过程中:

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;
}

0
在倒数第二个参数中,输入(HMENU)1
在 WNDPROC 中:
switch (uMsg)
{
    case WM_COMMAND:
        switch (wParam)
        {
            case 1:
                // Code
        }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接