Странная проблема со стилями границ фиксированной формы в Vista

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

Вопрос

Мой предыдущий пост об этой проблеме не получил слишком много ответов, он был довольно конкретным и трудным для понимания.Думаю, мне удалось лучше понять проблему, и теперь я считаю, что это проблема 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;
}

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

Причина, по которой я хочу это сделать, заключается в том, чтобы позволить моему приложению, к которому применен скин, включать или отключать этот скин.Все приложение отлично работает со скином, и я пытался реализовать свойство для включения и отключения скина.Проблема по этой теме была одной из проблем, возникающих у меня при отключении скина.Затем я понял, что у меня также есть много других неприятных проблем, с которыми придется столкнуться, если скин отключен.Это означает, что я просто забуду об этой функции и пока оставлю скин всегда включенным.У меня просто сейчас нет времени решать столько вопросов...

Предлагаю закрыть этот вопрос...

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