C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: Panelへの文字列描画


(過去ログ 25 を表示中)

[トピック内 17 記事 (1 - 17 表示)]  << 0 >>

■11289 / inTopicNo.1)  Panelへの文字列描画
  
□投稿者/ みこ (23回)-(2007/12/11(Tue) 19:56:14)

分類:[.NET 全般] 

いつも教えていただきありがとうございます。

C# VS2005 WindowsXPにて開発しています。

FlowRayoutPanelにラベル等ではなく直接文字列を表示したいのですが、可能なのでしょうか?
現在FlowRayoutPanelに複数のlabelを動的に追加し自動的にレイアウトしています。
行番号の位置や内容は固定で、動的に追加しているlabelのみがレイアウトされ、見た目的には各ラベルに行番号が振られている形になるようにできればと思っています。

現状、labelのレイアウトのみを行っています。
これに別でlabelを追加するとデータの増減があった際にまざってしまうのではないかと思っています。

以下のような表示にするのに、aaaa〜mmmmまでの要素は毎回内容が変動するlabelであり、1〜12の行番号は要素があってもなくても毎回表示したいのです。

1 aaaa   5 eeee   9 iiii
2 bbbb   6 ffff  10 jjjj
3 cccc   7 gggg  11 kkkk
4 dddd   8 hhhh  12 mmmm 

うまく説明できているかわかりませんが、教えていただきたく、よろしくお願いします。

引用返信 編集キー/
■11292 / inTopicNo.2)  Re[1]: Panelへの文字列描画
□投稿者/ れい (293回)-(2007/12/11(Tue) 20:03:53)
No11289 (みこ さん) に返信
> FlowRayoutPanelにラベル等ではなく直接文字列を表示したいのですが、可能なのでしょうか?

もちろん可能ですが、
FlowRayoutPanelを継承したコントロールを使うことになりますので、
いろいろとめんどくさいです。


> 行番号の位置や内容は固定で、動的に追加しているlabelのみがレイアウトされ、見た目的には各ラベルに行番号が振られている形になるようにできればと思っています。

であれば、FlowRayoutPanelに直接描画するとは考えないほうがいいです。
「番号+Label」というコントロールをつくり、
そのコントロールをFlowRayoutPanelに並べたほうがよいと思います。
引用返信 編集キー/
■11304 / inTopicNo.3)  Re[2]: Panelへの文字列描画
□投稿者/ みこ (24回)-(2007/12/12(Wed) 00:20:36)
ありがとうございます


>>行番号の位置や内容は固定で、動的に追加しているlabelのみがレイアウトされ、見た目的には各ラベルに行番号が振られている形になるようにできればと思っています。
>
> であれば、FlowRayoutPanelに直接描画するとは考えないほうがいいです。
> 「番号+Label」というコントロールをつくり、
> そのコントロールをFlowRayoutPanelに並べたほうがよいと思います。

FlowLayoutPanelに追加したコントロールはDrag & Dropで並べ替え可能なのです。(この並べ替えについてはマウスの位置を判断して間に挿入しもとのコントロールを削除することで実現できています)
ですので、行番号+Labelというコントロールにしてしまうと行番号の不変が実現できないのではないかと考えたのです。
挿入したLabel以降の要素も全て行番号を書き換えなければいけなくなります。

なので、直接描画と考えたのですが・・

直接描画の方のヒントをいただけるとありがたいです。

引用返信 編集キー/
■11312 / inTopicNo.4)  Re[3]: Panelへの文字列描画
□投稿者/ れい (294回)-(2007/12/12(Wed) 06:44:02)
2007/12/12(Wed) 06:44:32 編集(投稿者)

No11304 (みこ さん) に返信
> 挿入したLabel以降の要素も全て行番号を書き換えなければいけなくなります。

ドラッグドロップで順番が変わったときに一回書き換えるのと、
描画の度に書くのとでは
前者のほうがいいと思いますよ。

> 直接描画の方のヒントをいただけるとありがたいです。

やりたいことの内容からして「直接描画する」という意味がわかってない気がしますが。

PaintイベントやOnPaintをオーバーライドして描画するのが一番楽です。
他にもWndProcのオーバーライドなどで直接描画できます。

