0

单击时,我试图从按钮接收消息。但不是从主窗口接收它,我想从一个选项卡控件接收它,它是主窗口的一个子窗口。但我不知道该怎么做。

这是按钮的创建:

deAll = CreateWindowEx(0, "BUTTON", "Disable All", WS_CHILD | BS_PUSHBUTTON, 135, 49, 95, 26, tabs, (HMENU)204, instance, NULL);

显然,tabs 是一个选项卡控件。

这是选项卡控件的创建:

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 制作的。

4

2 回答 2

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);
于 2013-09-03T08:28:51.107 回答
1

如果控件是选项卡(或任何其他控件)的子项,则该选项卡将收到通知消息,例如WM_COMMAND.

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

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

于 2013-09-03T02:19:37.000 回答