c++ - 将事件处理程序添加到 C++ 中的按钮

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

最佳答案

可以通过三种方式检测按钮是否被点击。

  1. 首选方法是添加一个 WM_COMMAND按钮的父窗口的窗口过程的处理程序。单击按钮时,它会发送 BN_CLICKED。通知其父窗口。这在按钮的 MSDN 文档中有描述:

    Handling Messages from a Button

    Notification Messages from Buttons

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

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

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

关于c++ - 将事件处理程序添加到 C++ 中的按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41173176/

相关文章:

multithreading - 来自线程的同步事件 - 内存泄漏

php - 什么是 "MySQL event"?

c++ - 将大十六进制数转换为十进制数

c++ - 如何让一个CTreeCtrl项集中显示?

c++ - shared_ptr 的复制分配导致段错误?

windows - Win32 CreateProcess : When is CREATE_UNICODE_ENVIRONMENT *really* needed?

c++ - 如何在 Win32 中等待窗口完成绘制?

c# - 在 DataGridView 中触发复选框值更改事件

c++ - Qt 中默认不关联 NULL 的指针

java - (将 c# 转换为 Java JNA) - 从 hwnd GetModuleFileName