我在 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);
我在 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);
首选方法是将WM_COMMAND
处理程序添加到按钮父窗口的窗口过程中。当单击按钮时,它会向其父窗口发送BN_CLICKED
通知。这在按钮的MSDN文档中有描述:
如果您要将按钮添加到不属于您拥有的父窗口中,则可以使用SetWindowsLongPtr(GWL_WNDPROC)
或SetWindowSubClass()
对父窗口进行子类化,然后可以处理发送到它的消息,例如BN_CLICKED
。这仅在子类化代码运行于拥有父窗口的线程中时才起作用。
或者,您也可以对按钮本身进行子类化,并处理键盘和鼠标消息。
另一种选择是使用SetWinEventHook()
设置事件钩子,请求接收EVENT_OBJECT_INVOKED
事件。在事件回调过程中,提供的hwnd
、ID
和idChild
参数将标识被调用的控件,例如单击的按钮。
BN_CLICKED
通知消息(由WM_COMMAND
消息携带)。BN_CLICKED
通知代码位于消息的wParam
的HIWORD
中。消息的wParam
的LOWORD
具有按钮的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;
}
switch (uMsg)
{
case WM_COMMAND:
switch (wParam)
{
case 1:
// Code
}
}