[MFC, C++] Zmiana stylu kontrolki przechwyconej za pomocą DDX_Control
Ostatnio zmodyfikowano 2013-07-21 02:09
DejaVu Temat założony przez niniejszego użytkownika |
[MFC, C++] Zmiana stylu kontrolki przechwyconej za pomocą DDX_Control » 2013-07-21 02:09:43 class CVirtualListCtrl : public CListCtrl { DECLARE_DYNCREATE( CVirtualListCtrl ) DECLARE_MESSAGE_MAP() virtual void PreSubclassWindow() { __super::PreSubclassWindow(); ModifyStyle( LVS_OWNERDATA, 0, SWP_FRAMECHANGED ); ModifyStyle( 0, LVS_OWNERDATA, SWP_FRAMECHANGED ); DWORD dwStyle =::GetWindowLong( m_hWnd, GWL_STYLE ); DWORD dwNewStyle = dwStyle | LVS_OWNERDATA; int iResult =::SetWindowLong( m_hWnd, GWL_STYLE, dwStyle ); ::SetWindowPos( m_hWnd, NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_FRAMECHANGED ); iResult =::SetWindowLong( m_hWnd, GWL_STYLE, dwNewStyle ); ::SetWindowPos( m_hWnd, NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_FRAMECHANGED ); iResult =::SetWindowLong( m_hWnd, GWL_STYLE, dwNewStyle ); ::SetWindowPos( m_hWnd, NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_FRAMECHANGED ); } virtual BOOL PreCreateWindow( CREATESTRUCT & cs ) { return __super::PreCreateWindow( cs ); }
Generalnie rzecz biorąc walczę od jakiegoś czasu z przełączeniem CListCtrl w tryb wirtualny, no i po wielu próbach przyszedł czas na podsumowanie... 1. Nie da rady zmienić niektórych stylów kontrolek przechwyconych za pomocą DDX_Control. 2. Jedyną metodą w przypadku DDX_Control jest ustawienie poprawnych stylów dla kontrolek w resource-ach, w których tworzymy dany wygląd dialogu. 3. Style okna są cache-owane i nie są odświeżane z chwilą wywołania SetWindowLong. 4. Style okna nie ulegają zmianie po wywołaniu ::SetWindowPos z flagą SWP_FRAMECHANGED pomimo, iż w dokumentacji jest napisane, że cache wówczas zostanie przeładowany - dla DDX_Control-a to nie działa. Więcej informacji na temat cache-owanego stylu okna: http://cpp0x.pl/dokumentacja/WinAPI/SetWindowLong/618http://cpp0x.pl/dokumentacja/WinAPI/SetWindowPos/620 |
|
« 1 » |