我正在使用WIN API编写一些库。我在父窗口WinProc函数中从WC_TABCONTROL类窗口接收WM_NOTIFY消息时遇到问题。 我检查“调试打印”,正确设置了孩子的父。我在某些功能中正确接收WM_COMMAND消息。 我不知道这可能是什么原因。窗口中的选项卡控件看起来很好,并且通过可视选项卡项目选择更改来响应鼠标单击。
例如,当我点击取消选中的标签时,我收到以下消息http://pastie.org/6571509
您可以在此处查看我的WIN Proc功能http://goo.gl/knJ4Z,第346行。
创建标签控件:
ps_ext->d_handle = CreateWindowExW(0, // no extended styles
WC_TABCONTROL, // class name
L"", // default text
WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE, // overlapped window
CW_USEDEFAULT, // default horizontal position
CW_USEDEFAULT, // default vertical position
CW_USEDEFAULT, // default width
CW_USEDEFAULT, // default height
HWND_MESSAGE, // no parent or owner window
(HMENU)WINSEM_Window_NextComponentID(), // class menu used
WINSEM_Window_hInstance,// instance handle
(LPVOID)&ps_ext->s_window); // no window creation data
之后,通过SetParent函数调用设置正确的父级。 Tab的大小调整为:
uFlags = SWP_NOOWNERZORDER | SWP_NOZORDER;
if (SetWindowPos(ps_window->d_handle, NULL, s0_x, s0_y, s0_w, s0_h, uFlags)==0)
{
DWORD dErr;
dErr = GetLastError();
HaveWinLastError_Error(ps_pack, WINSEM_WINDOW_fromerror_windowPos+0, dErr, dErr);
break;
}
显示窗口并单击选项卡控件不会生成父窗口winProc函数收到的WM_NOTIFY消息。
这是我的消息接收代码:
bRet = PeekMessage( &msg, NULL, 0, 0, PM_REMOVE);
if (bRet==FALSE)
{
// no messages received
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
有人对这个问题有任何想法吗?谢谢你的想法和时间。
答案 0 :(得分:3)
我怀疑选项卡控件在创建时会缓存其父窗口,并且永远不会更新它。如果您重新使用它,则消息仍将转到原始父级 - 在这种情况下,这是一个无效窗口。
为什么要将HWND_MESSAGE
作为父母创建呢?为什么不用正确的父母来创建呢?