Domanda

Esistono un paio di trucchi per ottenere il supporto Glass per i moduli .Net.

Penso che la fonte originale di questo metodo sia qui: http://blogs.msdn.com/tims/archive/2006/04/18/578637.aspx

Fondamentalmente:

//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

Il problema è proprio questo passaggio finale: tutti i controlli secondari disegnati su quell'area sembrano trattare anche il nero come maschera di trasparenza alfa.

Ad esempio, una tabstrip sopra l'area della classe avrà testo trasparente.

C'è un modo per aggirare questo?

C'è un modo più semplice per farlo?

Le applicazioni su cui sto lavorando devono funzionare sia su XP che su Vista: ho bisogno che si degradino con garbo.Ci sono delle migliori pratiche qui?

È stato utile?

Soluzione

Non esiste davvero un modo più semplice per farlo.Queste API non sono (ancora) esposte da .NET Framework, quindi l'unico modo per farlo è tramite una sorta di interoperabilità (o WPF).

Per quanto riguarda il funzionamento con entrambe le versioni di Windows, il codice in tuo possesso dovrebbe andare bene, poiché il runtime non cerca il punto di ingresso nella DLL finché non chiami effettivamente la funzione.

Altri suggerimenti

L'ha detto Danny Puffo.Non hai accesso "gestito" diretto a queste API tramite il framework .NET (l'ho provato io stesso qualche settimana fa).

Alla fine ho fatto qualcosa di brutto.Ho creato la mia interfaccia utente con GDI+.(Pulsanti, etichette arrotondate, ecc.).Sembra lo stesso indipendentemente dalla versione di Windows.Win.Forms è davvero brutto, ma è tutto ciò che hai sul lato XP <.

Penso che tu abbia dimenticato di impostare il TransparencyKey dell'area che vuoi che sia di vetro.Dall'articolo,

Nella tua Windows Forms Applicazione, devi semplicemente impostare la proprietà TransparencyKey su un colore che non utilizzerai altrove nell'applicazione (uso Gainsboro, per ragioni che diventeranno evidenti in seguito).Quindi è possibile creare uno o più pannelli che sono ancorati ai margini della forma e impostare il colore di sfondo per il pannello sulla chiave di trasparenza.Ora quando chiami DwmextendFrameIntoclientArea, il vetro mostrerà entro i suoi margini ovunque tu abbia impostato qualcosa della chiave di trasparenza appropriata.

Non mi interessano le chiamate non gestite: il problema è l'uso di una scatola nera per imitare il comportamento alfa e l'effetto che ha sull'elemento nero in alcuni componenti in alto.

Un trucco economico che puoi usare è posizionare un controllo Pannello trasparente sul tuo modulo e posizionare i tuoi controlli su di esso: il nero sarà quindi nero.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top