Доброго времени суток всем.
У меня есть класс CListCtrlEx, который я переопределил от обычного CListCtrl. Этот список имеет стиль 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);
}
Вот как это выглядит:
Может кто-то знает, куда надо копать? Неделю уже тыкаюсь, но толку — ноль.