[MFC, C++] CListCtrl - mrugająca lista / podwójne buforowanie
Ostatnio zmodyfikowano 2013-07-22 02:29
DejaVu Temat założony przez niniejszego użytkownika |
[MFC, C++] CListCtrl - mrugająca lista / podwójne buforowanie » 2013-07-22 02:29:51 Kolejny dzień, kolejne zmagania z MFC... generalnie rzecz biorąc po całym dniu Googlowania i testowania różnych rozwiązań, ostatecznie skleciłem kod, który eliminuje problem migającej/mrugającej listy. Przed zaimplementowaniem poniższego rozwiązania efekt mrugania można było zaobserwować gdy: Inne przypadki również generowały mruganie, ale nie były one aż tak uciążliwe dla oka. #pragma once #include <afxwin.h> #include <afxcontrolbars.h>
class CListCtrlNoFlicker : public CListCtrl { DECLARE_DYNCREATE( CListCtrlNoFlicker ) DECLARE_MESSAGE_MAP() public : afx_msg BOOL OnEraseBkgnd( CDC * _pDC ); afx_msg void OnPaint(); };
#include "ListCtrlNoFlicker.hpp"
IMPLEMENT_DYNCREATE( CListCtrlNoFlicker, CListCtrl )
BEGIN_MESSAGE_MAP( CListCtrlNoFlicker, CListCtrl ) ON_WM_ERASEBKGND() ON_WM_PAINT() END_MESSAGE_MAP()
BOOL CListCtrlNoFlicker::OnEraseBkgnd( CDC * _pDC ) { return TRUE; }
void CListCtrlNoFlicker::OnPaint() { CRect rcClient; GetClientRect( rcClient ); CHeaderCtrl * pCtrl = GetHeaderCtrl(); if( pCtrl &&::IsWindow( pCtrl->GetSafeHwnd() ) ) { CRect rcHeaderRect; pCtrl->GetClientRect( & rcHeaderRect ); rcClient.top += rcHeaderRect.Height(); } if( rcClient.IsRectEmpty() ) return; CPaintDC dc( this ); CMemDC dcMem( dc, rcClient ); dcMem.GetDC().FillSolidRect( rcClient,::GetSysColor( COLOR_WINDOW ) ); DefWindowProc( WM_PAINT,( WPARAM ) dcMem.GetDC().m_hDC,( LPARAM ) 0 ); }
Powyższy kod nie rozwiązuje jeszcze problemu mrugającego CHeaderCtrl, choć w istotny sposób go ogranicza, więc raczej tego tematu drążyć na razie nie będę :P |
|
« 1 » |