我有一个派生自CListCtrl的CListCtrlEx列表。该列表具有LVS_REPORT,LVS_OWNERDRAWFIXED和LVS_EX_GRIDLINES样式。我已经添加了更改此列表字体的可能性。这很好用,但有一件坏事——如果在更改字体之前我没有滚动列表,那么所有列表项都会正确重绘,但如果在更改字体之前我已经滚动了列表,则列表项会在列表网格水平线的上方或下方稍微重新绘制,即项目文本被网格线覆盖。
以下是我更改列表字体的方法:
以下是我更改列表字体的方法:
LRESULT CListCtrlEx::OnSetFont(WPARAM wParam, LPARAM)
{
LRESULT res = Default();
CRect rc;
GetWindowRect(&rc);
WINDOWPOS wp;
wp.hwnd = m_hWnd;
wp.cx = rc.Width();
wp.cy = rc.Height();
wp.flags = SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOOWNERZORDER | SWP_NOZORDER;
SendMessage(WM_WINDOWPOSCHANGED, 0, (LPARAM)&wp);
return res;
}
void CListCtrlEx::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
HDC hDC = ::GetDC(NULL);
CFont* pFont = GetFont();
HFONT hFontOld = (HFONT)SelectObject(hDC, pFont->GetSafeHandle());
CRect rect;
DrawText(hDC, _T(" "), 1, rect, DT_SINGLELINE | DT_CALCRECT);
lpMeasureItemStruct->itemHeight = rect.bottom - rect.top;
SelectObject(hDC, hFontOld);
::ReleaseDC(NULL, hDC);
}
更新: 三个人点击了UP按钮,但没有人知道它是什么? :(
更新1: 这是类代码 http://pastebin.com/UdXYEpF7 .h http://pastebin.com/2HYe5AEd .cpp