「直接描画する」わけですから、描画したい物の位置は自分で決定しないといけません。
また、親に直接描画するわけですから、上から子が描画され、重なっている部分は隠れます。
引用返信 編集キー/
■11425 / inTopicNo.5)  Re[4]: Panelへの文字列描画
□投稿者/ みこ (25回)-(2007/12/13(Thu) 15:55:07)
アドバイスありがとうございます。
1〜12の行番号は最初に表示したらそのままで、aaaaなどのコントロールのみがドラッグドロップで移動できるのが
理想なので親のFlowLayoutPanelに最初に1度書けばいいのではないかと考えたのですがそれではだめなのですね。
移動できるコントロールの間に行番号のサイズを空けるだけのマージンを取れば問題ないのだと考えていました。
移動するコントロールはすべて同サイズなので頭の1つめの位置を割り出せば後は計算でいけるというのも浅はかだったようです。


C#は始めてまだ浅いのでそのあたりを深く知っているとはとてもいえませんので直接描画についてもう一度調べてみます。


引用返信 編集キー/
■11426 / inTopicNo.6)  Re[5]: Panelへの文字列描画
□投稿者/ y4yama (43回)-(2007/12/13(Thu) 16:15:51)
No11425 (みこ さん) に返信
> 1〜12の行番号は最初に表示したらそのままで、aaaaなどのコントロールのみがドラッグドロップで移動できるのが
> C#は始めてまだ浅いのでそのあたりを深く知っているとはとてもいえませんので直接描画についてもう一度調べてみます。

こんちは〜
FlowLayoutPanelを使わないで、複数のラベルの位置をソフトで管理して並べ替えるとか・・簡単にできますが・・
3*4のレイアウトが固定だし、FlowLayoutPanelを使うメリットが何なのかわからないのですが・・(スミマセン)
FlowLayoutPanelを使うことで却って遠回りをしているように感じますです
引用返信 編集キー/
■11435 / inTopicNo.7)  Re[6]: Panelへの文字列描画
□投稿者/ れい (304回)-(2007/12/13(Thu) 17:36:23)
適当に作ってみました。
子コントロールのMargin.Leftを大きめに取らないとだめです。

やっぱりちょっと綺麗じゃないです。
FlowLayoutPanelを使わずに
LayoutEngineを実装してPanelから頑張ったほうがいいかもです。


Public Class NumberedFlowLayoutPanel
    Inherits FlowLayoutPanel

    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
        MyBase.OnPaint(e)
        For i As Integer = 0 To Me.Controls.Count - 1
            Dim s As SizeF
            s = e.Graphics.MeasureString(i.ToString(), Me.Font, Me.Width)
            e.Graphics.DrawString(i.ToString, Me.Font, Brushes.Black, Me.Controls(i).Left - s.Width, Me.Controls(i).Top + (Me.Controls(i).Height - s.Height) / 2)
        Next
    End Sub

    Protected Overrides Sub OnLayout(ByVal levent As System.Windows.Forms.LayoutEventArgs)
        MyBase.OnLayout(levent)
        Me.Invalidate()
    End Sub

End Class

引用返信 編集キー/
■11455 / inTopicNo.8)  Re[6]: Panelへの文字列描画
□投稿者/ みこ (26回)-(2007/12/14(Fri) 04:49:41)
> こんちは〜
> FlowLayoutPanelを使わないで、複数のラベルの位置をソフトで管理して並べ替えるとか・・簡単にできますが・・
> 3*4のレイアウトが固定だし、FlowLayoutPanelを使うメリットが何なのかわからないのですが・・(スミマセン)
> FlowLayoutPanelを使うことで却って遠回りをしているように感じますです


ありがとうございます。
上記はイメージ的に例として出したのですが、実際はもっとあるのと、例えばkkkkのラベルをccccとddddの間にドロップすると

1 aaaa   5 dddd   9 hhhh
2 bbbb   6 eeee  10 iiii
3 cccc   7 ffff  11 jjjj
4 kkkk   8 gggg  12 mmmm 

