0

画面にビットマップの円形部分を描画するには、ビットマップから作成した PatternBrush を使用して楕円を塗りつぶします。マネージ関数を使用すると CF2.0 にバグがあるように見えるため、ネイティブ関数には P/Invoke を使用します (詳細については、こちらを参照してください: 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) でまったく同じものを使用すると、白い円が表示されます。円はビットマップで塗りつぶされません。デバイスのすべての行のリターン コードを確認しましたが、すべてエラーは報告されていません。CreatePatternBrush を CreateSolidBrush に置き換えると、円を色で塗りつぶすよりも機能します。パターン ブラシが機能しない理由を知っている人はいますか?

ありがとうマイク

4

1 に答える 1

0

動作に基づいて、Tytn II のディスプレイ ドライバーがパターン ブラシをサポートしていない可能性が非常に高いです。おそらくサポートされていないことを GDI に通知する必要がありますが、サポートされていません。ただし、これは珍しいことではありません。多くの場合、OEM はディスプレイ ドライバーのすべての機能を実装するわけではなく (アルファ ブレンディングは典型的な例です)、サポートされていないとドライバーに報告させません。

于 2009-09-14T13:03:01.293 に答える