6

TabControlカスタム機能でカスタムを描きたい。

これを行うには、Panel クラスを継承し、クラスで描画する OnPaint メソッドをオーバーライドしましたTabRenderer

問題は、TabRenderer視覚スタイルが有効になっている場合にのみ機能することです (で確認できますTabRenderer.IsSupported)。しかし、視覚スタイルが無効になっている場合はどうすればよいですか?

この場合、ControlPaintクラスを使用して視覚スタイルなしでタブを描画することを考えましたが、タブに関連する描画メソッドはありません。基本的には通常のように視覚的に動作するようにしますTabControl

4

2 に答える 2

5

このための API は公開されていないため、自分で描画する必要があります。うまくいけば、これは非ビジュアルスタイルの方法で行うのが比較的簡単です。

ControlPaint.DrawBorder3Dを使用してペインの境界線を描画し、ボタンに次のコードのようなものを使用できます。

int Top = bounds.Top;
int Bottom = bounds.Bottom - 1;
int Sign = 1;

if (tabStrip.EffectiveOrientation == TabOrientation.Bottom)
{
    Top = bounds.Bottom - 1;
    Bottom = bounds.Top;
    Sign = -1;
}

using (Pen OuterLightBorderPen = new Pen(SystemColors.ControlLightLight))
{
    e.Graphics.DrawLine(OuterLightBorderPen, bounds.Left, Bottom, bounds.Left, Top + 2 * Sign);
    e.Graphics.DrawLine(OuterLightBorderPen, bounds.Left, Top + 2 * Sign, bounds.Left + 2, Top);
    e.Graphics.DrawLine(OuterLightBorderPen, bounds.Left + 2, Top, bounds.Right - 3, Top);
}

using (Pen InnerLightBorderPen = new Pen(SystemColors.ControlLight))
{
    e.Graphics.DrawLine(InnerLightBorderPen, bounds.Left + 1, Bottom, bounds.Left + 1, Top + 2 * Sign);
    e.Graphics.DrawLine(InnerLightBorderPen, bounds.Left + 2, Top + 1 * Sign, bounds.Right - 3, Top + 1 * Sign);
}

using (Pen OuterDarkBorderPen = new Pen(SystemColors.ControlDarkDark))
{
    e.Graphics.DrawLine(OuterDarkBorderPen, bounds.Right - 2, Top + 1 * Sign, bounds.Right - 1, Top + 2 * Sign);
    e.Graphics.DrawLine(OuterDarkBorderPen, bounds.Right - 1, Top + 2 * Sign, bounds.Right - 1, Bottom);
}

using (Pen InnerDarkBorderPen = new Pen(SystemColors.ControlDark))
    e.Graphics.DrawLine(InnerDarkBorderPen, bounds.Right - 2, Top + 2 * Sign, bounds.Right - 2, Bottom);
于 2010-04-09T12:45:50.463 に答える
0

これは「そこにある」答えですが、wpfを使用できる可能性はありますか? 上記の回答からわかるように、WPF のように各コントロールが見えない場合、winform でコントロールをカスタマイズするのは面倒です。これは、レンダリングされる内容とその外観を完全に制御することを意味します。

于 2010-04-13T14:35:28.923 に答える