WinApi, :: TextOut с различными шрифтами (например, Tahoma)

ребята. Я нашел действительно странную проблему. С некоторыми шрифтами (в моей программе есть ChooseFont) :: TextOut (..) рисует текст с небольшим смещением влево от выбранной позиции (что-то вроде 2 pxl). DrawText (..) идет по тому же пути. SetTextAlign НЕ решает эту проблему! GetTextMetrics (..) -> lpOverhead = 0.Ehm … и когда я вычисляю следующую позицию, используя GetExtendPoint32 (..), он также не учитывает это смещение. Мне не помогли ни на крупнейшем российском форуме, ни на MSDN. Помогите пожалуйста, это действительно не простая проблема. Проверьте это, прежде чем ответить. Вот самый простой пример кода.

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
HFONT font =(HFONT) GetStockObject(DEFAULT_GUI_FONT);
switch (message)
{
case WM_COMMAND:
wmId    = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Разобрать выбор в меню:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: добавьте любой код отрисовки...
SelectObject(hdc,font);
::TextOut(hdc,0,0,L"fff",3); //first "f" written not fully
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}

1

Решение

Я нашел проблему. GetCharABCWidths (..). Вернуть ширину A, B, C (beforechar, char, afterchar). Некоторые шрифты имеют A<0, в результате чего TextOut () и DrawText () ehm рисуют текст со смещением влево.

2

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

Других решений пока нет …

По вопросам рекламы [email protected]