Проблема с HDN_ENDTRACK при изменении размера столбца списка - PullRequest
1 голос
/ 15 сентября 2009

У меня возникла небольшая проблема при обработке сообщения HDN_ENDTRACKW для пользовательского класса, производного от CListCtrl.

По сути, кажется, что при отправке этого сообщения фактическое значение, в котором хранится ширина столбца, не обновляется до тех пор, пока не будет выполнен мой код обработки.

Код внутри дескриптора просто указывает индикатору выполнения изменить размер, чтобы заполнить ширину столбца с измененным размером. Код:

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

ListView_GetColumnWidth только для того, чтобы помочь с отладкой в ​​данный момент.

Значение по умолчанию для конкретного столбца, который я изменяю, равно 150, когда я изменяю размер столбца в пользовательском интерфейсе, этот метод вызывается, но ширина остается на том же 150, индикатор выполнения не изменяется. Только после повторного изменения размера столбца значение ширины теперь отражает значение столбца после первого изменения размера, а затем метод ResizeProgressBar корректно изменяет размер прогбара, чтобы заполнить столбец, в котором он находится. быть на шаг позади фактической стоимости.

Буду признателен за любую помощь. Приветствия.

1 Ответ

4 голосов
/ 16 сентября 2009

Используйте информацию, которую сам 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.

...