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_ITEMCHANGING
とHDN_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();
}
}
:
HDN_ITEMCHANGED worked!メッセージマップ以外の変更は必要ありませんでした。ご協力いただきありがとうございます! – Andrew
NMHEADERとNMHDRは、2つの異なる構造です。どのようにして1つを別のものにキャストできますか? NMHDRはキャスト演算子を指定しません。 –
@SahilSingh 'WM_NOTIFY'で配信されるすべての構造体は、' NMHDR'フィールドで始まります。これは[documentation](https://msdn.microsoft.com/en-us/library/windows/desktop/bb775583.aspx)に記載されています: "*' lParam': 'NMHDR'構造体へのポインタ通知コードと追加情報**いくつかの通知メッセージでは、このパラメータは、最初のメンバとして 'NMHDR'構造を持つより大きな構造体を指します**。*"最初のメンバへのポインタは、構造体であるため、キャストに正しい構造体型を使用する限り、型キャストは安全です。 –