Найти высоту текста и установить цвет фона заголовка элемента управления BS_GROUPBOX - PullRequest
0 голосов
/ 30 апреля 2020

Я разрабатываю элемент управления Group Box, целью которого является автоматическая организация элементов управления, прикрепленных к нему.

Группа Box содержит необязательный текст заголовка, и моя проблема в том, что когда я присоединяю дочерние элементы управления с помощью Y координата установлена ​​в 0 (ноль), текст заголовка будет перекрываться (не видно), например:

image

Я понял, приблизительная высота текста заголовка равна 20, поэтому, если я вручную установлю Y координату на 20, я получу правильный результат:

image

Итак, мой Первый вопрос: есть ли обычный способ получить высоту заголовка Group Box?

Я взглянул на GetSystemMetrics(), но, кажется, для этого нет метрики c.

Второй вопрос, вы можете видеть, что фон текста образца заголовка имеет не тот же светло-синий цвет, а серый.

Нужно ли обрабатывать WM_PAINT, чтобы изменить этот цвет? Я бы хотел этого избежать, так как цвет фона Group Box можно было легко установить, просто обработав WM_ERASEBKGND, но фон заголовка все равно остается серым (не обрабатывается в WM_ERASEBKGND).

Ниже приведен код, который я использовал стереть фон. Это модифицированная версия кода по ссылке в комментариях к коду. Теперь он использует некоторые пользовательские типы, макросы и DirectX, но это не работает для фона заголовка. Я уверен, что мне не хватает чего-то, чтобы нарисовать цвет подписи.

case WM_ERASEBKGND:
{
    /*
    SYMPTOMS
    ========
    When a BS_GROUPBOX style window is created, its background does not erase
    correctly.

    CAUSE
    =====
    The parent window of the BS_GROUPBOX style window has the WS_CLIPCHILDREN style,
    which prevents the parent window from erasing the group box's background.

    RESOLUTION
    ==========
    Subclass the group box window to process the WM_ERASEBKGND message by erasing
    its background. Listed below is a code fragment to demonstrate this procedure.

    STATUS
    ======
    This behavior is by design.

    MORE INFORMATION
    ================
    https://jeffpar.github.io/kbarchive/kb/079/Q79982/
    */

    HRESULT hr = CreateGraphicsResources();
    SmartObject<DrawableWindow> parent = nullptr;

    if (FAILED(hr) || !mParent->IsDrawable())
        return FALSE;

    // Obtain parent window's background color.
    parent = mParent;
    const D2D1::ColorF color = parent->GetBackgroundColor();
    mpBrush->SetColor(color);

    // Other drawing variables
    RECT rect{ };
    HDC hDC = GetDC(mhWnd);
    auto pRender = std::get<1>(mpRenderTarget);
    const D2D1_SIZE_F size = pRender->GetSize();
    const D2D1_RECT_F rectangle = D2D1::RectF(0, 0, size.width, size.height);

    // Erase the group box's background.
    GetClientRect(mhWnd, &rect);
    pRender->BindDC(hDC, &rect);

    pRender->BeginDraw();
    pRender->FillRectangle(&rectangle, mpBrush);
    hr = pRender->EndDraw();

    if (FAILED(hr))
    {
        ShowError(ERR_BOILER, hr);
    }

    ReleaseDC(mhWnd, hDC);

    // Instruct Windows to paint the group box text and frame.
    InvalidateRect(mhWnd, &rect, FALSE);

    // Insert code here to instruct the contents of the group box
    // to repaint as well.

    return TRUE; // Background has been erased.
}

1 Ответ

1 голос
/ 01 мая 2020

Итак, мой первый вопрос: есть ли обычный способ получить высоту заголовка группового блока?

Вы можете использовать GetTextExtentPoint32 для измерения высоты. Обратитесь к разделу « Ширина и высота строки ».

Второй вопрос, вы можете видеть, что фон текста образца заголовка имеет не тот же светло-голубой цвет, а серый.

Для изменения цвета фона заголовка вы можете через дескриптор WM_CTLCOLORSTATIC сообщение установить цвет фона текста элемента управления stati c.

case WM_CTLCOLORSTATIC:
{
    if (GetDlgItem(hDlg, IDC_STATIC4) == (HWND)lParam)
    {
        HDC hdcStatic = (HDC)wParam;
        SetBkColor(hdcStatic, RGB(0, 255, 0));

        if (hbrBkgnd == NULL)
        {
            hbrBkgnd = CreateSolidBrush(RGB(0, 255, 0));
        }
        return (INT_PTR)hbrBkgnd;
    }
}

Результат как это:

enter image description here

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