2009-08-13 8 views
0

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

Antwort

0

Basierend auf dem Verhalten, ist es sehr wahrscheinlich, dass der Display-Treiber für das TyTN II nicht die Musterpinsel unterstützt. Es sollte GDI wahrscheinlich sagen, dass es nicht unterstützt wird, aber es ist nicht. Dies ist jedoch nicht ungewöhnlich - sehr oft werden OEMs nicht alle Funktionen für den Bildschirmtreiber implementieren (Alpha-Blending ist ein klassisches Beispiel) und der Treiber wird nicht als nicht unterstützt gemeldet.