5

独自のモジョネスを追加するには、ラベル コントロールをゼロから再発明/再作成する必要があります。はい、私はあなたが考えていることを知っています (そして、あなたがそう考えていないなら、そうすべきではありませんか?)。

誰かが私を正しい方向に向けることができますか?

ありがとうございました。

ラベルを再作成する全体的な目的は、ラベルが画面にどのように描画されるかを完全に制御し、KeyDown イベント ハンドラーも使用できるようにすることです。たとえば、ユーザーは、TextBox コントロールのコンテンツを編集するのと同じ方法で、ラベルのコンテンツを編集できます。

また、TextBox コントロールを単純に使用することはできません。目的の結果を得るには、それ以上の作業ではないにしても、ほとんどの作業が必要になるからです。

4

5 に答える 5

5

現在のものを拡張しないのはなぜですか?

class MyMojoLabel : Label // Kind of thing

于 2010-04-28T11:19:07.367 に答える
3

A good starting point would maybe to understand how Microsoft implemented the label.

To get a better in-depth look you should take a look with Reflector into the class or debugging the source code of the Label control.

于 2010-04-28T11:43:40.300 に答える
2

Controlから継承するクラスを作成します。SetStyle()呼び出しを使用して、ユーザーのペイントとダブルバッファリングを有効にし、OnPaint()やその他の必要なメソッドをオーバーライドします。

class MyLabel : System.Windows.Forms.Control
{
    public MyLabel()
    {
        this.SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true);
    }

    protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
    {
        base.OnPaint(e);
        ControlPaint.DrawBorder3D(  e.Graphics, this.ClientRectangle, Border3DStyle.Etched, Border3DSide.All);
        e.Graphics.DrawString(this.Text, this.Font, Brushes.Red, 0, 0);
    }
}
于 2010-04-28T13:09:08.847 に答える
2
public class MyLabel : System.Windows.Forms.Label
{
    protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
    {
        base.OnPaint(e);
        // or leave base out

        // you would determine these values by the length of the text
        e.Graphics.DrawEllipse(new System.Drawing.Pen(System.Drawing.Color.Red), 
                               0, 0, 50, 12);

    }

    protected override void OnKeyDown(System.Windows.Forms.KeyEventArgs e)
    {
        base.OnKeyDown(e);

        // although a label has a KeyDown event I don't know how it would 
        // receive focus, maybe you should create a text box that looks
        // like a label
    }
}

これはどう?

于 2010-04-28T13:08:12.400 に答える
1

独自のラベル コントロールを作成するのは簡単です。Control から始めて、OnPaint() をオーバーライドするだけです。バイトにしようとしているのは、それをフォーカス動作も持つコントロールに変えることです。また、ユーザーがテキストを編集できるようにします。完了するまでに、TextBox コントロールを再発明したことになります。これは見た目よりもはるかに難しいです。

最初に焦点を合わせることに集中してください。これが最も難しい問題です。ユーザーが頻繁にコントロールにフォーカスを当てたいと思うことはほとんどありません。ダブルクリックのような秘密の握手かもしれません。検出したら、TextBox コントロールを作成してラベルの前に配置できます。フォーカスを失ったら破棄し、ラベルの Text プロパティを更新します。または、小さな編集ダイアログを表示する単純なコンテキスト メニュー。

ダブルクリックによる編集アプローチを使用する例:

using System;
using System.Windows.Forms;

class MyLabel : Label {
  private TextBox mEditor;
  protected override void OnDoubleClick(EventArgs e) {
    if (mEditor == null) {
      mEditor = new TextBox();
      mEditor.Location = this.Location;
      mEditor.Width = this.Width;
      mEditor.Font = this.Font;
      mEditor.Text = this.Text;
      mEditor.SelectionLength = this.Text.Length;
      mEditor.Leave += new EventHandler(mEditor_Leave);
      this.Parent.Controls.Add(mEditor);
      this.Parent.Controls.SetChildIndex(mEditor, 0);
      mEditor.Focus();
    }
    base.OnDoubleClick(e);
  }
  void mEditor_Leave(object sender, EventArgs e) {
    this.Text = mEditor.Text;
    mEditor.Dispose();
    mEditor = null;
  }
  protected override void Dispose(bool disposing) {
    if (disposing && mEditor != null) mEditor.Dispose();
    base.Dispose(disposing);
  }
}
于 2010-04-28T15:00:28.443 に答える