Изменение положения диалоговых элементов управления при изменении размера диалога, чтобы они были согласованы между операционными системами, использующими mfc C ++ - PullRequest
3 голосов
/ 16 декабря 2010

В настоящее время я перемещаю элементы управления диалоговым окном, когда размер диалогового окна изменяется следующим образом:

// Get the list control rect.
CRect listRect;
list->GetWindowRect(&listRect);
ScreenToClient(listRect);

// Get the dialog Rect.
CRect dialogRect;
GetWindowRect(&dialogRect);
ScreenToClient(dialogRect);

list->MoveWindow(listRect.left, listRect.top,
                 dialogRect.right - (2 * listRect.left), dialogRect.bottom - 100);

Это прекрасно работает в Windows XP, но когда я попробовал в Windows Vista, позиционирование было отключено. Я думаю, что это должно быть связано с более крупными границами и заголовками диалогов в Windows Vista, а также с тем фактом, что GetWindowRect имеет следующую запись в документации:

Размеры даны в координатах экрана относительно левого верхнего угла экрана дисплея. Размеры заголовка, границы и полос прокрутки, если они есть, включены.

Итак, мой вопрос: как мне переместить диалоговые элементы управления при изменении размера диалога, чтобы они были согласованы между операционными системами? Спасибо

1 Ответ

2 голосов
/ 16 декабря 2010

Вы должны использовать GetClientRect вместо GetWindowRect, за которым следует ScreenToClient - первый возвращает экстенты клиентской части окна (т. Е. Без границ), тогда как последний извлекает экстенты всего окна, включаяне клиентские части (хотя и в клиентских координатах).

// Get the list control rect.
CRect listRect;
list->GetWindowRect(&listRect);
dlg->ScreenToClient(&listRect);

// Get the dialog Rect.
CRect dialogRect;
dlg->GetClientRect(&dialogRect);

list->MoveWindow(listRect.left, listRect.top, dialogRect.right - (2 * listRect.left), dialogRect.bottom - 100);
...