Pregunta

Mi post anterior sobre este tema no tiene demasiadas respuestas y que era un poco específica y difícil de entender. Creo que he logrado comprender mejor el problema y ahora creo que sea un problema de Vista ...

El problema radica en todo tipo de estilos fijos fronterizas como FixedDialog, Fixed3D, FixedSingle y FixedToolWindow. Esto no sucede en los más considerables. Este problema, como he dicho, sino que también ocurre sólo en Vista.

Digamos que usted tiene un formulario con cualquiera de los estilos de los bordes fijos y establecer el punto de partida para 0,0. Lo que se quiere es que aquí el formulario para ser encajado a la esquina superior izquierda de la pantalla. Esto funciona bien si el estilo de forma frontera es una de las opciones de tamaño considerable, si se fija, además, la forma será un poco fuera de la zona de trabajo de la pantalla, tanto a la izquierda y arriba.

Lo que es más extraño de esto es que la ubicación forma no cambia, que es alféizar de 0,0, pero unos pocos píxeles de forma aún se dibujan fuera del área de la pantalla de trabajo.

He probado esto en XP y no fue así, el problema es Vista específico. En XP, la única diferencia era el tamaño del borde que cambiar un poco entre cualquiera de los estilos. Sin embargo, la forma fue siempre perfectamente ajustados a la posición 0,0.

Si es posible, sin encontrar cuántos píxeles se está elaborando fuera de la zona de trabajo y luego añadir que a la ubicación forma, existe una posible forma de corrección o solución esto?

¿Fue útil?

Solución

Si está habilitada la Aero, Windows mentir sobre el tamaño y la posición de Fixed* FormBorderStyle ventanas. El código siguiente muestra cómo obtener la altura correcta y la parte superior offset de tal ventana. Una técnica similar se permitirá colocar una ventana en (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;
}

Otros consejos

La razón por la que quiero hacer esto es permitir que mi solicitud, que tiene una piel aplicada, para activar o desactivar esa piel. toda la aplicación está funcionando muy bien con la piel y yo estaba tratando de poner en práctica una propiedad para activar y desactivar la piel. La cuestión sobre este tema fue uno de los problemas que tengo cuando la piel está desactivada. entonces me di cuenta de que yo también tengo un montón de otros problemas molestos de tratar si la piel está desactivada. Lo que significa que voy a olvidar de esta función por el momento y dejar la piel siempre está activado en el momento. Simplemente no tengo el tiempo para manejar tantos problemas en este momento ...

propone cerrar esta pregunta ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top