2009-08-13 4 views
0

Чтобы нарисовать круговую часть растрового изображения на экране, я использую PatternBrush, созданный из растрового изображения, чтобы заполнить эллипс. Я использую P/Invoke для собственных функций, потому что, похоже, ошибка в CF2.0, если вы используете управляемые функции (см. Здесь для более подробной информации: http://social.msdn.microsoft.com/forums/en-US/netfxcompact/thread/e831ea2f-039a-4b92-adb6-941954bee060/).CreatePatternBrush/Ellipse не работает на устройстве WinMobile, но на эмуляторе

Вот код, я использую:

[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

ответ

0

на основе поведения, это очень вероятно, что драйвер дисплея для TyTN II не поддерживает шаблон кисти. Вероятно, он должен сказать GDI, что он не поддерживается, но это не так. Это не является чем-то необычным - очень часто OEM-производители не будут применять каждую функцию для драйвера дисплея (например, альфа-смешивание является классическим примером), и драйвер не сообщает об этом как неподдерживаемый.