要在屏幕上绘制位图的圆形部分,我使用从位图创建的PatternBrush来填充椭圆。我将P / Invoke用于本机函数,因为如果您使用托管函数,CF2.0中似乎存在错误(有关详细信息,请参阅此处:http://social.msdn.microsoft.com/forums/en-US/netfxcompact/thread/e831ea2f-039a-4b92-adb6-941954bee060/)。
以下是我使用的代码:
[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)上使用完全相同,我得到的只是一个白色圆圈。圆圈未填充位图。我检查了设备上每一行的返回码 - 一切都没有报错。用CreateSolidBrush替换CreatePatternBrush比使用颜色填充圆圈更有效。 有人知道为什么图案画笔不起作用吗?
由于 MAIK
答案 0 :(得分:0)
根据行为,Tytn II的显示驱动程序很可能不支持图案画笔。它可能应该告诉GDI它不受支持,但事实并非如此。这并不罕见 - 通常OEM不会为显示驱动程序实现每个功能(alpha混合是一个典型示例),并且没有驱动程序将其报告为不受支持。