Я разрабатываю элемент управления Group Box, целью которого является автоматическая организация элементов управления, прикрепленных к нему.
Группа Box содержит необязательный текст заголовка, и моя проблема в том, что когда я присоединяю дочерние элементы управления с помощью Y
координата установлена в 0
(ноль), текст заголовка будет перекрываться (не видно), например:
![image](https://i.stack.imgur.com/EwCMz.png)
Я понял, приблизительная высота текста заголовка равна 20, поэтому, если я вручную установлю Y
координату на 20, я получу правильный результат:
![image](https://i.stack.imgur.com/RW8mW.png)
Итак, мой Первый вопрос: есть ли обычный способ получить высоту заголовка 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.
}