我正在尝试在点击时从按钮接收消息。 但是我不想从主窗口接收它,而是希望从一个标签控件接收它,它是主窗口的一个子窗口。但我不知道该怎么做。
这是按钮的创建:
deAll = CreateWindowEx(0, "BUTTON", "Disable All", WS_CHILD | BS_PUSHBUTTON, 135, 49, 95, 26, tabs, (HMENU)204, instance, NULL);
显然,制表符是制表符控件。
这是选项卡控件的创建:
tabs = CreateWindowEx(0, WC_TABCONTROL, 0, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS, 0, 0, rc.right + 2, rc.bottom - 22, hwnd, NULL, instance, NULL);
而hwnd是主窗口。
有什么想法吗?或者我必须让每个控件成为主窗口的子项? 这是使用C ++中的Win32 API进行的。
答案 0 :(得分:1)
如果某个控件是制表符(或任何其他控件)的子节点,那么它就是获取WM_COMMAND
等通知消息的标签。
最简单的方法是让您的控件成为主窗口中的所有子项,并修复z顺序以使它们显示在选项卡前面(您已经在选项卡控件上设置了WS_CLIPSIBLINGS
,您也可以需要)。如果将控件保留为选项卡的子项,则获取通知消息的唯一方法是对选项卡进行子类化。
或者,您可以按照属性表的方式执行此操作,并使用子对话框(具有DS_CONTROL
样式集的对话框)来托管选项卡内容。然后,您可以使用单独的对话框过程来处理来自子控件的消息,并且可以轻松显示/隐藏整页控件,而不是单独处理它们。 TCM_ADJUSTRECT
消息可用于计算显示子对话框所需的大小/位置。
答案 1 :(得分:1)
tabs
窗口是按钮的父窗口,因此当单击按钮时,按钮将向WM_COMMAND/BN_CLICKED
窗口发送tabs
通知。您必须通过tabs
或SetWindowLongPtr(GWL_WNDPROC)
对SetWindowSubClass()
窗口进行子类化以接收该消息。例如:
WNDPROC prevWndProc;
LRESULT CALLBACK myWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if ((uMsg == WM_COMMAND) && (HIWORD(wParam) == BN_CLICKED))
{
// LOWORD(wParam) is the ID, and lParam is the HWND,
// of the button that was clicked. do something ...
}
return CallWindowProc(prevWndProc, hWnd, uMsg, wParam, lParam);
}
tabs = CreateWindowEx(0, WC_TABCONTROL, 0, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS, 0, 0, rc.right + 2, rc.bottom - 22, hwnd, NULL, instance, NULL);
prevWndProc = (WNDPROC) SetWindowLongPtr(tabs, GWLP_WNDPROC, (LONG_PTR) &myWndProc);
或者:
LRESULT CALLBACK mySubClassProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData)
{
if ((uMsg == WM_COMMAND) && (HIWORD(wParam) == BN_CLICKED))
{
// LOWORD(wParam) is the ID, and lParam is the HWND,
// of the button that was clicked. do something ...
}
return DefSubclassProc(hWnd, uMsg, wParam, lParam);
}
tabs = CreateWindowEx(0, WC_TABCONTROL, 0, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS, 0, 0, rc.right + 2, rc.bottom - 22, hwnd, NULL, instance, NULL);
SetWindowSubclass(tabs, &mySubClassProc, 0, 0);