Неправильная отрисовка элементов CListCtrl
От: brightside90  
Дата: 15.05.15 12:58
Оценка:
Доброго времени суток всем.
У меня есть класс 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);
}

Вот как это выглядит:


Может кто-то знает, куда надо копать? Неделю уже тыкаюсь, но толку — ноль.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.