Как панель инструментов Vista может игнорировать или определять настройку заполнения границ?
-
12-09-2019 - |
Вопрос
У меня есть панель инструментов, разработанная для старых версий Windows, которая в значительной степени обрезана в Vista из-за нового заполнения границ окна.При заполнении границ по умолчанию, равном 4, все на панели инструментов смещается на четыре пикселя вниз и вправо, а затем все обрезается на четыре пикселя снизу и справа.Меня не особо волнует горизонтальное измерение, но по вертикали это означает, что приложение теряет восемь пикселей видимого контента.
Под «панелью инструментов» я подразумеваю окно, созданное аналогично следующему:
APPBARDATA AppBarData;
AppBarData.hWnd = CreateWindowEx(WS_EX_TOOLWINDOW | WS_EX_TOPMOST, MAIN_WNDCLASS,
"", WS_POPUP | WS_THICKFRAME | WS_CLIPCHILDREN,
0, 0, 400, TOOLBAR_HEIGHT, NULL, NULL,
AppInstance, NULL);
// more initialization ....
SHAppBarMessage(ABM_NEW, &AppBarData);
Поскольку заполнение границ является элементом конфигурации, который, по-видимому, является новым для Vista, как приложение, работающее как в XP, так и в Vista, может справиться с этим?Мои вопросы:
- Возможно ли, чтобы панель инструментов сообщала Vista: «Игнорируйте настройку «заполнение границ»;мое заполнение границ равно 0"?
- Если нет, то как приложение определяет, какое значение установлено для заполнения границ, чтобы увеличить окно вдвое?
- По обоим вопросам: как это сделать, чтобы один и тот же исполняемый файл мог работать под XP, Vista, Win2003 и т. д.?
Решение
один из вариантов — поиграть с разными стилями окон, начиная с WS_THICKFRAME.
чтобы выяснить заполнение, попробуйте использовать GetClientRect и GetWindowRect и вычесть одно из другого.
Другие советы
Еще следует отметить отдельно: если вы уже пытаетесь учесть границу окна, используя GetSystemMetrics
или что-то подобное, подсистема, в которую вы компилируете, влияет на то, как границы влияют на вашу клиентскую область.
Ссылка на объектмикс пытается это объяснить.Я считаю, что под подсистемой они имеют в виду /subsystem
пометить, когда вы связываете .exe
, или соответствующий параметр в Visual Studio.
~драгоценности
Ну я разобрался, вроде бы.В моем случае причиной проблемы было использование WS_THICKFRAME
при звонке CreateWindowEx()
, который мне был не нужен.Ранее этот параметр использовался для центрирования всего по вертикали на панели инструментов.Я предполагаю, что в WinXP (классический вид) и более ранних версиях WS_THICKFRAME
предсказуемо добавлено 3 пикселя отступов для всех размеров.
Поэтому я удалил эту опцию и изменил код, чтобы переместить все на три пикселя вниз и вправо.Теперь панель инструментов выглядит одинаково в WinXP и Vista, и у меня нет раздражающих и ненужных (для этой панели инструментов) дополнительных полей.
Это не решает общий случай, но, поскольку мой ответ может помочь другим, кто столкнулся с этим, я решил опубликовать свое решение.Я надеюсь, что это поможет кому-то еще.