Question

Il existe quelques astuces pour obtenir un support en verre pour les formulaires .Net.

Je pense que la source d'origine de cette méthode se trouve ici: http://blogs.msdn.com/tims/archive/2006/04/18/578637.aspx

Fondamentalement:

//reference Desktop Windows Manager (DWM API)
[DllImport( "dwmapi.dll" )]
static extern void DwmIsCompositionEnabled( ref bool pfEnabled );

[DllImport( "dwmapi.dll" )]
static extern int DwmExtendFrameIntoClientArea( IntPtr hWnd, ref MARGINS pMarInset );


//then on form load
//check for Vista
if ( Environment.OSVersion.Version.Major >= 6 )
{
    //check for support
    bool isGlassSupported = false;
    DwmIsCompositionEnabled( ref isGlassSupported );

    if ( isGlassSupported )
        DwmExtendFrameIntoClientArea( this.Handle, ref margins );
...

//finally on print draw a black box over the alpha-ed area
//Before SP1 you could also use a black form background

La dernière étape est le problème - tous les sous-contrôles dessinés sur cette zone semblent également traiter le noir comme un masque de transparence alpha.

Par exemple, une bande d'onglets sur la zone de classe aura un texte transparent.

Y a-t-il un moyen de contourner cela?

Existe-t-il un moyen plus simple de procéder?

Les applications sur lesquelles je travaille doivent fonctionner à la fois sur XP et Vista. Je souhaite qu’elles se dégradent avec élégance. Existe-t-il des meilleures pratiques dans ce domaine?

Était-ce utile?

La solution

Il n’ya vraiment pas de moyen plus facile de faire cela. Ces frameworks ne sont pas encore exposés par .NET Framework, la seule façon de le faire consiste à utiliser une sorte d'interop (ou WPF).

En ce qui concerne l'utilisation des deux versions de Windows, le code que vous possédez devrait convenir, car le moteur d'exécution ne cherche pas le point d'entrée dans la DLL tant que vous n'avez pas appelé la fonction.

Autres conseils

DannySmurf l'a dit. Vous n'avez pas directement & "; Géré &"; accès à ces API via le framework .NET (j’ai essayé moi-même il ya quelques semaines).

J'ai fini par faire quelque chose de méchant. Créé ma propre interface utilisateur avec GDI +. (Boutons, étiquettes arrondies, etc.). Il semble identique quelle que soit la version de Windows. Win.Forms est vraiment moche, mais c’est tout ce que vous avez sur XP & Lt; côté.

Je pense que vous avez oublié de définir la clé de transparence de la zone dans laquelle vous souhaitez être en verre. De l'article,

  

Dans votre application Windows Forms, vous   simplement besoin de définir la TransparencyKey   propriété à une couleur que vous n'utiliserez pas   ailleurs dans l'application (j'utilise   Gainsboro, pour des raisons qui vont   apparait plus tard). Ensuite vous pouvez   créer un ou plusieurs panneaux qui sont   amarré aux marges de votre forme et   définir la couleur de fond du panneau   à la clé de transparence. Maintenant quand tu   appelez DwmExtendFrameIntoClientArea, le   le verre va montrer dans ses marges   partout où vous avez mis quelque chose du   clé de transparence appropriée.

Les appels non gérés ne me dérangent pas - c’est le problème qui consiste à utiliser une boîte noire pour imiter le comportement alpha et son effet sur l’élément noir de certains composants en haut.

Un hack bon marché que vous pouvez utiliser consiste à placer un contrôle transparent du panneau sur votre formulaire et à placer vos contrôles dessus - le noir sera alors noir.

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