1

Buttonから派生したカスタムコントロールでは、ButtonRenderer.DrawButton()がさまざまな状態でボタンを描画します。

Windowsの表示設定が32ビットの色深度に設定されている場合はすべて問題ありませんが、一度16ビットに設定すると、色が通常のWinFormsボタンのいずれかと一致せず、UIで目立ちます、私は本当に欲しくない。

このような最小限のサンプルコードを使用して、これを複製しました。

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);

        Rectangle rect = new Rectangle(10, 10, 250, 120);
        ButtonRenderer.DrawButton(e.Graphics, rect, PushButtonState.Normal);

        rect = new Rectangle(300, 300, 250, 120);
        ControlPaint.DrawButton(e.Graphics, rect, ButtonState.Normal);
    }

これを与える...

レンダリングされたボタン

DrawButtonメソッドによって描画された2つの「ボタン」は、標準のボタンとフォームの背景(変更せずにデフォルトの「コントロール」のままにした)よりもわずかに明るい色になっていることに気付くと思います。 ...十分にズームすると、正しい背景色と別の明るい色のピクセルが交互になっていることがわかります...

ユーザーがリモートデスクトップ(RDP)を使用してアプリケーションに接続しているため、この問題を発見しました。リモートデスクトップ設定を32ビットに強制すると問題は解決しますが、パフォーマンスに影響があると思います。一部のユーザーは比較的低速のブロードバンドリンクを介して海外で作業しています。したがって、32ビットを強制することは避けたいオプションです。 。ディスプレイ設定を16ビットカラーに設定することにより、PCの前でも発生します。

何かアイデアはありますか?ButtonRendererクラスとControlPaintクラスに何らかのバグがありますか、それともこれを回避する方法がありますか?(私は.Net 4.0を使用しています)。

4

1 に答える 1

1

ControlPaint.DrawButtonは、Win32のDrawFrameControlのラッパーです。

ビットマップにレンダリングしてから、グラフィックス表示コンテキストにビットマップを描画します。色のディザリング/近似は、そのビットマップレイヤーで発生しています。さらに実験する時間がなくなったが...

自分でDrawFrameControlを呼び出すだけで、すべてが機能します。

[DllImport("user32.dll", CharSet=CharSet.Auto, ExactSpelling=true)]
public static extern bool DrawFrameControl(IntPtr hDC, ref RECT rect, int type, int state);

[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
    public int left;
    public int top;
    public int right;
    public int bottom;

    public RECT(Rectangle r)
    {
        this.left = r.Left;
        this.top = r.Top;
        this.right = r.Right;
        this.bottom = r.Bottom;
    }
}

protected override void OnPaint(PaintEventArgs e)
{
    if (Application.RenderWithVisualStyles)
         ButtonRenderer.DrawButton(.....)
    else
    {
         var rect = new RECT(new Rectangle(10, 110, 100, 100));
         DrawFrameControl(e.Graphics.GetHdc(), ref rect, 4, 0x10 | (int)ButtonState.Normal);
    }

    base.OnPaint(e);
}

編集:テーマへのオプションの呼び出しを追加しました

于 2012-08-23T22:19:29.927 に答える