Как панель инструментов Vista может игнорировать или определять настройку заполнения границ? - PullRequest
1 голос
/ 09 июля 2009

У меня есть панель инструментов, разработанная в более старых версиях 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 и т. Д.?

Ответы [ 3 ]

1 голос
/ 09 июля 2009

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

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

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

1 голос
/ 09 июля 2009

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

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

0 голосов
/ 10 июля 2009

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

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

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

...