と次の行にずれてほしいのです。
で、このブロックが縦にいくつか並んでいるのが最終形なのです。
別のブロックからのD&Dも可能です。
このずらすということで他によい方法を思いつかなかったのでFlowLayoutPanelを使ったのですが、プログラムでそう簡単に
できるものなのでしょうか?

D&Dを実装するにも、マウスでの位置関係を計算して間にいれてそれ以降を再描画というサンプルをネットで探して自分で作り直した
のですが、かなりかかったので。。。

簡単なのであれば、今後のことも考えて作り直したいと思います。
できればその「簡単」な部分のヒントをいただけないでしょうか?

よろしくお願いします。

引用返信 編集キー/
■11456 / inTopicNo.9)  Re[7]: Panelへの文字列描画
□投稿者/ みこ (27回)-(2007/12/14(Fri) 04:51:34)
わざわざ試していただいたようで、お時間とっていただきありがとうございます。

まずは、どうやって実現されてるのかをじっくり読み説きたいと思います。


No11435 (れい さん) に返信
>
> 適当に作ってみました。
> 子コントロールのMargin.Leftを大きめに取らないとだめです。
>
> やっぱりちょっと綺麗じゃないです。
> FlowLayoutPanelを使わずに
> LayoutEngineを実装してPanelから頑張ったほうがいいかもです。
>
>
> Public Class NumberedFlowLayoutPanel
> Inherits FlowLayoutPanel
>
> Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
> MyBase.OnPaint(e)
> For i As Integer = 0 To Me.Controls.Count - 1
> Dim s As SizeF
> s = e.Graphics.MeasureString(i.ToString(), Me.Font, Me.Width)
> e.Graphics.DrawString(i.ToString, Me.Font, Brushes.Black, Me.Controls(i).Left - s.Width, Me.Controls(i).Top + (Me.Controls(i).Height - s.Height) / 2)
> Next
> End Sub
>
> Protected Overrides Sub OnLayout(ByVal levent As System.Windows.Forms.LayoutEventArgs)
> MyBase.OnLayout(levent)
> Me.Invalidate()
> End Sub
>
> End Class
>
引用返信 編集キー/
■11468 / inTopicNo.10)  Re[7]: Panelへの文字列描画
□投稿者/ y4yama (44回)-(2007/12/14(Fri) 11:59:11)
> 簡単なのであれば、今後のことも考えて作り直したいと思います。
> できればその「簡単」な部分のヒントをいただけないでしょうか?

こんちは〜〜
> 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);
		}
	}
}

引用返信 編集キー/
■11469 / inTopicNo.11)  Re[8]: Panelへの文字列描画
□投稿者/ y4yama (45回)-(2007/12/14(Fri) 12:10:30)
追加・・・
変なことをしてます
後ろへ移動のときに、1つ違ったとこへ行きます。BUGデス・・・
引用返信 編集キー/
■11530 / inTopicNo.12)  Re[9]: Panelへの文字列描画
□投稿者/ y4yama (46回)-(2007/12/17(Mon) 13:28:15)
>別にLabel自体を移動しなくても、充分に使えると思うのですが・・・
とは思いましたが、勉強のため、各ラベルをきちんと移動するサンプルにしてみました。
オマケとして、右へDragしたら、4x3から外へ出す(ゴミ箱へ入れる)のは、上と同じにしました。
Layoutエンジンを調べてみると、(DemoPanelに入れた3ケのボタンが自動的に並ぶのは良いとは思いましたが)
ウゥ〜ん、、、カスタマイズするのが楽ではないかなぁ〜と。(初心者の私には・・)

