在c ++中向按钮添加事件处理程序

时间:2016-12-15 20:55:13

标签: c++ winapi events button

我在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)中,但我不知道如何或在何处为其提供事件处理程序。有什么帮助吗?

2 个答案:

答案 0 :(得分:4)

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

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

    Handling Messages from a Button

    Notification Messages from Buttons

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

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

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

答案 1 :(得分:2)

单击该按钮时,它会向其父窗口发送BN_CLICKED通知消息(由WM_COMMAND消息携带)。 BN_CLICKED通知代码位于邮件HIWORD的{​​{1}}中。消息的wParam的{​​{1}}具有按钮的ID。消息的LOWORD包含按钮的wParam。这就是在线Windows文档中的全部内容。 Google为lParam

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

BN_CLICKED