После некоторых исследований я обнаружил, что вы можете настроить высоту верхнего левого угла текста для достижения вертикального центрирования. Конечно, текст можно обрезать.
Когда длина элемента управления stati c меньше длины текста, текст будет обрезан. Итак, нам нужно рассчитать высоту и длину текста с помощью GetTextExtentPoint32 . Затем DrawText сделает все остальное, DT_WORDBREAK
и DT_CENTER
должны быть добавлены.
См. Мой код для уточнения c деталей:
// Parent Hwnd
HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
0, 0, 800, 600, nullptr, nullptr, hInstance, nullptr);
// Window Process
float nScale_x = 1.0, nScale_y = 1.0;
HWND static_hwnd;
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
RECT rc; // the size of text
RECT rect; // the size of Rectangle
switch (message)
{
case WM_CREATE:
{
static_hwnd = CreateWindow(L"STATIC",
L"Some clipping text example",
WS_CHILD | WS_VISIBLE | WS_TABSTOP | SS_OWNERDRAW,
100, 100, 200, 50,
hWnd,
NULL,
NULL,
NULL);
return 1;
}
case WM_DRAWITEM:
{
LPDRAWITEMSTRUCT pDIS = (LPDRAWITEMSTRUCT)lParam;
if (pDIS->hwndItem == static_hwnd)
{
const wchar_t* text = L"Some clipping text example";
HDC hDC = pDIS->hDC;
RECT rect = pDIS->rcItem;
RECT rc;
int w = rect.right - rect.left;
int h;
if (w >= 180) // the length of "Some clipping text example"
{
h = 16;
}
else if (w < 92) //the length of "Some clipping"
{
h = 16 * 3;
}
else if (w < 180)
{
h = 16 * 2;
}
rc.left = rect.left;
rc.right = rect.right;
rc.top = ((rect.bottom - rect.top) - h) / 2;
rc.bottom = rect.bottom;
HBRUSH bg = (HBRUSH)(::GetStockObject(LTGRAY_BRUSH));
HPEN pn = (HPEN)(::GetStockObject(BLACK_PEN));
::SelectObject(hDC, bg);
//SIZE sz;
//GetTextExtentPoint32(hDC, text, 13, &sz);
::SelectObject(hDC, pn);
::SetTextColor(hDC, RGB(0, 0, 0));
::Rectangle(hDC, rect.left, rect.top, rect.right, rect.bottom);
::DrawText(hDC, text, wcslen(text), &rc, DT_WORDBREAK | DT_CENTER);
}
return TRUE;
}
case WM_SIZE:
{
GetWindowRect(hWnd, &rc);
nScale_x = (rc.right - rc.left) / 800.0;
nScale_y = (rc.bottom - rc.top) / 600.0;
SetWindowPos(static_hwnd, NULL, 100, 100, 200 * nScale_x, 50 * nScale_y, SWP_SHOWWINDOW);
}
...
Отладка:
введите описание изображения здесь