gpt4 book ai didi

c++ - 在按钮程序中处理按钮单击

转载 作者:行者123 更新时间:2023-11-30 00:53:58 25 4
gpt4 key购买 nike

我正在使用以下代码创建一个按钮并更改它的过程:

INT_PTR CALLBACK Proc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
//switch( LOWORD(wParam) )
//switch( HIWORD(wParam) )
switch (message)
{
case 200:
case BN_CLICKED:
MessageBox(NULL,NULL,NULL,NULL);
break;

default: return oldproc(hDlg, message, wParam, lParam);
}
return (INT_PTR)FALSE;
}

HWND handle = CreateWindowEx( NULL,
L"button",
L"TEXT",
WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_DEFPUSHBUTTON,
50,
50,
500,
500,
hWnd,
(HMENU)200,
hInstance,
nullptr);

oldproc = (WNDPROC)SetWindowLong(handle, GWL_WNDPROC, (LONG)Proc);

问题是无论我如何处理 Proc 中的消息,都不会创建任何消息框。

注意:注释最后一行并在窗口过程中像这样处理它:

case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
switch (wmId)
{
case 200:
if(wmEvent == BN_CLICKED)
MessageBox(NULL,NULL,NULL,NULL);
... }

工作正常,但由于我的设计方式,我不能使用它。

有没有办法让它工作?

最佳答案

您看不到消息框,因为 BM_CLICK 不是按钮收到的消息。当您希望按钮模拟点击操作时,它是您发送给按钮的消息。

您正在寻找的是 BN_CLICKED通知代替。但是,BN_CLICKED 包含在 WM_COMMAND 消息中,该消息被发送到按钮的父窗口,而不是按钮本身。因此,您需要子类化父窗 Eloquent 能接收它。

如果这不是一个选项,那么您可以通过 SetWindowsHookEx() 使用特定于线程的消息 Hook ,并让该回调查找发送到按钮父窗口的消息。例如:

HWND hBtn, hBtnParent;
HHOOK hHook;

LRESULT CALLBACK BtnMsgProc(int iCode, WPARAM wParam, LPARAM lParam)
{
if ((iCode == HC_ACTION) && (wParam == PM_REMOVE))
{
MSG *msg = reinterpret_cast<MSG*>(lParam);
if ((msg->hwnd == hBtnParent) &&
(msg->message == WM_COMMAND) &&
(HIWORD(msg->wParam) == BN_CLICKED) &&
(reinterpret_cast<HWND>(msg->lParam) == hBtn))
{
// button has been clicked...
}
}

return CallNextHookEx(hHook, iCode, wParam, lParam);
}

.

hBtnParent = hWnd;
hBtn = CreateWindowEx(
NULL,
L"button",
L"TEXT",
WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_DEFPUSHBUTTON,
50,
50,
500,
500,
hWnd,
(HMENU)200,
hInstance,
NULL);

hHook = SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)BtnMsgProc, NULL, GetCurrentThreadId());
...
UnhookWindowsHookEx(hHook);
DestroyWindow(hBtn);

关于c++ - 在按钮程序中处理按钮单击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15207827/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com