Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.189.178.34] |
|
Сообщ.
#1
,
|
|
|
Я разрабатываю проект в среде 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(); } |