Um einen kreisförmigen Teil einer Bitmap auf dem Bildschirm zu zeichnen, verwende ich ein PatternBrush, das aus der Bitmap erstellt wird, um eine Ellipse zu füllen. Ich benutze P/Invoke zu den nativen Funktionen, weil es einen Fehler in CF2.0 zu geben scheint, wenn Sie die verwalteten Funktionen verwenden (siehe hier für weitere Details: http://social.msdn.microsoft.com/forums/en-US/netfxcompact/thread/e831ea2f-039a-4b92-adb6-941954bee060/). HierCreatePatternBrush/Ellipse funktioniert nicht auf WinMobile-Gerät aber auf Emulator
ist der Code, den ich verwenden:
[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);
}
Das funktioniert perfekt auf jedem Emulator (WM6, WM6.1.4, WM6.5), aber wenn ich genau das gleiche auf meinem realen Gerät (HTC TyTN II) alles, was ich bekomme, ist ein weißer Kreis. Der Kreis ist nicht mit der Bitmap gefüllt. Ich habe die Returncodes jeder Zeile auf dem Gerät überprüft - alles meldet keinen Fehler. Ersetzen CreatePatternBrush mit CreateSolidBrush funktioniert, als es den Kreis mit einer Farbe füllt. Irgendjemand eine Idee, warum der Musterpinsel nicht funktioniert?
Dank Maik