Win API Выравнивание текста на кнопке

Есть ли способ центрировать текст внутри кнопки как по горизонтали, так и по вертикали?

case WM_DRAWITEM:
{
LPDRAWITEMSTRUCT Item;
Item = (LPDRAWITEMSTRUCT)lParam;

SelectObject(Item->hDC, CreateFont(17, 0, 0, 0, FW_NORMAL, 0, 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, "Arial Black"));

FillRect(Item->hDC, &Item->rcItem, CreateSolidBrush(0xE0E0E0) );

SetBkMode(Item->hDC, 0xE0E0E0);
SetTextColor(Item->hDC, RGB(255,255,255));

int len;
len = GetWindowTextLength(Item->hwndItem);
LPSTR lpBuff;
lpBuff = new char[len+1];
GetWindowTextA(Item->hwndItem, lpBuff, len+1);
DrawTextA(Item->hDC, lpBuff, len, &Item->rcItem, DT_CENTER);
}
break;

0

Решение

Вы уже используете DT_CENTER флаг для центрирования текста по горизонтали. DrawText() также имеет DT_VCENTER а также DT_SINGLELINE Флажки для центрирования текста по вертикали. Просто объедините флаги вместе.

Кроме того, у вас есть утечки ресурсов и памяти. Вы протекаете HFONT от CreateFont(), HBRUSH от CreateSolidBrush()и текстовый буфер из new[], Вы должны освободить их всех, когда вы закончите, используя их.

Попробуй это:

case WM_DRAWITEM:
{
LPDRAWITEMSTRUCT Item = reinterpret_cast<LPDRAWITEMSTRUCT>(lParam);

HFONT hFont = CreateFont(17, 0, 0, 0, FW_NORMAL, 0, 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, TEXT("Arial Black"));
HFONT hOldFont = (HFONT) SelectObject(Item->hDC, hFont);

HBRUSH hBrush = CreateSolidBrush(RGB(0xE0, 0xE0, 0xE0));
FillRect(Item->hDC, &Item->rcItem, hBrush);
DeleteObject(hBrush);

SetBkMode(Item->hDC, TRANSPARENT); // <-- 0xE0E0E0 was not a valid mode value!
SetTextColor(Item->hDC, RGB(255,255,255));

int len = GetWindowTextLength(Item->hwndItem) + 1;
LPTSTR lpBuff = new TCHAR[len];
len = GetWindowText(Item->hwndItem, lpBuff, len);
DrawText(Item->hDC, lpBuff, len, &Item->rcItem, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
delete[] lpBuff;

SelectObject(Item->hDC, hOldFont);
DeleteObject(hFont);
}
break;
1

Другие решения

От https://docs.microsoft.com/en-us/windows/desktop/Controls/button-styles

Наверное, нужно использовать BS_OWNERDRAW делать то, что вы описываете.

-1