1

CListCtrlから派生したカスタムクラスのHDN_ENDTRACKWメッセージを処理するときに、少し問題が発生します。

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

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

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

ListView_GetColumnWidthは、現時点でのデバッグを支援するためだけにあります。

変更する特定の列のデフォルト値は150です。UIで列のサイズを変更すると、このメソッドが呼び出されますが、幅は同じ150のままで、プログレスバーのサイズは変更されません。列のサイズが再度変更された場合にのみ、幅の値は最初のサイズ変更後の列の値を反映するようになります。次に、ResizeProgressBarメソッドは、プログラムバーのサイズを正しく変更して、列が存在する列を埋めます。これは連続的であり、幅の値は常に次のようになります。実際の値から一歩遅れます。

私はどんな助けにも感謝します。乾杯。

4

1 に答える 1

4

HDN_ENDTRACKそれ自体が提供する情報を使用してください。

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_ITEMCHANGINGまたは、 の代わりにとHDN_ITEMCHANGEDの通知を見てくださいHDN_ENDTRACK

于 2009-09-15T23:10:45.877 に答える