是否可以从不是主窗口的父窗口接收消息?

时间:2013-09-03 01:24:14

标签: c++ winapi

我正在尝试在点击时从按钮接收消息。 但是我不想从主窗口接收它,而是希望从一个标签控件接收它,它是主窗口的一个子窗口。但我不知道该怎么做。

这是按钮的创建:

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进行的。

2 个答案:

答案 0 :(得分:1)

如果某个控件是制表符(或任何其他控件)的子节点,那么它就是获取WM_COMMAND等通知消息的标签。

最简单的方法是让您的控件成为主窗口中的所有子项,并修复z顺序以使它们显示在选项卡前面(您已经在选项卡控件上设置了WS_CLIPSIBLINGS,您也可以需要)。如果将控件保留为选项卡的子项,则获取通知消息的唯一方法是对选项卡进行子类化。

或者,您可以按照属性表的方式执行此操作,并使用子对话框(具有DS_CONTROL样式集的对话框)来托管选项卡内容。然后,您可以使用单独的对话框过程来处理来自子控件的消息,并且可以轻松显示/隐藏整页控件,而不是单独处理它们。 TCM_ADJUSTRECT消息可用于计算显示子对话框所需的大小/位置。

答案 1 :(得分:1)

tabs窗口是按钮的父窗口,因此当单击按钮时,按钮将向WM_COMMAND/BN_CLICKED窗口发送tabs通知。您必须通过tabsSetWindowLongPtr(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);