기본 목록 컨트롤 페인팅에는 결함이 있습니다. 이 비트 맵에 목록 컨트롤을 그리는 기본 창 프로 시저를 비트 맵을 만든 다음 호출합니다
CMyListCtrl::OnPaint()
{
CRect rcClient;
GetClientRect(rcClient);
CPaintDC dc(this);
CDC dcMem;
dcMem.CreateCompatibleDC(&dc);
CBitmap bmMem;
bmMem.CreateCompatibleBitmap(&dc, rcClient.Width(), rcClient.Height());
CBitmap* pbmOld = dcMem.SelectObject(&bmMem);
dcMem.FillSolidRect(rcClient, ::GetSysColor(COLOR_WINDOW));
this->DefWindowProc(WM_PAINT, (WPARAM)dcMem.m_hDC, (LPARAM)0);
dc.BitBlt(0,0,rcClient.Width(), rcClient.Height(), &dcMem, 0, 0, SRCCOPY);
dcMem.SelectObject(pbmOld);
CHeaderCtrl* pCtrl = this->GetHeaderCtrl();
if (::IsWindow(pCtrl->GetSafeHWnd())
{
CRect aHeaderRect;
pCtrl->GetClientRect(&aHeaderRect);
pCtrl->RedrawWindow(&aHeaderRect);
}
}
다음 비트 맵의 내용을 블리트 : 그러나 간단한 트릭은 자신의 이중 버퍼링 기술을 구현할 수있다 페인트 DC에.
또한 WM_ERASEBKGND에 대한 처리기를 추가해야합니다 :
BOOL CMyListCtrl::OnEraseBkgnd(CDC* pDC)
{
return TRUE;
}
이 항상 다시 그리기 전에 배경을 삭제에서 컨트롤을 중지합니다. 비트 맵에 대한 멤버 변수를 추가하고 창 크기가 변경 될 때만 (다시 작성해야) 항상 OnPaint를 최적화 할 수 있습니다. 비트 맵을 만들면 항상 창의 크기에 따라 비용이 많이 들기 때문입니다.
꽤 잘 작동합니다.
+1. 나는 VB 목록 상자에서도 이것을 보았다. 숨겨진 두 번째 목록 상자가 도움이 될지 잘 모르겠습니다. 그것을 교체하기 위해 깜박 거리면 언제 알 수 있습니까? –
쉽습니다. 항목 및 열 삽입 중에 깜박임이 발생합니다. 마지막 항목이 추가되자 마자 깜박임이 멈 춥니 다. 항목 및 열이 보이지 않는 목록보기에 추가되면 깜박임이 발생할 수 없습니다. 마지막 단계는 숨겨진 내용을 표시하고 보이는 목록보기를 숨기는 것입니다. – wpfwannabe