C#2003です
		private System.Windows.Forms.Label[] myLabels;
		private const int LabelNUM=12;
		private void Form1_Load(object sender, EventArgs e)
		{
			this.myLabels = new System.Windows.Forms.Label[LabelNUM];
〜〜
〜〜略
		}

		private Point mousePoint;	//位置を記憶する
		private Label floatLab1;
		private int previous_i;
		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);
				floatLab1 = (System.Windows.Forms.Label) sender;
				previous_i = labloc_to_i(floatLab1);

				Console.WriteLine("m" + floatLab1.Name + " " + floatLab1.Text);
				floatLab1.BorderStyle=System.Windows.Forms.BorderStyle.FixedSingle;
				floatLab1.BringToFront();
			}
		}
		private void myLabel_MouseMove(object sender,System.Windows.Forms.MouseEventArgs e)
		{
			if ((e.Button & MouseButtons.Left) == MouseButtons.Left)
			{
				floatLab1.Left += e.X - mousePoint.X;
				floatLab1.Top += e.Y - mousePoint.Y;

				int ni = labloc_to_i(floatLab1);  //new i
				if(ni==previous_i) return;

				int i,j;
				if(ni<previous_i)
				{
					for (j = 0; j < LabelNUM; j++)
					{
						i=labloc_to_i(myLabels[j]);
						if(myLabels[j]!=floatLab1 && i!=LabelNUM
							&& ni<=i && i<previous_i) loc_lab1(myLabels[j],i+1);
					}
				}else
				{
					for (j = 0; j < LabelNUM; j++)
					{
						i=labloc_to_i(myLabels[j]);
						if(myLabels[j]!=floatLab1 && i!=LabelNUM 
							&& previous_i<i && i<=ni) loc_lab1(myLabels[j],i-1);
					}
				}
				previous_i=ni;
			}
		}
		private void myLabel_MouseUp(object sender,System.Windows.Forms.MouseEventArgs e)
		{
			int i=labloc_to_i(floatLab1);
			if(LabelNUM==i)
				floatLab1.Left=220;
			else{
				if(in4x3count()<i) i=in4x3count();
				loc_lab1(floatLab1,i);
			}
			floatLab1.BorderStyle=System.Windows.Forms.BorderStyle.None;
		}
		private void loc_lab1(Label lab1,int i)
		{
			lab1.Left=(i/4)*60 + 4;
			lab1.Top=(i%4)*30 + 10;
		}
		private int labloc_to_i(Label lab1)
		{
			if(200<lab1.Left) return(LabelNUM);
			int x = (lab1.Left+25-4)/60; if(2<x) x=2;
			int y = (lab1.Top+15-10)/30; if(3<y) y=3;
			return (x*4+y);
		}
		private int in4x3count()
		{
			int i,cnt=0;
			for (i = 0; i < this.myLabels.Length; i++){
				if(floatLab1!=myLabels[i]  && LabelNUM>labloc_to_i(myLabels[i])) cnt++;
			}
			return(cnt);
		}


引用返信 編集キー/
■11533 / inTopicNo.13)  Re[10]: Panelへの文字列描画
□投稿者/ れい (310回)-(2007/12/17(Mon) 14:25:41)
No11530 (y4yama さん) に返信
> Layoutエンジンを調べてみると、(DemoPanelに入れた3ケのボタンが自動的に並ぶのは良いとは思いましたが)
> ウゥ〜ん、、、カスタマイズするのが楽ではないかなぁ〜と。(初心者の私には・・)

LayoutEngineはたしかにめんどくさいです。
> private void loc_lab1(Label lab1,int i)
> {
> lab1.Left=(i/4)*60 + 4;
> lab1.Top=(i%4)*30 + 10;
> }
> private int labloc_to_i(Label lab1)
> {
> if(200<lab1.Left) return(LabelNUM);
> int x = (lab1.Left+25-4)/60; if(2<x) x=2;
> int y = (lab1.Top+15-10)/30; if(3<y) y=3;
> return (x*4+y);
> }
こーゆー計算をガリガリかかなきゃいけないのを
汎用的に処理する仕組みですから、
再利用が効く代わりにその分めんどくさくなるのは
しょうがないですね。

