Проблема с HDN_ENDTRACK при изменении размера столбца списка

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

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

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

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

ListView_GetColumnWidth на данный момент нужен только для помощи в отладке.

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

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


person Andrew    schedule 15.09.2009    source источник


Ответы (1)


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

person Remy Lebeau    schedule 15.09.2009
comment
HDN_ITEMCHANGED сработало! Мне не потребовалось ничего менять, кроме карты сообщений. Спасибо за вашу помощь! - person Andrew; 16.09.2009
comment
NMHEADER и NMHDR - это две разные структуры. Как можно перекладывать одно на другое? NMHDR не определяет оператора приведения. - person Sahil Singh; 29.05.2017
comment
@SahilSingh Все структуры, доставленные через WM_NOTIFY, начинаются с поля NMHDR. Об этом говорится в документации: lParam: указатель на структуру NMHDR, которая содержит код уведомления и дополнительную информацию. Для некоторых уведомлений этот параметр указывает на более крупную структуру, которая имеет структуру NMHDR в качестве своего первого члена. Указатель на первый член также является указателем на всю структуру, поэтому приведение типа безопасно, если вы используете правильный тип структуры для приведения. - person Remy Lebeau; 29.05.2017
comment
@SahilSingh HDN_ENDTRACK отправляет указатель на NMHDR член структуры NMHEADER согласно документация: lParam: Указатель на NMHEADER структуру, которая содержит информацию об элементе управления заголовком и элементе, разделитель которого был перетащен. - person Remy Lebeau; 29.05.2017