c - 选项卡中的元素 WinAPI

标签 c winapi tabs common-controls

如何在我的选项卡中添加一些元素(窗口)?

使用这些:

INITCOMMONCONTROLSEX icex;
TCITEMW tie;

WM_CREATE:

icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
icex.dwICC = ICC_TAB_CLASSES;

InitCommonControlsEx(&icex);

Tab = CreateWindowW(WC_TABCONTROLW, NULL, WS_CHILD | WS_VISIBLE, 
            0, 0, 200, 150, hwnd, (HMENU)ID_TABCTRL, NULL, NULL);

CreateWindowW(WC_BUTTONW, L"Add", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
            250, 50, 100, 25, hwnd, (HMENU)BTN_ADD, NULL, NULL);

在 BTN_ADD 中,我创建了两个选项卡。

case BTN_ADD: {
    tie.mask = TCIF_TEXT;
    tie.pszText = (LPWSTR)L"TAB1";
    SendMessageW(Tab, TCM_GETITEMCOUNT, 0, 0);
    SendMessageW(Tab, TCM_INSERTITEMW, 1, (LPARAM)(LPTCITEM)&tie);

    tie.mask = TCIF_TEXT;
    tie.pszText = (LPWSTR)L"TAB2";
    SendMessageW(Tab, TCM_GETITEMCOUNT, 0, 0);
    SendMessageW(Tab, TCM_INSERTITEMW, 2, (LPARAM)(LPTCITEM)&tie);

    SendMessageW(Tab, TCM_GETITEMCOUNT, 0, 0);
    //Add item in tab
    CreateWindowW(WC_BUTTONW, L"BTN", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
    50, 50, 30, 30, Tab, NULL, NULL, NULL);

    break;
}

但是这个按钮添加在hwnd(main)中,当我打开其他选项卡时,我继续看到这个按钮。我需要在某个选项卡中添加内容。

第一个标签

image

第二个标签

image

最佳答案

我解决了一个问题。明白了,那就需要使用MoveWindow函数。这些选项卡不是内容,而是内容附加到窗口(选项卡)上。我刚刚通过以下方式创建了选项卡:

        Tab = CreateWindowW(WC_TABCONTROLW, NULL, WS_CHILD | WS_VISIBLE,
            0, 0, TAB_WEIGHT, TAB_HEIGHT, 
            hwnd, (HMENU)ID_TABCTRL, NULL, NULL);

然后我在Tab(哪个窗口)上放下了几个窗口(ListBox)。

        ListBoxProcesses = CreateWindowEx(WS_EX_CLIENTEDGE, L"ListBox", NULL,
            WS_CHILD | WS_VISIBLE | LBS_STANDARD | LBS_WANTKEYBOARDINPUT,
            0, 50, TAB_WEIGHT - 20, TAB_HEIGHT - 100,
            Tab, (HMENU)ID_LIST, NULL, NULL);

        ListBoxModules = CreateWindowEx(WS_EX_CLIENTEDGE, L"ListBox", NULL,
            WS_CHILD | WS_VISIBLE | LBS_STANDARD | LBS_WANTKEYBOARDINPUT,
            TAB_WEIGHT, 50, TAB_WEIGHT - 20, TAB_HEIGHT - 100,
            Tab, (HMENU)ID_LIST, NULL, NULL);

但是有一个特点。第一个窗口 (ListBoxProcesses) 的水平位置为 0。但第二个窗口 (ListBoxModules) 的水平位置为 TAB_WEIGHT。选择其他选项卡后,我调用 MoveWindow 函数,它会移动我的内容。

顺便说一句,是的,我知道需要使用包含以下内容的 WM_NOTIFY 消息:

switch (wParam)
        {
        case ID_TABCTRL: {
            switch (SendMessageW(Tab, TCM_GETCURFOCUS, 0, 0))
            {
                case FIRST_PAGE: {

                    MoveWindow(ListBoxProcesses, 0, 50, TAB_WEIGHT - 20, TAB_HEIGHT - 100, TRUE);
                    MoveWindow(ListBoxModules, TAB_WEIGHT, 50, TAB_WEIGHT - 20, TAB_HEIGHT - 100, TRUE);

                    break;
                }
                case SECOND_PAGE: {

                    MoveWindow(ListBoxProcesses, -TAB_WEIGHT, 50, TAB_WEIGHT - 20, TAB_HEIGHT - 100, TRUE);
                    MoveWindow(ListBoxModules, 0, 50, TAB_WEIGHT - 20, TAB_HEIGHT - 100, TRUE);

                    break;
                }
                default:
                    break;
            }
            break;
        }
        default:
            break;
        }

First tab Second tab

关于c - 选项卡中的元素 WinAPI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59632520/

相关文章:

c - 餐饮哲学家的变化

c - sleep() 延迟输出直到结束

windows - 检查 Windows 更新是否可用

c++ - 如何使我的 Windows API GUI 代码更加面向对象?

java - 如何通过 Java 使用 Selenium 右键单击​​链接并在新选项卡中打开链接

c - 使用 c 程序在 unix 中使用 fork() 系统调用

改变茶壶的颜色有时不起作用

c# - 在 C# 中捕获应用程序窗口的最佳方法是什么?

java - Netbeans平台: Hide Tabs for just one TopComponent

javascript - 打开新的网络浏览器选项卡,并重复使用同一选项卡