Что заставило бы использование LB_GETITEMRECT возвращать только верхние и нижние размеры элемента? - PullRequest
0 голосов
/ 27 января 2019

Когда я пытался выяснить, как определить соответствующую степень горизонтальной прокрутки общего элемента управления Listbox в Win32 API, в конечном итоге я был удовлетворен тем, что адаптировал код из этого вопроса и ответа .

Тем не менее, у меня все еще есть любопытство, которое не исчезнет, ​​почему моя первоначальная техника не сработала. Я пытался использовать LB_GETITEMRECT, так как предполагал, что Listbox знает размеры каждого элемента, потому что, в конце концов, он должен отображать их текст. Мне казалось разумным предположение, что эта информация будет известна контролю.

Вот пример моей первоначальной попытки:

void
SetMaxListBoxExtent(HWND const p_listbox)
{
    int const item_count = SendMessage
    (
        p_listbox,
        LB_GETCOUNT,
        (WPARAM) 0,
        (LPARAM) 0
    );

    int max_item_width = 0;

    for(int i = 0; i < item_count, i += 1)
    {
        RECT item_rect = { 0 };

        // (i indexes the items in the ListBox).
        SendMessage
        (
            p_listbox,
            LB_GETITEMRECT,
            i,
            (LPARAM) &item_rect
        );

        int const item_width = (item_rect.right - item_rect.left);

        if(item_width > max_item_width)
            max_item_width = item_width;
    )

    // I would set horizontal extent of the Listbox here using max_item_width,
    // but this series of operations results in zero extent, so it's useless. 
    // Why is it behaving this way?
}

Когда я приступил к выполнению этого кода, я обнаружил, что top и bottom члены item_rect, казалось, были правильно установлены, но left и right всегда были равны нулю. Теперь меня не удивляет, что left будет нулем, но почему right? Это сообщение неявно предназначено только для многоколоночных списков? Я не смог найти ничего, что могло бы указать на это в попытках поиска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...