2009-09-15 42 views
1

CListCtrlから派生したカスタムクラスのHDN_ENDTRACKWメッセージを処理するときに問題が少しあります。リスト列のサイズを変更するときのHDN_ENDTRACKの問題

本質的には、このメッセージが送信されるとき、実際の処理のコードが実行されるまで列の幅を格納する値は更新されないようです。

ハンドル内のコードは、リサイズされた列の幅を埋めるために、プログレスバーにサイズ変更を指示するだけです。 コード:

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

ListView_GetColumnWidthだけで、現時点でのデバッグを支援することがあります。

私が変更している特定の列のデフォルト値は150です。UIの列のサイズを変更するとこのメソッドが呼び出されますが、幅は同じ150のままです。プログレスバーはサイズ変更されません。列のサイズが再度変更されたときにのみ、幅の値が最初のサイズ変更後の列の値を反映するようになり、ResizeProgressBarメソッドはプログバーのサイズを正しく変更して列を埋め込みます。実際の価値よりも一歩遅れていなければなりません。

私は何か助けていただければ幸いです。乾杯。代わりにHDN_ENDTRACKのHDN_ITEMCHANGINGHDN_ITEMCHANGED通知を見て、また

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(); 
    } 
} 

答えて

3

はHDN_ENDTRACK自体はすなわち、あなたに提供される情報を使用してください。

+0

HDN_ITEMCHANGED worked!メッセージマップ以外の変更は必要ありませんでした。ご協力いただきありがとうございます! – Andrew

+0

NMHEADERとNMHDRは、2つの異なる構造です。どのようにして1つを別のものにキャストできますか? NMHDRはキャスト演算子を指定しません。 –

+1

@SahilSingh 'WM_NOTIFY'で配信されるすべての構造体は、' NMHDR'フィールドで始まります。これは[documentation](https://msdn.microsoft.com/en-us/library/windows/desktop/bb775583.aspx)に記載されています: "*' lParam': 'NMHDR'構造体へのポインタ通知コードと追加情報**いくつかの通知メッセージでは、このパラメータは、最初のメンバとして 'NMHDR'構造を持つより大きな構造体を指します**。*"最初のメンバへのポインタは、構造体であるため、キャストに正しい構造体型を使用する限り、型キャストは安全です。 –

関連する問題