Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[MFC, C++] Zmiana stylu kontrolki przechwyconej za pomocą DDX_Control

Ostatnio zmodyfikowano 2013-07-21 02:09
Autor Wiadomość
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
C/C++
class CVirtualListCtrl
    : public CListCtrl
{
    DECLARE_DYNCREATE( CVirtualListCtrl )
    DECLARE_MESSAGE_MAP()
    virtual void PreSubclassWindow()
    {
        __super::PreSubclassWindow();
        //Żadnen z poniższych zapisów nie zadziała
        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 )
    {
        //INFO: To się w ogóle nie wywołuje, gdy zachodzi DDX_Control
        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/618
http://cpp0x.pl/dokumentacja​/WinAPI/SetWindowPos/620
P-88471
« 1 »
  Strona 1 z 1