2

が に設定されていて、所有する背景色とは異なる背景色を設定するとToolStripStatusLabel発生する問題があります。ToolStripStatusLabels の背景色が境界線の外側でにじみます。プロパティを Flat 以外の設定に設定しようとしましたが、成功しませんでした。BorderSidesAllStatusStripBorderStyle

以下に追加されたスクリーンショットでは、問題を確認できます。ティールの例はBorderStyle = Adjust、長方形の外側に境界線を描画するためのものです。しかし残念なことに、国境は完全に消えてしまいます。

異なる BorderStyles は役に立たない

私が得たいのは、この手描きの例のように出血がまったくないことです.

ここに画像の説明を入力

これは、設定によって、またはの特定のメソッドを継承またはオーバーライドすることによって行うことができますToolStripStatusLabelか? 私はプログラムによる解決策を受け入れていますが、どこから始めればよいかわかりません。ヒントがあれば大歓迎です。


以下のx4rf41TaWの回答を組み合わせて実装されたソリューション

複数の回答を利用して正しい軌道に乗ったので、質問に最終的な解決策を追加しました。

ToolStripStatusLabelクラスを拡張し、OnPaintメソッドをオーバーライドしました。これにより、クラスのプロパティを利用して、通常どおりに描画する可能性がありましたが、にじみはありませんでした。

public partial class ToolStripStatusLabelWithoutColorBleeding : ToolStripStatusLabel
{
    /// <summary>
    /// Bugfix to prevent bleeding of background colors outside the borders.
    /// </summary>
    /// <param name="e"></param>
    protected override void OnPaint(PaintEventArgs e)
    {
        Rectangle borderRectangle = new Rectangle(0, 0, Width - 1, Height - 1);

        // Background
        e.Graphics.FillRectangle(new SolidBrush(BackColor), borderRectangle);

        // Border (if required)
        if (BorderSides != ToolStripStatusLabelBorderSides.None)
            ControlPaint.DrawBorder3D(e.Graphics, borderRectangle, BorderStyle, (Border3DSide)BorderSides);

        // Draw Text if you need it
        e.Graphics.DrawString(Text, Font, new SolidBrush(ForeColor), 0,0);

    }
}
4

2 に答える 2

1

ラベルのプロパティを設定することで問題を解決できるとは思いません。カスタム描画を行う必要があります。

ラベルで何をしようとしているのか正確にはわかりませんが、カスタム描画の最も簡単な方法は、ラベルのペイント イベントを使用することです。

private void toolStripStatusLabel1_Paint(object sender, PaintEventArgs e)
{
    // Use the sender, so that you can use the same event handler for every label
    ToolStripStatusLabel label = (ToolStripStatusLabel)sender;
    // Background
    e.Graphics.FillRectangle(new SolidBrush(label.BackColor), e.ClipRectangle);
    // Border
    e.Graphics.DrawRectangle(
        new Pen(label.ForeColor),  // use any Color here for the border
        new Rectangle(e.ClipRectangle.Location,new Size(e.ClipRectangle.Width-1,e.ClipRectangle.Height-1))
    );
    // Draw Text if you need it
    e.Graphics.DrawString(label.Text, label.Font, new SolidBrush(label.ForeColor), e.ClipRectangle.Location);
}

これにより、ラベルの BackColor をマゼンタに、ForeColor を右のグレーに設定した場合の手描きの例が得られます。

ToolStripStatusLabel クラスを拡張して、onPaint メソッドをオーバーライドすることもできます。コードはほとんど同じですが、カスタム クラスには、BorderColor プロパティなどを追加するなど、より多くのオプションがあります。

于 2015-07-27T14:38:17.857 に答える
1

少し使っControlPaint.DrawBorder3Dてみたところ、BackColor が下と右の線として表示されていることがわかりました。

それで、xfr41の答えと同様に、私は所有者の描画を試みました。私のアイデアは、システムのルーチンを使用することでしたが、クリッピング領域の上に描画長方形を拡大しました。このようにして、間違ったストライプが完全に失われます..

private void toolStripStatusLabel1_Paint(object sender, PaintEventArgs e)
{
    Rectangle r = e.ClipRectangle; 
    Rectangle r2 = new Rectangle(r.X, r.Y, r.Width + 1, r.Height + 1);
    ControlPaint.DrawBorder3D(e.Graphics, r2 , Border3DStyle.SunkenInner);
}
于 2015-07-27T15:03:27.560 に答える