Label+Labelなコントロールを作って、
そのコレクションを取るようなPanelを用意して、
PanelのLayoutEngineにFlowLayoutEngineを入れて、
Panel.OnLayoutとかでコレクションのアイテムに連番で数字を入れる、
っていうのが一番いいような気がします。
引用返信 編集キー/
■11613 / inTopicNo.14)  Re[1]: Panelへの文字列描画
□投稿者/ みこ (28回)-(2007/12/19(Wed) 02:14:37)
みなさま、本当にいろいろとありがとうございます。
教えていただいた方法をサンプルを作って動かしてみたり、いろいろとためしてみているところです。
4×3のみなら移動も何とかできているのですが、この4×3のブロックが縦に複数並んでおり、1つ目の4×3の位置
になにかを移動されたらもともと12番目にあったコントロールは13番目(2ブロック目の1番目)に移動しなければ
ならず、ラベルでの移動で自動計算できるようにするとなるとどうしていいかわからなくなり、煮詰まってしまっています。
FlowLaoutPanelでも単純にはいかないので、各ブロックごとにPanelを用意し、移動が発生したらコントロールの数を数えMax値(ここでいうと12)を超えた分を次のパネルの先頭に移動ということをやっています。
これに行番号を付与しなければならないので面倒で・・・固定で貼り付けて(もしくは直接書いて)おきたいと考えたわけなんです。

もう少し試行錯誤してみます。
何かヒントがありましたらよろしくお願いします。


進展がありましたらまたこちらでご報告させていただきます。
引用返信 編集キー/
■11619 / inTopicNo.15)  Re[2]: Panelへの文字列描画
□投稿者/ y4yama (47回)-(2007/12/19(Wed) 11:24:58)
No11613 (みこ さん) に返信

> 4×3のみなら移動も何とかできているのですが、この4×3のブロックが縦に複数並んでおり、1つ目の4×3の位置
> になにかを移動されたらもともと12番目にあったコントロールは13番目(2ブロック目の1番目)に移動しなければ
> ならず、ラベルでの移動で自動計算できるようにするとなるとどうしていいかわからなくなり、煮詰まってしまっています。

何か、タックラベルというかシールのレイアウトソフトのような印象を受けました・・・
>ラベルでの移動で自動計算できるようにするとなるとどうしていいかわからなくなり
考え方は色々ありそうですが、全然複雑なことでは、ないです。まぁ〜FlowLaoutPanelで複雑なこと(Labelsの出し入れ)を
したのとは、視点が違いますよネ
コードを出しても今の所意味が無いので、とりあえずは、以上です
引用返信 編集キー/
■11623 / inTopicNo.16)  Re[3]: Panelへの文字列描画
□投稿者/ 渋木宏明(ひどり) (602回)-(2007/12/19(Wed) 12:05:16)
渋木宏明(ひどり) さんの Web サイト
2007/12/19(Wed) 12:06:26 編集(投稿者)

ListView の「小さいアイコン」表示か「一覧」表示でできたりしませんか?>元投稿者の人
引用返信 編集キー/
■11656 / inTopicNo.17)  Re[4]: Panelへの文字列描画
□投稿者/ y4yama (48回)-(2007/12/19(Wed) 16:32:59)
とはいっても参考になるかと、少し変更してみました
2x2を1つのブロックとして、3ブロックを管理します。 3*2*2=12 でLabelの数は12個です
変更部のみコピーします
		private System.Windows.Forms.Label[] myLabels;
		private const int LabelNUM=12;
		private const int blockPitch=100;
(略)
				this.myLabels[i].Size = new Size(48, 20);
				loc_lab1(myLabels[i],i);
				//this.myLabels[i].Location = new Point(x*60+4, y*30 + 10);

(略)
		private void loc_lab1(Label lab1,int i)
		{
			int b = i/4;
			int ii = i%4;

			lab1.Left=(ii/2)*60 + 4;
			lab1.Top=b*blockPitch + (ii%2)*30 + 10;
		}
		private int labloc_to_i(Label lab1)
		{
			//if(200<lab1.Left) return(LabelNUM);
			int b = (lab1.Top+15-10)/blockPitch;
			int x = (lab1.Left+25-4)/60; if(1<x) goto XX;
			int y = (lab1.Top+15-10 -b*blockPitch)/30; if(1<y) goto XX;
			return (b*4 + x*2+y);
	XX:
			return(LabelNUM);
		}

位置を計算するとこを思い通りにプログラムすれば、myLabel_MouseMove()はそのままでOKでした。
15分で完了。その後すこし変な動きをきれいに直しましたが。( if(1<y) goto XX;の部分)

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -