Странная проблема с фиксированными стилями границ формы в Vista - PullRequest
0 голосов
/ 14 мая 2009

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

Проблема заключается во всех типах стилей с фиксированной границей, таких как FixedDialog, Fixed3D, FixedSingle и FixedToolWindow. Это не происходит на значительных. Эта проблема, как я уже сказал, это также происходит только в Vista.

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

Что еще более странно, это то, что расположение формы не изменяется, оно равно 0,0, но несколько пикселей формы все еще отрисовываются за пределами рабочей области экрана.

Я проверил это на XP, но этого не произошло, проблема специфична для Vista. В XP единственная разница заключалась в том, что размер границы немного менялся между стилями. Но форма всегда была идеально привязана к позиции 0,0.

Если возможно, без определения того, сколько пикселей рисуется за пределами рабочей области, а затем добавление этого к местоположению формы, есть ли способ исправить или обойти это?

Ответы [ 2 ]

1 голос
/ 22 ноября 2013

Если 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;
}
0 голосов
/ 15 мая 2009

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

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

...