TabControl обрезает клиентскую область при отображении стрелок переполнения - PullRequest
1 голос
/ 20 июля 2011

Эта ошибка появляется только с общим контролем v6 (тема включена) на XP (кажется, работает на 7 и 2008). Интересно, кто-то еще мог видеть эту ошибку функцию.

Если у вас есть однострочный TabControl с множеством вкладок, пара стрелок должна появиться, если недостаточно места для отображения всех вкладок. Это все хорошо, за исключением того, что клиентская область также обрезана, что совсем не приятно.

Я что-то пропустил? Я играл со стилем окна tabcontrol, но пока не повезло.

Чтобы проиллюстрировать это, на самом деле лучше всего увидеть это в действии:

#define UNICODE
#include <windows.h>
#include <commctrl.h>
#include <stdio.h>

LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM);

HWND htab, hbut;

int WINAPI WinMain (HINSTANCE instance,
                    HINSTANCE previnst,
                    LPSTR args,
                    int wndState)
{
    int i;
    MSG messages;
    WNDCLASSEX wincl = {
        .hInstance = instance, .lpszClassName = L"WindowsApp",
        .lpfnWndProc = WindowProcedure, .style = CS_DBLCLKS, .cbSize = sizeof wincl,
        .hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1)
    };

    InitCommonControls();

    wincl.hIcon   = LoadIcon(NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor(NULL, IDC_ARROW);

    if (!RegisterClassEx (&wincl))
        return 0;

    HWND hwnd = CreateWindow(L"WindowsApp", L"Windows App", WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, 544, 375, HWND_DESKTOP, NULL, instance, NULL);

    htab = CreateWindowEx(WS_EX_CONTROLPARENT, WC_TABCONTROL,
        L"MyTab", WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE, 10, 10, 514, 325, hwnd,
        (HMENU) 10, instance, NULL);

    hbut = CreateWindow(
        WC_BUTTON, L"My nice button that is clipped", WS_CHILD | WS_VISIBLE | WS_TABSTOP,
        10, 30, 494, 285, htab, (HMENU) IDOK, instance, NULL
    );

    for (i = 0; i < 10; i ++)
    {
        WCHAR  myBuf[100];
        TCITEM tc = {.mask = TCIF_TEXT, .pszText = myBuf};
        wsprintf(myBuf, L"My super tab %d", i + 1);
        TabCtrl_InsertItem(htab, i, &tc);
    }

    SendMessage(hbut, WM_SETFONT, (LPARAM) GetStockObject(DEFAULT_GUI_FONT), FALSE);
    SendMessage(htab, WM_SETFONT, (LPARAM) GetStockObject(DEFAULT_GUI_FONT), FALSE);

    ShowWindow(hwnd, wndState);

    while (GetMessage (&messages, NULL, 0, 0))
    {
        TranslateMessage(&messages);
        DispatchMessage(&messages);
    }
    return messages.wParam;
}

LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    RECT r;
    switch (message) {
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    case WM_SIZE:
        GetClientRect(hwnd, &r);
        MoveWindow(htab, 10, 10, r.right-20, r.bottom - 20, TRUE);
        MoveWindow(hbut, 10, 30, r.right-40, r.bottom - 60, TRUE);
        break;
    case WM_COMMAND:
        break;
    default:
        return DefWindowProc (hwnd, message, wParam, lParam);
    }
    return 0;
}

1 Ответ

0 голосов
/ 20 июля 2011

К сожалению, я не могу это проверить (у меня Win7), но согласно http://msdn.microsoft.com/en-us/library/hh298367%28v=VS.85%29.aspx вам нужно иметь братьев и сестер клипов на вкладке, а также в родительском окне.Вы также можете попробовать использовать прямое сообщение регулировки вкладки, чтобы получить позиции для вашей кнопки.

...