0

状況 :

私は現在、ユーザーが新しいコントロールをデザインサーフェスにドレープ/ドロップし、これらのコントロールのプロパティを変更できるVSのようなIDEを開発することを目的としたプロジェクトに取り組んでいます。

だから私はIDesignerHost, IServiceContainer, IContainer, IComponentChangeService,それを設計するために作られた、他のいくつかの便利なインターフェースを実装しました。

すべてが正常に機能します。ツールボックス、デザインサーフェス、および正常に動作してpropertyGridいます。

問題は:

ドラッグアンドドロップされたコントロールに添付されているのは、ユーザーがマウスでコントロールを移動している間、コントロールに従わなければならないラベルです。

LocationChanged eventコントロールの移動時にラベルを移動するために、コントロールのを使用してみました。ただし、このイベントは、コントロールが移動した後に1回だけ発生するため、コントロールが移動しているはラベルは移動しません。

私はこれを機能させる方法を見つけることができません。誰か良いアイデアがありますか?

ありがとうございました

編集: IDesignerHostを実装するカスタムクラスを使用します。このデザインサーフェスのコントロールは、イベントMouse -----を発生させません(例:MouseDown、MouseMove)。

4

3 に答える 3

1

私はついにそれを行う方法を見つけました:

実装ISelectionServiceし、SetSelectedComponents関数で、選択したコントロールに関連付けられたラベルコントロールを選択することができました。

ラベルのデザイナーをオーバーライドして、ラベルが選択されたときにborder/resize-rectangleが表示されないようにしました。

これはあまり洗練された解決策ではありませんが、うまく機能します=)。

于 2009-09-12T15:31:38.620 に答える
1

すべてのコントロールにはControlDesignerがあり、設計時に関連するコントロールの動作の拡張と変更をサポートする追加のメソッドを提供します。

ControlDesignerには、コントロールのDesignSurfaceの動作を制御するBehaviorServiceがあります。

BehaviorServiceには、コントロールのUIデコレータのような複数のGlyphAdornerがあります。長方形のようなコントロールのサイズ変更ラバーバンドは、System.Windows.Forms.Design.Behavior.SelectionBorderGlyphと呼ばれるGlyphであり、.Net2.0のプライベートクラスです。

このリンクは役立つかもしれません:

http://msdn.microsoft.com/en-us/library/ms171820.aspx

http://msdn.microsoft.com/en-us/library/bb514670%28VS.90%29.aspx

コントロールにラベルが添付されたカスタムグリフを追加できるはずです。

HTH

于 2010-07-23T06:46:36.403 に答える
0

Form2にはpanel1, label1

panel1.MouseMove += panel1_MouseMove
panel1.MouseDown += panel1_MouseDown

クリックするとMouseDown+Left Button->マウスの初期位置を保存クリックすると->MouseMove+Left Button現在のマウス位置と保存した初期位置の差で移動(panel1 + label1)します。

終わった。

public partial class Form2 : Form
{
    private int _x, _y;

    public Form2()
    {
        InitializeComponent();
    }

    private void panel1_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            panel1.Location = new Point(panel1.Location.X + (e.X - _x), panel1.Location.Y + (e.Y - _y));
            label1.Location = new Point(label1.Location.X + (e.X - _x), label1.Location.Y + (e.Y - _y));
        }
    }

    private void panel1_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            _x = e.X;
            _y = e.Y;
        }
    }
}
于 2009-09-09T10:20:11.627 に答える