【发布时间】:2011-10-30 20:59:30
【问题描述】:
我在纯 Windows API 中制作了一个自定义拆分器控件。它由 4 个控件组成:主容器、拆分器和 2 个窗格。
现在我需要挂钩到 windows 过程,以便找出其中一个子控件何时移动或调整大小,因此我使用了 SetWindowsHookEx。我的钩子程序中的 WM_SIZE 消息很好,但没有从我的拆分器的子窗口中捕获任何 WM_MOVE 消息。
我尝试将子窗口添加到 Groupbox(我知道这不是它们应该使用的方式),只是为了查看钩子过程是否捕获了 WM_MOVE 消息,他们是。
那么我在这里错过了什么?我需要在拆分器窗口过程中添加什么以便发送那些 WM_MOVE?还是我的错误在其他地方?
PS:SetWindowPos 确实适用于那些子窗口,只是没有捕捉到 WM_MOVE。
编辑:根据要求,这里是拆分器窗口类的完整代码:http://pastebin.com/Lgvb0Vfv
下面是重要的代码部分:
LRESULT WINAPI AnchorProc(int nCode, WPARAM wParam, LPARAM lParam) {
CWPRETSTRUCT* theMessage = (CWPRETSTRUCT*)lParam;
if (theMessage->message == WM_MOVE) printf ("!");
}
在主窗口的 WM_CREATE 之后的某个时间:
SetWindowsHookEx(WH_CALLWNDPROCRET,AnchorProc,NULL,GetCurrentThreadId());
// groupbox
HWND gb = CreateWindowEx(0,"button",NULL,BS_GROUPBOX|WS_CHILD,0,0,200,200,hwndMain,0,hInst,NULL);
HWND but = CreateWindowEx(0,"button",NULL,BS_PUSHBUTTON|WS_CHILD,0,0,40,40,gb,0,hInst,NULL);
// custom control
HWND split = CreateWindowEx(0,"FSplitterClass",NULL,WS_CHILD,200,0,200,200,hwndMain,0,hInst,NULL);
HWND pane1 = (HWND)SendMessage(split,WM_SPGETPANE,0,0);
HWND but1 = CreateWindowEx(0,"button",NULL,BS_PUSHBUTTON|WS_CHILD,0,0,40,40,pane1,0,hInst,NULL);
SetWindowPos(but, NULL, 1,1,0,0,SWP_NOSIZE|SWP_NOZORDER); // triggers WM_MOVE
SetWindowPos(but1, NULL, 1,1,0,0,SWP_NOSIZE|SWP_NOZORDER); // doesn't
【问题讨论】:
-
呃,你为什么不写你自己的window proc?
-
@Hans,您想知道控件何时移动的原因有很多。就我而言,我正在实施 Anchors。