2009-10-03 11 views
3

Créer une fenêtre en verre est aussi simple que d'appeler DwmExtendFrameIntoClientArea dans WPF, mais ce n'est que la moitié de l'astuce. Si vous désactivez aero, et obtenez la peau XP-like où la douleur commence:WPF Fenêtre en verre fallback?

Dans XP (ou désactivé aero) vous devez appeler DrawThemeBackground afin d'obtenir "transparent comme sentir", Internet Explorer fait cela aussi sur son haut, essayez de désactiver aero et regardez ça.

J'ai concocté application qui ne juste que, fallback gracefully when Aero is disabled in Windows.Forms.

La question: Mais le faire dans WPF est différent, le OnRender qui vous donne DrawingContext, comment (OnPaint equiv dans avalon.) on en tire avec l'appel WINAPI DrawThemeBackground?

Répondre

2

Eh bien, DrawThemeBackground a besoin d'un handle de contexte de périphérique, qui est un pur concept Win32 ... WPF n'utilise pas de contextes de périphériques ou de poignées de fenêtre. Cependant, une application WPF est hébergé dans une fenêtre Win32, et vous pouvez récupérer le HWND de cette fenêtre:

using System.Windows.Interop; 

... 

IntPtr hwnd = new WindowInteropHelper(this).Handle; 

Vous pouvez alors obtenir un courant continu pour cette fenêtre en utilisant l'API GetDC:

[DllImport("user32.dll")] 
static extern IntPtr GetDC(IntPtr hWnd); 

... 

IntPtr hdc = GetDC(hwnd); 

Vous devriez alors pouvoir utiliser DrawThemeBackground avec ce DC.

Notez que cela est purement théorique, je ne l'ai pas le tester ...

+0

droit, thats ce que je d'abord essayé aussi avec commencer la peinture, etc. Mais je ne pouvais toujours pas peindre à l'DrawingContext. Mon extension de fenêtre Aero Glass WPF (une entrée de blog avant cela) utilise des astuces similaires, cela fonctionne très bien, mais pas de manipulation de HDC là-bas. Je pense que nous devrions essayer à la place DrawThemeBackground -> System.Windows.Media.Drawing -> System.Windows.Media.DrawingBrush, et utiliser DrawingContext.DrawRectangle (ourDrawThemeBackgroundBrush, ...) dans OnRender override mais je ne m'en suis pas enveloppé autour de cela encore. – Ciantic

+0

Peut-être que vous pourriez créer une image de la taille correcte, obtenir un DC pour cela (avec 'Graphics.FromImage'), appelez' DrawThemeBackground' sur ce DC, et dessinez l'image dans votre DrawingContext ... mais je ne suis pas sûr comment cela fonctionnera, cela pourrait causer des problèmes de performance –

+0

Si nous pouvions créer un objet graphique "propre" où dessiner, et le convertir en dessin ... Je vais essayer ça. Le dessin sur Graphics existant est bien, comme dans mon truc Forms, donc le problème se résume probablement à la conversion en Drawing/DrawingImage. – Ciantic

Questions connexes