|
> 簡単なのであれば、今後のことも考えて作り直したいと思います。
> できればその「簡単」な部分のヒントをいただけないでしょうか?
こんちは〜〜
> LayoutEngineを実装してPanelから頑張ったほうがいいかもです。
らしいのですが、小生、LayoutEngineは未知の領域で(今から調べようかと・・)
D&DというかマウスのMoveで位置(実はTextだけ)を入れ替えるサンプルを作りました。CとVBだけの知識で悪戦苦闘3時間・・・
C#はちょっとめんどいですネ〜〜でも、Cは好きデス。
別にLabel自体を移動しなくても、充分に使えると思うのですが・・・(用途がよく理解できていませんので)
オマケとして、右へDragしたらゴミ箱へ入れるようにしました。
.net2003 C# (初心者ですので、変なことをしているかも知れません)
参考になれば幸いです
static void Main()
{
Application.Run(new Form1());
}
private System.Windows.Forms.Label[] myLabels;
private System.Windows.Forms.Label dustLabel;
//フォームのLoadイベントハンドラ
private void Form1_Load(object sender, EventArgs e)
{
this.myLabels = new System.Windows.Forms.Label[13];
this.SuspendLayout();
int i,x,y;
for (i = 0; i < this.myLabels.Length; i++)
{
x=i/4; y=i%4;
//インスタンス作成
this.myLabels[i] = new System.Windows.Forms.Label();
//プロパティ設定
this.myLabels[i].Name = i.ToString();
this.myLabels[i].Text = "Label" + i.ToString();
this.myLabels[i].Size = new Size(48, 20);
this.myLabels[i].Location = new Point(x*60+4, y*30 + 10);
this.myLabels[i].TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//イベントハンドラに関連付け
this.myLabels[i].MouseDown += new System.Windows.Forms.MouseEventHandler(this.myLabel_MouseDown);
this.myLabels[i].MouseMove += new System.Windows.Forms.MouseEventHandler(this.myLabel_MouseMove);
this.myLabels[i].MouseUp += new System.Windows.Forms.MouseEventHandler(this.myLabel_MouseUp);
}
this.myLabels[i-1].Text = ".." ;
//フォームにコントロールを追加
this.Controls.AddRange(this.myLabels);
this.dustLabel = new System.Windows.Forms.Label();
this.dustLabel.Name = "dustLabel";
this.dustLabel.Text = "dustBox";
this.dustLabel.Size = new Size(50, 20);
this.dustLabel.Location = new Point(200, 30);
this.Controls.Add(this.dustLabel);
this.ResumeLayout(false);
}
private Point mousePoint; //位置を記憶する
private Point lab1Location; //位置を記憶する
private void myLabel_MouseDown(object sender,System.Windows.Forms.MouseEventArgs e)
{
if ((e.Button & MouseButtons.Left) == MouseButtons.Left){
mousePoint = new Point(e.X, e.Y);
Label lab1 = (System.Windows.Forms.Label) sender;
Console.WriteLine("m" + lab1.Name + " " + lab1.Text);
lab1.BorderStyle=System.Windows.Forms.BorderStyle.FixedSingle;
lab1.BringToFront();
lab1Location=lab1.Location;
}
}
private void myLabel_MouseMove(object sender,System.Windows.Forms.MouseEventArgs e)
{
if ((e.Button & MouseButtons.Left) == MouseButtons.Left)
{
Label lab1 = (System.Windows.Forms.Label) sender;
lab1.Left += e.X - mousePoint.X;
lab1.Top += e.Y - mousePoint.Y;
int i = loc_to_i(lab1.Location);
int x,y;
x=i/4; y=i%4;
Graphics g = this.CreateGraphics();
g.Clear(this.BackColor);
Pen p = new Pen(Color.Orange, 2);
g.DrawRectangle(p, x*60+2, y*30+10-2, 52, 26);
p.Dispose();
g.Dispose();
}
}
private void myLabel_MouseUp(object sender,System.Windows.Forms.MouseEventArgs e)
{
Label lab1 = (System.Windows.Forms.Label) sender;
int i = int.Parse(lab1.Name);
//Console.WriteLine("i=" + i.ToString());
using(Graphics g = this.CreateGraphics())
g.Clear(this.BackColor);
if(150<lab1.Left)
{
this.dustLabel.Text = lab1.Text;
delete_1(i);
}
else
{
int ins_i = loc_to_i(lab1.Location);
string ins_text = lab1.Text;
delete_1(i);
insert_1(ins_i,ins_text);
}
lab1.Location=lab1Location;
lab1.BorderStyle=System.Windows.Forms.BorderStyle.None;
}
private void delete_1(int p)
{
for(int i = p; i < this.myLabels.Length-1; i++)
myLabels[i].Text = myLabels[i+1].Text;
}
private void insert_1(int p, string text1)
{
int i;
for(i = 11; i > p; i--)
myLabels[i].Text = myLabels[i-1].Text;
myLabels[i].Text = text1;
}
private int loc_to_i(Point pt1)
{
int x = (pt1.X+25-2)/60; if(2<x) x=2;
int y = (pt1.Y+15-10)/30; if(3<y) y=3;
return (x*4+y);
}
}
}
|