2009-09-15 5 views
1

Je rencontre un léger problème lors de la gestion d'un message HDN_ENDTRACKW pour une classe personnalisée dérivée de CListCtrl. Essentiellement, il semble que lorsque ce message est envoyé, la valeur réelle qui stocke la largeur de la colonne n'est pas mise à jour tant que mon code de gestion n'a pas été exécuté.Problème avec HDN_ENDTRACK lors du redimensionnement d'une colonne de liste

Le code à l'intérieur de la poignée indique simplement une barre de progression à redimensionner, pour remplir la largeur de la colonne redimensionnée. Le code:

void ProgListCtrl::OnEndTrack(NMHDR* pNMHDR, LRESULT* pResult) 
{ 
int width = ListView_GetColumnWidth(GetSafeHwnd(), m_nProgressColumn); 
ResizeProgressbar(); 
} 

Le ListView_GetColumnWidth est là juste pour faciliter le débogage au moment.

La valeur par défaut pour la colonne particulière que je modifie est 150, lorsque je redimensionne la colonne dans l'interface utilisateur, cette méthode est appelée mais la largeur reste identique 150, la barre de progression ne se redimensionne pas. Ce n'est que lorsqu'une colonne est redimensionnée que la valeur de largeur reflète maintenant la valeur de la colonne après le premier redimensionnement, la méthode ResizeProgressBar modifie alors correctement la taille du progbar pour remplir la colonne dans laquelle elle est. Ceci est continu, la valeur de largeur semble toujours être un pas derrière la valeur réelle.

Je voudrais avoir de l'aide. À votre santé.

Répondre

3

Utilisez les informations que HDN_ENDTRACK lui-même vous fournit, à savoir:

void ProgListCtrl::OnEndTrack(NMHDR* pNMHDR, LRESULT* pResult) 
{ 
    NMHEADER *pHdr = (NMHEADER*) pNMHDR; 
    if ((pHdr->iItem == m_nProgressColumn) && 
     (pHdr->pitem) && 
     (pHdr->pitem->mask & HDI_WIDTH)) 
    { 
     int width = pHdr->pitem->cxy; 
     ResizeProgressbar(); 
    } 
} 

Vous pouvez également regarder les HDN_ITEMCHANGING et HDN_ITEMCHANGED notifications au lieu de HDN_ENDTRACK.

+0

HDN_ITEMCHANGED travaillé! Cela ne m'obligeait pas à changer autre chose que la carte des messages. Merci de votre aide! – Andrew

+0

NMHEADER et NMHDR sont deux structures différentes. Comment pouvez-vous jeter l'un à l'autre? NMHDR spécifie aucun opérateur de casting. –

+1

@SahilSingh Toutes les structures livrées via 'WM_NOTIFY' commencent par un champ' NMHDR'. Cela est indiqué dans la [documentation] (https://msdn.microsoft.com/en-us/library/windows/desktop/bb775583.aspx): "*' lParam': Un pointeur vers une structure 'NMHDR' qui contient le code de notification et les informations supplémentaires. ** Pour certains messages de notification, ce paramètre pointe vers une structure plus grande qui a la structure 'NMHDR' comme premier membre **. *" Un pointeur vers le premier membre est également un pointeur sur l'ensemble struct, donc le type-cast est sûr tant que vous utilisez le bon type de structure pour le cast. –

Questions connexes