Когда я пытался выяснить, как определить соответствующую степень горизонтальной прокрутки общего элемента управления 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
? Это сообщение неявно предназначено только для многоколоночных списков? Я не смог найти ничего, что могло бы указать на это в попытках поиска.