2008-10-05 7 views
0

Je voudrais utiliser les nouvelles fonctionnalités CMFCListCtrl avec ma classe CListView (et, bien sûr, le nouveau CMFCHeaderCtrl à l'intérieur). Malheureusement, vous ne pouvez pas utiliser Attach() ou SubclassWindow() car la fenêtre SysListView32 est déjà associée à un objet CListView. Dois-je redéfinir OnCmdMsg() de CListView et acheminer tous les messages vers ma propre instance de CMFCListCtrl? (Cela fonctionnera-t-il même?) Ou y a-t-il une solution plus facile/plus propre?Comment utiliser CMFCListCtrl avec CListView?

+0

La solution la plus simple consiste à dériver votre vue à partir de CView et dans OnCreate, créez votre propre contrôle. Gérez votre WM_SIZE de votre fenêtre dérivée de CView et redimensionnez votre contrôle dans la zone client. – skst

Répondre

2

Je hérité de CFormView et laissez-le CMFCListCtrl occupent la boîte de dialogue complète de la vue du formulaire.

+0

Il y a un petit peu plus d'incrustation dans la boîte de dialogue de formulaire et la gestion des changements de taille pour garder la liste occupant toute la boîte de dialogue. Il pourrait être aussi bon de sous-classer CView et de créer CMyListCtrl dans OnCreate(). Je vais devoir voir à quel point je peux rééquiper ça avant d'accepter la réponse. Merci! – skst

+0

Bonne chance, s'il vous plaît laissez-moi savoir si cela a fonctionné pour vous. – fhe

+0

Comme je n'avais besoin que d'un seul contrôle, j'ai dérivé de CView au lieu de CFormView, mais c'est le même principe. – skst

1

CListView n'a pas beaucoup de fonctionnalités. Comme vous l'avez dit dans le commentaire ci-dessus, dérivez simplement votre propre classe d'affichage à partir de CView, gérez WM_SIZE pour redimensionner CMFCListCtrl et vous êtes prêt à partir.

1

Si vous voulez que votre propre CMFCHeaderCtrl (fe m_myHeaderCtrl dérivé de CMFCHeaderCtrl) vous devez remplacer ces trois fonctions dans votre propre CMFCListCtrl

CMFCHeaderCtrl& CMyMFCListCtrl::GetHeaderCtrl() 
{ 
    return m_myHeaderCtrl; 
} 

void CMyMFCListCtrl::InitHeader() 
{ 
    // Initialize header control: 
    m_myHeaderCtrl.SubclassDlgItem(0, this); 
} 


void CMyMFCListCtrl::OnSize(UINT nType, int cx, int cy) 
{ 
    CListCtrl::OnSize(nType, cx, cy); 
    if (myHeaderCtrl.GetSafeHwnd() != NULL) 
    { 
     myHeaderCtrl.RedrawWindow(); 
    } 
} 

Maintenant, vous avez le plein responce dans votre propre myHeaderCtrl définir des fonctions plus (fe lignes multipe en-tête):

OnDrawItem(CDC* pDC, int iItem, CRect rect, BOOL bIsPressed, BOOL bIsHighlighted); 

ou définir votre propre mise en page par

afx_msg LRESULT OnHeaderLayout(WPARAM wp, LPARAM lp); 

Les exemples sont dans le code MFC.