Question

Mon post précédent sur cette question n'a pas eu trop de réponses et il était un peu spécifique et difficile à comprendre. Je pense que je suis parvenu à mieux comprendre le problème et je crois maintenant qu'il est un problème Vista ...

Le problème se trouve sur tous les types de styles de bordure fixes comme FixedDialog, Fixed3D, FixedSingle et FixedToolWindow. Il ne se produit pas sur les considérables. Ce problème, comme je l'ai dit, il arrive aussi que sur Vista.

Disons que vous avez une forme avec un des styles de bordure fixe et définissez l'emplacement de départ à 0,0. Ce que vous voulez ici est pour la forme à claqua dans le coin supérieur gauche de l'écran. Cela fonctionne très bien si le style de bordure de forme est l'une des options de taille, si elle est fixe, eh bien, la forme sera un peu en dehors de la zone de travail de l'écran à la fois à gauche et en haut.

De plus étrange à ce sujet est que l'emplacement de forme ne change pas, il seuil est 0,0, mais quelques pixels de la forme sont toujours tirée à l'extérieur de la zone d'écran de travail.

Je l'ai testé cela sur XP et il n'a pas eu lieu, le problème est spécifique Vista. Sur XP, la seule différence est la taille de la frontière qui changent un peu entre l'un des styles. Mais la forme est toujours parfaitement cassé en position 0,0.

Si possible, sans de trouver combien de pixels sont en cours d'élaboration en dehors de la zone de travail, puis l'ajouter à l'emplacement de forme, est-il un moyen possible de fixer ou de contourner cela?

Était-ce utile?

La solution

Si Aero est activé, Windows vous mentir sur la taille et la position des fenêtres Fixed* FormBorderStyle. Le code suivant montre comment obtenir la bonne hauteur et haut décalage d'une telle fenêtre. Une technique similaire vous permettra de placer une fenêtre à (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;
}

Autres conseils

La raison pour laquelle je veux faire est de permettre à ma demande, ce qui a une peau, afin d'activer ou de désactiver cette peau. L'ensemble de l'application fonctionne bien avec la peau et je tente de mettre en œuvre une propriété pour activer et désactiver la peau. La question sur ce sujet a été l'un des problèmes que je vais avoir lorsque la peau est désactivé. Je me suis alors rendu compte que j'ai aussi beaucoup d'autres problèmes ennuyeux à traiter si la peau est désactivé. Ce qui signifie que je vais oublier cette fonctionnalité pour l'instant et laisse la peau toujours dans le moment. Je n'ai pas le temps de traiter tant de questions en ce moment ...

pour fermer cette Proposition question ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top