У меня есть CListCtrlEx, полученный из CListCtrl. В этом списке есть стиль LVS_REPORT, LVS_OWNERDRAWFIXED и LVS_EX_GRIDLINES. Я добавил возможность изменить шрифт для этого списка. Это работает отлично, но есть одна плохая вещь - если я меняю шрифт, и до этого я не был списком прокрутки, тогда все элементы списка перерисовываются правильно, но если бы я прокрутил перед изменением шрифта, то элементы списка перерисовывают немного верхнюю или ниже горизонтальных линий сетки списка, т.е. е. текст элементов перекрывается линиями сетки.Неверный рисунок CListCtrl:
Вот как я меняюсь список шрифты:
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);
}
UPD: три человека нажал кнопку UP, и никто не знает, что это может быть? :(
UPD 1: вот код класса http://pastebin.com/UdXYEpF7 .h http://pastebin.com/2HYe5AEd .cpp
вы шоу очень мало информации о вашем классе, это трудно е выставить что угодно. Из того, что вы описали, не похоже, что есть ошибка. Если вы хотите изменить шрифт в середине программы, прокрутите до нуля и измените шрифт, а затем перейдите к старой позиции. –
Вам не нужно внедрять метод DrawItem() для владельца, нарисованного списком ctrl? – cha
@BarmakShemirani Я добавил свой код класса в вопрос – brightside90