Я разрабатываю проект в среде MS Visual Studio 2012, в юникодовской кодировке.
В моей таблице (потомок класса CListCtrl) в методе OnPaint я осуществляю прорисовку линий и вывод текста в её клетки. Вывод текста я пробую осуществить двумя вариантами--либо с помощью функции CDC::ExtTextOut, либо с помощью функции ::DrawText. В первом случае, при использовании функции CDC::ExtTextOut, у меня текст выводится нормально, без посторонних символов, но по левому краю клеток. Во втором случае, при использовании функции ::DrawText, текст выводится посередине клеток, но помимо моего текста выводятся также ещё какие-то непонятные символы.
Как сделать так, чтобы текст в клетках выводился посередине, но нормально, без всяких посторонних символов?
Может быть, мне следует изменить используемый шрифт MS Sans Serif на какой-то другой? Или же мне как-то по-другому надо использовать функцию SelectObject?
Код:
void CListCtrlEx2::OnPaint()
{
int i, j, n, m, nItem, topIndex, nTextLen;
CString myText;
RECT rect, textRect;
UINT nOptions = 0;
LOGFONT mylf;
LPCWSTR pzText;
const MSG *msg = GetCurrentMessage();
DefWindowProc(msg->message,msg->wParam,msg->lParam);
if ((GetStyle() & LVS_TYPEMASK)==LVS_REPORT)
{
CClientDC dc(this);
dc.SetDCBrushColor(RGB(255,0,0));
CBrush *pBrush = dc.GetCurrentBrush();
CHeaderCtrl* pHeader = (CHeaderCtrl*)GetDlgItem(0);
int nColumnCount = pHeader->GetItemCount();
HDC hDC = dc.m_hDC;
nOptions |= ETO_OPAQUE;
CFont *pFont = dc.GetCurrentFont();
pFont->GetLogFont(&mylf);
memset(&mylf,0.0,sizeof(mylf));
mylf.lfHeight = 12;
mylf.lfWidth = 6;
mylf.lfWeight = FW_NORMAL;
wcscpy(mylf.lfFaceName,L"MS Sans Serif");
CFont *pFont2 = new CFont();
pFont2->CreateFontIndirectW(&mylf);
RECT rect;
pHeader->GetClientRect(&rect);
int top = rect.bottom;
GetClientRect(&rect);
int borderx = 0 - GetScrollPos(SB_HORZ);
for (int i=0; i<nColumnCount; i++)
{
borderx += GetColumnWidth(i);
if (borderx>=rect.right) break;
dc.MoveTo(borderx-1,top);
dc.LineTo(borderx-1,rect.bottom);
}
if (!GetItemRect(0,&rect,LVIR_BOUNDS))
return;
int height = rect.bottom - rect.top;
GetClientRect(&rect);
int width = rect.right;
m = flagsVector.size();
if (m==0)
{
for (int i=1; i<=GetCountPerPage();i++)
{
dc.MoveTo(0,top+height*i);
dc.LineTo(width,top+height*i);
}
}
else
{
topIndex = GetTopIndex();
for (int i=1; i<=GetCountPerPage();i++)
{
if ((topIndex+i)<=m)
{
if ((int)(flagsVector.at(topIndex+i-1))==1)
{
dc.MoveTo(0,top+height*i);
dc.LineTo(width,top+height*i);
}
borderx = 0 - GetScrollPos(SB_HORZ);
dc.SelectObject(pFont2);
for (j=0; j<nColumnCount; j++)
{
myText = GetItemText(topIndex+i-1,j);
nTextLen = myText.GetLength();
pzText = myText.GetBuffer();
textRect.top = top + height*(i-1)+1;
textRect.left = borderx+1;
textRect.bottom = top + height*i-1;
textRect.right = borderx + GetColumnWidth(j)-1;
CRect tmpRect(textRect);
dc.ExtTextOut(textRect.left,textRect.top,nOptions,&textRect,myText,nTextLen,NULL); // текст выводится нормально, но не по центру
//::DrawTextW(hDC,myText,nTextLen,&textRect,DT_CENTER); // текст выводится по центру, но выводятся также посторонние символы
borderx += GetColumnWidth(j);
}
dc.SelectObject(pBrush);
}
else
{
dc.MoveTo(0,top+height*i);
dc.LineTo(width,top+height*i);
}
}
}
}
//CListCtrl::OnPaint();
}