错误的CListCtrl项目绘图

时间:2015-05-14 09:41:47

标签: c++ windows user-interface mfc clistctrl

我有从CListCtrl派生的CListCtrlEx。此列表具有样式LVS_REPORT,LVS_OWNERDRAWFIXED和LVS_EX_GRIDLINES。我添加了更改此列表字体的可能性。这工作正常,但有一件坏事 - 如果我更改字体,之前我没有滚动列表,那么所有列表项重绘正确,但如果我在字体更改之前完成滚动,那么列表项重绘一点点上面或低于列表网格水平线,i。即项目文本与网格线重叠。

以下是我更改列表字体的方式:

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);
}

And here is how it looks like:

UPD: 三个人点击了按钮UP,没人知道它可以是什么? :(

UPD 1: 这是类代码 http://pastebin.com/UdXYEpF7 .h http://pastebin.com/2HYe5AEd .cpp

1 个答案:

答案 0 :(得分:1)

我尝试了你的代码,看起来ListView正在用滚动条交换消息,标题也正在调整大小,这不值得研究。如果你只是将位置设置为零就可以了,你可以保存旧位置并将其放回原位。

void CListCtrlEx::SetupFont(int nSize, const CString& strName)
{
    int saveIndex = GetTopIndex();
    EnsureVisible(0, 0);

    if (m_pFont.get()) m_pFont.get()->DeleteObject();
    VERIFY(m_pFont.get()->CreatePointFont(nSize, strName));
    SetFont(m_pFont.get());

    //This scrolls to bottom, it ensures saveIndex will end up on top 
    //once the next EnsureVisible is called
    if (GetItemCount())
        EnsureVisible(GetItemCount() - 1, 1);

    EnsureVisible(saveIndex, 1);
}