2009-08-13 14 views
0

Pour dessiner une partie circulaire d'un bitmap à l'écran, j'utilise un PatternBrush créé à partir de l'image bitmap pour remplir une ellipse. J'utilise P/Invoke pour les fonctions natives car il semble y avoir un bug dans CF2.0 si vous utilisez les fonctions gérées (voir ici pour plus de détails: http://social.msdn.microsoft.com/forums/en-US/netfxcompact/thread/e831ea2f-039a-4b92-adb6-941954bee060/).CreatePatternBrush/Ellipse ne fonctionne pas sur le périphérique WinMobile mais sur l'émulateur

Voici le code que j'utilise:

[DllImport("coredll.dll")] 
private extern static int Ellipse(IntPtr hdc, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect); 

[DllImport("coredll.dll")] 
private extern static IntPtr CreatePatternBrush(IntPtr hImage); 

[DllImport("coredll.dll")] 
private extern static IntPtr CreatePen(int fnPenStyle, int nWidth, uint crColor); 

[DllImport("coredll.dll")] 
private extern static IntPtr SelectObject(IntPtr hDC, IntPtr hBrush); 

[DllImport("coredll.dll")] 
private extern static bool DeleteObject(IntPtr hBrush); 

private void DrawCircleOfBitmap(Graphics g, Bitmap bmp, Rectangle rect) 
{ 
    IntPtr hBitmap = bmp.GetHbitmap();  // get HBitmap 
    IntPtr hBrush = CreatePatternBrush(hBitmap); // create the PatternBrush 
    IntPtr hPen = CreatePen(5, 1, 0);  // empty Pen (PS_NULL = 5) 
    IntPtr hDC = g.GetHdc();   // get HDC 
    IntPtr hOldBrush = SelectObject(hDC, hBrush); // select Brush into context 
    IntPtr hOldPen = SelectObject(hDC, hPen); // select Pen into context 
    Ellipse(hDC, rect.Left, rect.Top, rect.Right, rect.Bottom); 
    // Release of native GDI objects 
    SelectObject(hDC, hOldBrush); 
    SelectObject(hDC, hOldPen); 
    DeleteObject(hBrush); 
    DeleteObject(hPen); 
    g.ReleaseHdc(hDC); 
    DeleteObject(hBitmap); 
} 

Cela fonctionne parfaitement sur chaque émulateur (WM6, WM6.1.4, WM6.5), mais si j'utilise exactement la même chose sur mon appareil réel (HTC TyTN II) tout ce que je reçois est un cercle blanc. Le cercle n'est pas rempli avec le bitmap. J'ai vérifié les codes de retour de chaque ligne sur l'appareil - tout ne signale aucune erreur. Remplacer CreatePatternBrush avec CreateSolidBrush fonctionne, qu'il remplit le cercle avec une couleur. Quelqu'un a-t-il une idée de la raison pour laquelle la brosse à motif ne fonctionne pas?

Merci Maik

Répondre

0

Basé sur le comportement, il est très probable que le pilote d'affichage pour le TyTN II ne supporte pas la brosse à motif. Il devrait probablement dire à GDI que ce n'est pas supporté, mais ce n'est pas le cas. Ce n'est pas inhabituel cependant - très souvent, les OEM n'implémenteront pas toutes les fonctionnalités du pilote d'affichage (l'alpha-blending étant un exemple classique) et le pilote ne le signalera pas comme non supporté.