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