2009-07-09 8 views
1

У меня есть панель инструментов, разработанная в старых версиях Windows, которая в значительной степени отключена под Vista из-за нового дополнения к окну. С положением границы по умолчанию 4, все на панели инструментов сдвигается на четыре пиксела вниз и вправо, а затем все обрезается на четыре пикселя с нижней и правой сторон. Я не очень забочусь о горизонтальном измерении, но вертикально это означает, что приложение теряет восемь пикселей видимого содержимого.Как панель инструментов Vista может игнорировать или определять настройку заполнения границы?

Под «панели инструментов» Я имею в виду окно, созданное похожее на следующее:

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 «Игнорируйте настройку« border padding », моя граница заполняется 0"?
  2. Если нет, то каким образом приложение определяет, что задано для заполнения границ, чтобы оно могло увеличить его окно вдвое больше?
  3. Для обоих вопросов, как вы это делаете таким образом, чтобы один и тот же исполняемый файл мог работать под XP, Vista, Win2003 и т. Д.?

ответ

1

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

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

+0

+1. Удаление WS_THICKFRAME разрешило это для меня. – Eddie

1

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

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

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

+0

Я понял из этих ссылок, что если я скомпилирую с минимальной версией подсистемы 6.0, то приложение может успешно получить размер границы. Это позволит ему компенсировать границу. Тем не менее, приложение тогда не будет работать ничем раньше, чем Vista, что неприемлемо. Должен быть способ решить это, но я не могу его найти. – Eddie

0

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

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

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

+0

Добро пожаловать. рад, что ты это понял. между подсказкой WS_THICKFRAME и подсказкой подсистемы (которая, хотя она и не помогла вам в конкретном сценарии напрямую, но настолько тонка, что никто ее не понял бы, я рад, что мои комментарии стоили нуля до отрицательных пунктов – 2009-07-10 05:44:31

+0

также, вычитая клиентскую область из неклиентской области, как я предложил ниже, должен всегда работать, если это не так, отправьте мне источник, и я заставлю его работать. обычно разработчикам приложений не нужно чтобы справиться с этим вообще - даже очень тонкая/подсистема - если только они не делают неуклюжие ручные вычисления с заполнением. – 2009-07-10 06:05:24

+0

Отрицательные моменты не от меня. Я еще не голосовал ни на одном из этих ответов. Люди занижают всевозможные глупые и удивительные причины. К сожалению, вам приходится привыкать к этому на StackOverflow и связанных с ним сайтах. – Eddie

 Смежные вопросы

  • Нет связанных вопросов^_^