2010-12-14 5 views
0

縦に描画されたテキストをサポートするようにSystem.Windows.Forms.Labelクラスを拡張しようとしています。 MyLabelOrientationという新しいプロパティを作成して、ユーザーが水平または垂直に設定できるようにします。ユーザーがこの設定を変更すると、幅と高さの値が入れ替えられ、コントロールの新しい向きにサイズが変更されます。最後に、Labelを描画するためにOnPaint関数をオーバーライドします。C#で派生したラベルコントロールのAutoSizeをオーバーライドします。

このコントロールのAutoSizeプロパティも拡張して、ラベルに含まれるテキストのサイズを自動調整したいと考えています。水平方向については、基本機能が私のためにこれを実装します。縦向きについては、Graphicsオブジェクトを作成し、コントロールの高さをGraphics.MeasureString(Text、Font)から返されたSizeFオブジェクトの幅に設定します。私は以下で使用しているコードの例を見ることができます。

using System; 
using System.ComponentModel; 
using System.Drawing; 
using System.Windows.Forms; 
using System.ComponentModel.Design; 
using System.Windows.Forms.Design; 

public class MyLabel : Label 
{ 
    public enum MyLabelOrientation {Horizontal, Vertical}; 
    protected MyLabelOrientation m_orientation = MyLabelOrientation.Horizontal; 

    [Category("Appearance")] 
    public virtual MyLabelOrientation Orientation 
    { 
     get { return m_orientation; } 
     set 
     { 
      m_orientation = value; 
      int temp = Height; 
      Width = Height; 
      Height = temp; 
      Refresh(); 
     } 
    } 

    private Size ResizeLabel() 
    { 
     Graphics g = Graphics.FromHwnd(this.Handle); 
     SizeF newSize = g.MeasureString(Text, Font); 
     if (m_orientation == MyLabelOrientation.Horizontal) 
      Width = (int)newSize.Width; 
     else 
      Height = (int)newSize.Width; 
    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     Brush textBrush = new SolidBrush(this.ForeColor); 

     if (m_orientation == LabelOrientation.Vertical) 
     { 
      e.Graphics.TranslateTransform(Width, 0); 
      e.Graphics.RotateTransform(90); 
      e.Graphics.DrawString(Text, Font, textBrush, Padding.Left, Padding.Top); 
     } 
     else 
     { 
      base.OnPaint(e); 
     } 
    } 
} 

ただし、AutoSizeをtrueに設定すると、コントロールのサイズの変更が防止または上書きされているようです。つまり、ラベルの向きを変更したいときは、幅や高さを変更できません。私は、AutoSizeが設定されているかどうかをテストし、その向きに応じてコントロールのサイズを調整できるように、この動作をオーバーライドできるかどうか疑問に思っています。

答えて

1

私は前にこれを行っていない、私はあなたが理論的には(newキーワード経由)プロパティ宣言をオーバーライドし、先に進む前に向きを確認することができます信じている:ソリューションはOnResize自体をオーバーライドすることであると考えられる場合は

override public bool AutoSize 
{ 
    set 
    { 
     if(/* orientation is horizontal */) 
     { 
      base.AutoSize = value; 
     } 
     else 
     { 
      // do what you need to do 
     }  
    }  
} 
+0

AutoSizeは仮想プロパティです。新しいものではなく、オーバーライドを使用します。 –

+0

@ハンス:それに応じて更新されました。私はそれがポストする前に仮想だったかどうかをチェックしなかった。私はそれが質問の性質に基づいていないと仮定しました。ありがとうございました。 –

+0

私はこのソリューションを以前に試してみましたが、このようなAutoSizeをオーバーライドするとコントロールは無視します。 AutoSizeは、ソースにかかわらず、幅または高さの変更を防止します。おそらくAutoSize設定を見てそれに応じてサイズを変更する別のものを上書きする必要があります。 – walkingTarget

0

protected override void OnResize(EventArgs e) 
{ 
    if (AutoSize) 
    { 
     // Perform your own resizing logic 
    } 
    else 
     OnResize(e); 
} 
関連する問題