Странная проблема со стилями границ фиксированной формы в Vista
-
21-08-2019 - |
Вопрос
Мой предыдущий пост об этой проблеме не получил слишком много ответов, он был довольно конкретным и трудным для понимания.Думаю, мне удалось лучше понять проблему, и теперь я считаю, что это проблема Vista...
Проблема заключается во всех типах стилей фиксированных границ, таких как «FixedDialog», «Fixed3D», «FixedSingle» и «FixedToolWindow».На крупных такого не происходит.Эта проблема, как я уже сказал, бывает только на Висте.
Допустим, у вас есть форма с любым из фиксированных стилей границ и вы установили начальное местоположение на 0,0.Здесь вам нужно, чтобы форма была привязана к левому верхнему углу экрана.Это прекрасно работает, если стиль границы формы является одним из значительных вариантов; если он фиксирован, то форма будет немного за пределами рабочей области экрана как слева, так и сверху.
Самое странное, что местоположение формы не меняется, оно по-прежнему равно 0,0, но несколько пикселей формы все равно прорисовываются за пределами рабочей области экрана.
Я тестировал это на XP, но этого не произошло, проблема специфична для Vista.В XP единственной разницей был размер рамки, которая немного менялась в зависимости от стиля.Но форма всегда идеально привязывалась к позиции 0,0.
Если возможно, без найти, сколько пикселей рисуется за пределами рабочей области, а затем добавить это в местоположение формы, есть ли возможный способ исправить или обойти это?
Решение
Если Aero включен, Windows будет лгать вам о размере и положении Fixed*
FormBorderStyle
окна.Следующий код показывает, как получить правильную высоту и смещение сверху такого окна.Подобный метод позволит вам разместить окно в точке (0,0).
[DllImport("dwmapi.dll", PreserveSig = false)]
public static extern bool DwmIsCompositionEnabled();
// When Aero is enabled, and our FormBorderStyle is FixedToolWindow,
// Windows will lie to us about our size and position.
public bool AeroIsMessingWithUs()
{
bool ret = false;
try
{
// check for other Fixed styles here if needed
if (FormBorderStyle == System.Windows.Forms.FormBorderStyle.FixedToolWindow)
{
if (Environment.OSVersion.Version.Major >= 6 && DwmIsCompositionEnabled())
{
// Aero is enabled
ret = true;
}
}
}
catch
{
}
return ret;
}
public int MyWindowHeight()
{
int height = Height;
if (AeroIsMessingWithUs())
{
// there are actually 5 more pixels on the top and bottom
height += 10;
}
return height;
}
public int MyWindowY()
{
int y = Location.Y;
if (AeroIsMessingWithUs())
{
// I'm actually 5 pixels higher than Windows says I am
y -= 5;
}
return y;
}
Другие советы
Причина, по которой я хочу это сделать, заключается в том, чтобы позволить моему приложению, к которому применен скин, включать или отключать этот скин.Все приложение отлично работает со скином, и я пытался реализовать свойство для включения и отключения скина.Проблема по этой теме была одной из проблем, возникающих у меня при отключении скина.Затем я понял, что у меня также есть много других неприятных проблем, с которыми придется столкнуться, если скин отключен.Это означает, что я просто забуду об этой функции и пока оставлю скин всегда включенным.У меня просто сейчас нет времени решать столько вопросов...
Предлагаю закрыть этот вопрос...