Элементы во вкладках WinAPI - PullRequest
0 голосов
/ 07 января 2020

Как я могу добавить некоторые элементы (окна) на мою вкладку?

Используйте их:

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

1 Ответ

0 голосов
/ 08 января 2020

Я решил проблему. Поймите, что нужно использовать функцию MoveWindow. Эти вкладки - это не контент, а вложение контента в окно (вкладка). Я только что создал Tab через:

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

Затем я положил несколько окон (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;
        }

Первая вкладка Вторая вкладка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...