Bob*_*nes 5 c user-interface winapi
我一直在阅读有关子类化的MSDN文档,我已成功处理子类中的事件
我的问题是将消息传递回原始的WndProc.
例如,如果我有一个窗口,具有子类别组框控件和一个按钮作为该组框的子项,我想处理原始窗口过程中的按钮事件,而不是子类化的组框过程.
基本上,我想要一个空的子类过程:
LRESULT FAR PASCAL SubClassFunc(HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
return CallWindowProc(oldProc, hwnd, uMsg, wParam, lParam);
}
Run Code Online (Sandbox Code Playgroud)
oldProc的位置是:
FARPROC oldProc = (FARPROC)SetClassLong(group_box, GCL_WDPROC, (DWORD)SubCLassFunc);
Run Code Online (Sandbox Code Playgroud)
窗口和组框和按钮的位置是:
HWND window = CreateWindowEx(
WS_EX_WINDOWEDGE,
appname,
TEXT("Subclass Test"),
WS_VISIBLE |WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
300,
400,
NULL,
NULL,
hInstance,
0);
HWND group_box = CreateWindowEx(
0,
TEXT("BUTTON"),
TEXT("Group Box"),
WS_CHILD | WS_VISIBLE | BS_GROUPBOX,
8,
8,
275,
350,
window,
NULL,
hInstance,
0);
HWND push_button = CreateWindowEx(
0,
TEXT("BUTTON"),
TEXT("Push Button"),
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_VCENTER,
50,
100,
100,
25,
group_box,
(HMENU)PUSH_BUTTON,
hInstance,
0);
Run Code Online (Sandbox Code Playgroud)
我可以处理SubClassFunc中的按钮事件,但我想要做的是将它们传递回窗口WndProc.似乎CallWindowProc没有这样做,或者我对CallWindowProc的工作方式可能完全错误.
按钮通知将发送到按钮的父级,即组框。因为您已经对组框进行了子类化,所以您SubClassFunc
会收到这些消息,然后使用CallWindowProc
.
如果您希望按钮通知转到父窗口(即window
在您的代码中),您可以将按钮的父窗口设置为window
而不是group_box
,或者使用PostMessage
from insideSubClassFunc
将消息(WM_COMMAND
或WM_NOTIFY
根据需要)发布到window
。
另外,我发现您正在使用SetClassLong
设置窗口过程。其作用是替换整个BUTTON
类的窗口过程,但仅限于随后创建的窗口。BUTTON
调用之前创建的任何窗口都SetClassLong
不会被子类化。您可能需要考虑使用SetWindowLong
子类化单个窗口而不是整个类。
编辑:组框的原始窗口过程不会WM_COMMAND
向其父级发送消息。Charles Petzold 的《Windows 编程》一书中对此进行了解释:
具有样式的组框
BS_GROUPBOX
是按钮类中的一个奇怪的东西。它既不处理鼠标或键盘输入,也不WM_COMMAND
向其父级发送消息。
window
您应该会发现,即使您没有对组框进行子类化,按钮通知也不会到达。
我希望这有帮助!