- PR -

C#でフォーム部品の移動

1
投稿者投稿内容
もの
会議室デビュー日: 2005/11/09
投稿数: 8
投稿日時: 2006-08-23 00:20
お世話になります。
webや書籍で調べてみたものの、解決できませんでしたので、
ご質問をお許しください。

フォーム上にて、ユーザーがTextBoxやLabelをドラッグして
位置を変更するような機能はどのように実現したらよい
のでしょう?
(Visual Studioのフォームデザイナで部品を配置するときの機能そのまんまです・・・)

1.TextBoxの上でMouseDownしたらコントロールを半透明
2.次にFormをクリックした位置を調べてTextBoxのLocationにセット

みたいな原始的な方法になりますでしょうか・・・。

アドバイス、よろしくお願いいたします。

[ メッセージ編集済み 編集者: もの 編集日時 2006-08-23 00:20 ]
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2006-08-23 00:50
引用:

ものさんの書き込み (2006-08-23 00:20) より:
お世話になります。
1.TextBoxの上でMouseDownしたらコントロールを半透明
2.次にFormをクリックした位置を調べてTextBoxのLocationにセット

みたいな原始的な方法になりますでしょうか・・・。


あくまで自分で実装するのであれば、そんな感じの処理をJavaScriptで実装することになります。

流行のAjaxを用いたFrameworkの中には、そういった機能を提供しているものもあります。サードパーティのフレームワークを使うのも、解決方法のひとつでしょう。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-08-23 07:38
ん? Web アプリケーションなのですか?
Windows アプリケーションではないのですか?

引用:

ものさんの書き込み (2006-08-23 00:20) より:

1.TextBoxの上でMouseDownしたらコントロールを半透明
2.次にFormをクリックした位置を調べてTextBoxのLocationにセット
みたいな原始的な方法になりますでしょうか・・・。


普通は、
  1. MouseDown イベントで対象物を決定する。
  2. MouseUp イベントが起きるまで、MouseMove のイベントで対象物の Location をマウスの位置に移動。
  3. MouseUp イベントが起きたら、対象物の Location をマウスの位置まで移動し、対象物を放す。
が、原始的な方法にあたると思いますが...

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-08-23 08:52
引用:

じゃんぬねっとさんの書き込み (2006-08-23 07:38) より:
ん? Web アプリケーションなのですか?
Windows アプリケーションではないのですか?



「C#でフォーム部品の移動」というタイトルなので、僕も Windowsのフォームのことだと思いました。

引用:

ものさんの書き込み (2006-08-23 00:20) より:

1.TextBoxの上でMouseDownしたらコントロールを半透明
2.次にFormをクリックした位置を調べてTextBoxのLocationにセット
みたいな原始的な方法になりますでしょうか・・・。


同様のソフトはVB6の時に作ったことがあります。
手順については、じゃんぬねっとさんが仰っている通りで作りました。
ということで、ちょっと補足ですが、この手の処理って、重なった場合に表示する順番に意外と苦労するんですよね。
順番を任意に変えられるようにするか、最後にドラッグしたものを最上面にするかによって処理の仕方が変わります。

主題とはあまり関係ないのですが参考までに^^;

[ メッセージ編集済み 編集者: R・田中一郎 編集日時 2006-08-23 08:57 ]
さかもと
ぬし
会議室デビュー日: 2004/05/14
投稿数: 586
投稿日時: 2006-08-23 09:49
さかもとです。
以前、同じ内容で調べて、参考となるURL見つけたことあるんですけどOS入れ替えでブックマークが・・・。

確かITmediaの記事で「ムーバブルコントロール」とか「ドラッカブルコントロール」とかなんとか(このキーワードでは今見つけられませんでした)出ていたかと・・・。

思い出せず、どうにも気持ち悪いです・・・。
こういうコントロールはなんとう総称なんでしょうね・・・。
もの
会議室デビュー日: 2005/11/09
投稿数: 8
投稿日時: 2006-08-24 23:21
ものです。

じゃんぬねっとさんに察していただいた通り、
Windowsアプリケーションで書きたいと思っています。

みなさんに頂いたアドバイスを元に、
初心者ながらに次のようなコードを書いてみました。

コード:

        private void textBox1_MouseDown(object sender, MouseEventArgs e)
        {
            this.textBox1.MouseMove +=new MouseEventHandler(this.textBox1_MouseMove);
            this.textBox1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.textBox1_MouseUp);
            
         }
        private void textBox1_MouseUp(object sender,MouseEventArgs e) {

            this.textBox1.MouseMove -= new MouseEventHandler(this.textBox1_MouseMove);
            this.textBox1.MouseUp -= new System.Windows.Forms.MouseEventHandler(this.textBox1_MouseUp);

        }
        private void textBox1_MouseMove(object sender, MouseEventArgs e)
        {

            int X = Cursor.Position.X - this.Location.X ;
            int Y = Cursor.Position.Y - this.Location.Y - 40;   
            Point pt = new Point(X,Y);
            textBox1.Location = pt;
           
          //デバッグ用出力
            label1.Text = "" + X;
            label2.Text = "" + Y;

        }



【疑問1】MouseDownのハンドラの中でMouseMoveのハンドラを指定して
みました。さらに、MouseUpのイベントが発生したら、
MouseMoveとMouseUpのハンドラを消すようにしています。
このようなアプローチは許されますでしょうか?

【疑問2】
さきほどのコードのうち、以下のようにtextBoxの位置を割り出して
いますが、もっとスマートな方法はありますでしょうか?
コード:
            int X = Cursor.Position.X - this.Location.X ;
            int Y = Cursor.Position.Y - this.Location.Y - 40;   
            Point pt = new Point(X,Y);
            textBox1.Location = pt;



とんでもないちんぷんかんぷんな質問ですみません。
よろしくお願いいたします。
ダッチ
大ベテラン
会議室デビュー日: 2005/10/31
投稿数: 113
投稿日時: 2006-08-26 10:08
ダッチです

引用:
【疑問1】MouseDownのハンドラの中でMouseMoveのハンドラを指定して
みました。さらに、MouseUpのイベントが発生したら、
MouseMoveとMouseUpのハンドラを消すようにしています。
このようなアプローチは許されますでしょうか?


許すか許さないかは別として、
毎回 MouseDown や MouseUp 時にイベントハンドラを登録・解除するよりは
フォームのインスタンス化時に一度だけ MouseMove イベントを登録しておけばいいと思います。

引用:
【疑問2】
さきほどのコードのうち、以下のようにtextBoxの位置を割り出して
いますが、もっとスマートな方法はありますでしょうか?
コード:
--------------------------------------------------------------------------------

int X = Cursor.Position.X - this.Location.X ;
int Y = Cursor.Position.Y - this.Location.Y - 40;
Point pt = new Point(X,Y);
textBox1.Location = pt;


--------------------------------------------------------------------------------



DOBON.NETさんのサイトに、ものさんがやりたいことがまとまっていますよ。

他にもいろいろと参考になる Tips がありますので、困ったことがあったら見てみるといいです。

sou
ベテラン
会議室デビュー日: 2002/09/25
投稿数: 56
投稿日時: 2006-08-28 00:42
こちらのサイトにあるControlDraggerクラスの実装が参考になるかと思います。
http://park16.wakwak.com/~mimi/dotnet/

ただ、コントロールを半透明にするのは難しいかもしれません。
フォームは簡単に半透明に出来るのですが・・。
1

スキルアップ/キャリアアップ(JOB@IT)