C# CreatePatternBrush/Ellipse不在WinMobile设备上工作,但在emulator上工作

C# CreatePatternBrush/Ellipse不在WinMobile设备上工作,但在emulator上工作,c#,windows-mobile,compact-framework,gdi,brush,C#,Windows Mobile,Compact Framework,Gdi,Brush,为了在屏幕上绘制位图的圆形部分,我使用从位图创建的图案笔刷填充椭圆。我对本机函数使用P/Invoke,因为如果您使用托管函数,则CF2.0中似乎存在错误。有关更多详细信息,请参见此处: 以下是我使用的代码: [DllImport("coredll.dll")] private extern static int Ellipse(IntPtr hdc, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect); [DllImpor

为了在屏幕上绘制位图的圆形部分,我使用从位图创建的图案笔刷填充椭圆。我对本机函数使用P/Invoke,因为如果您使用托管函数,则CF2.0中似乎存在错误。有关更多详细信息,请参见此处:

以下是我使用的代码:

[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);
}
这在每个模拟器WM6、WM6.1.4、WM6.5上都非常有效,但是如果我在我的真实设备HTC Tytn II上使用完全相同的模拟器,我得到的只是一个白色圆圈。圆圈中未填充位图。我检查了设备上每一行的返回码——所有东西都报告没有错误。将CreatePatternBrush替换为CreateSolidBrush会起作用,而不是用颜色填充圆。 有人知道为什么图案刷坏了吗

谢谢
Maik

基于该行为,Tytn II的显示驱动程序很可能不支持图案笔刷。它可能应该告诉GDI它不受支持,但它不受支持。但这并不罕见-OEM通常不会实现显示驱动程序alpha混合的所有功能,这是一个典型的示例,并且不会让驱动程序将其报告为不受支持