Использование Win7 x64 c ++ с MSVC2010 pro.
Я заметил действительно странную ошибку при использовании Win32 DrawText для рисования текста для пользовательского элемента управления. Я уверен, что это довольно стандартная вещь. Я видел сообщение о чем-то похожем, и решение было использовать один из вызовов TextOut, но это не решило мою проблему.
У меня есть подкласс «Static», используя SetWindowSubClass, и я передаю сообщение wm_paint как:
case WM_PAINT:
{
RECT rect;
PAINTSTRUCT ps;
HDC hdc = BeginPain(hWnd,&ps);
// Create a back buffer to draw to
HDC hdcBack = CreateCompatibleDC(hdc);
GetClientRect(hWnd,&rect);
HBITMAP hbmBackbuffer= CreateCompatibleBitmap(hdc,rect.right,rect.bottom);
size_t iLength = 0;
StringCchLength(LCDText,240,&Length);
SelectObject(hdcBack,hbmBackbuffer);
// Draw a black background to clear previous text
SelectObject(hdcBack,GetSysColour(1)); // Black
Rectangle(hdcBack,rect.left,rect.top,rect.right,rect.bottom);
// Set the font, tranparency and text colour
SelectObject(hdcBack,LCDFont);
SetBkMode(hdcBack,TRANSPARENT);
SetTextColor(hdcBack,0x0000ff00);
DrawText(hdcBack,LCDText,(int)iLength,&rect,DT_LEFT);
// display
BitBlt(hdc,0,0,rect.right,rect.bottom,hdcBack,0,0,SRCCOPY);
// cleanup
DeleteObject(hbmBackbuffer);
DeleteDC(hdcBack);
EndPaint(hWnd,&ps);
break;
}
Это на самом деле работает очень хорошо. Проблема в том, что метка может отображать 3 строки по 40 символов, и после 27 символов в каждой строке следующие символы до конца этой строки на 1 или 2 пикселя выше экрана. Это не сразу видно, но как только вы заметите это, это как бы привлекает ваше внимание.
У кого-нибудь есть идеи или опыт с этим?
PS — Я набрал код вручную на форуме, так что могут быть некоторые глупые опечатки, но реальный код работает правильно, кроме проблемы выравнивания.
С уважением
Дэйв.
Задача ещё не решена.