Как панель инструментов Vista может игнорировать или определять настройку заполнения границ?

StackOverflow https://stackoverflow.com/questions/1101653

Вопрос

У меня есть панель инструментов, разработанная для старых версий 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, может справиться с этим?Мои вопросы:

  1. Возможно ли, чтобы панель инструментов сообщала Vista: «Игнорируйте настройку «заполнение границ»;мое заполнение границ равно 0"?
  2. Если нет, то как приложение определяет, какое значение установлено для заполнения границ, чтобы увеличить окно вдвое?
  3. По обоим вопросам: как это сделать, чтобы один и тот же исполняемый файл мог работать под XP, Vista, Win2003 и т. д.?
Это было полезно?

Решение

один из вариантов — поиграть с разными стилями окон, начиная с WS_THICKFRAME.

чтобы выяснить заполнение, попробуйте использовать GetClientRect и GetWindowRect и вычесть одно из другого.

Другие советы

Еще следует отметить отдельно: если вы уже пытаетесь учесть границу окна, используя GetSystemMetrics или что-то подобное, подсистема, в которую вы компилируете, влияет на то, как границы влияют на вашу клиентскую область.

Ссылка на объектмикс пытается это объяснить.Я считаю, что под подсистемой они имеют в виду /subsystem пометить, когда вы связываете .exe, или соответствующий параметр в Visual Studio.

~драгоценности

Ну я разобрался, вроде бы.В моем случае причиной проблемы было использование WS_THICKFRAME при звонке CreateWindowEx(), который мне был не нужен.Ранее этот параметр использовался для центрирования всего по вертикали на панели инструментов.Я предполагаю, что в WinXP (классический вид) и более ранних версиях WS_THICKFRAME предсказуемо добавлено 3 пикселя отступов для всех размеров.

Поэтому я удалил эту опцию и изменил код, чтобы переместить все на три пикселя вниз и вправо.Теперь панель инструментов выглядит одинаково в WinXP и Vista, и у меня нет раздражающих и ненужных (для этой панели инструментов) дополнительных полей.

Это не решает общий случай, но, поскольку мой ответ может помочь другим, кто столкнулся с этим, я решил опубликовать свое решение.Я надеюсь, что это поможет кому-то еще.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top