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

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

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

Re[4]: (削除)


(過去ログ 84 を表示中)

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

■49750 / inTopicNo.1)  ユーザコントロールをマウスで移動する場合の処理について
  
□投稿者/ MONONOKE (1回)-(2010/05/15(Sat) 01:28:08)

分類:[C#] 

初めて投稿させていただきます。
MONONOKEと申します。よろしくお願いいたします。

ユーザがマウスで移動可能なコントロールを作成しています。
本件について、以下のサイトを参考にして単一のコントロールだと移動を行うことができました。

http://d.hatena.ne.jp/mtoyoshi/20070609/1181358827

しかしながら、LabelやPictureBoxなどをUserControlに配置し、UserControlの移動を行いたい場合に、
MouseMove, MouseUp, MouseDownイベントなどがLabelやPictureBoxで発生してしまう為、
UseControlで発生せず、動きませんでした。

そこで、LabelやPictureBoxのMouseMove,MouseUp,MouseDownなどのイベントが発生した場合に、
UserControlのMouseMove,MouseUp,MouseDownイベントを呼び出してみましたが、
UserControlがぐるぐる回るように移動しうまく動きませんでした。(←うまく表現できず申し訳ありません)

おそらく、MouseMove,MouseUp,MouseDownイベントの引数である、
MouseEventArgsのXプロパティやYプロパティがUserControlの移動によって変化してしまっているのではないかと想像しています。

UseControlに配置しているLabelやPictureBoxのイベントを無視して、
最背面にあるUserControlのイベントを発生させることは出来るのでしょうか?

何卒、よろしくお願いいたします。

--
OS:Windows7
言語:C# ( Visual Studio 2008 Express Edition )
引用返信 編集キー/
■49754 / inTopicNo.2)  Re[1]: ユーザコントロールをマウスで移動する場合の処理について
□投稿者/ nori (105回)-(2010/05/15(Sat) 05:52:45)
2010/05/15(Sat) 07:32:38 編集(投稿者)

座標をスクリーン座標に変換すれば動く予感。

http://msdn.microsoft.com/ja-JP/library/system.windows.forms.control.pointtoscreen.aspx
#使用例を必ず見てください。
引用返信 編集キー/
■49777 / inTopicNo.3)  Re[2]: ユーザコントロールをマウスで移動する場合の処理について
□投稿者/ MONONOKE (2回)-(2010/05/16(Sun) 18:52:21)
返信ありがとうございます。
ご指定いただいたサイトを見て色々やってみましたがうまくいきませんでした。

ソースを載せさせて頂きますので、よろしくお願いいたします。
    class ControlMoveHelper
    {

        private Control control;

        private bool isDragged = false;

        private bool doAction = true;

        public bool DoAction
        {
            set { this.doAction = value; }
            get { return this.doAction; }
        }

        private Point point = new Point();

        private int margin;

        public ControlMoveHelper(Control control,  int margin)
             : this(control,  null, margin){}

        public ControlMoveHelper(Control control, Control[] eventControls, int margin)
        {
            this.control = control;
            this.margin = margin;

            this.control.MouseDown += new MouseEventHandler(control_MouseDown);
            this.control.MouseUp += new MouseEventHandler(control_MouseUp);
            this.control.MouseMove += new MouseEventHandler(control_MouseMove);

            if (eventControls != null)
            {
                foreach (Control eventControl in eventControls)
                {
                    eventControl.MouseDown += new MouseEventHandler(control_MouseDown);
                    eventControl.MouseUp += new MouseEventHandler(control_MouseUp);
                    eventControl.MouseMove += new MouseEventHandler(control_MouseMove);
                }
            }
        }

        /// <summary>
        /// マウスが動かされた場合の処理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void control_MouseMove(object sender, MouseEventArgs e)
        {
            if (!this.doAction) { return; }

            if (this.isDragged)
            {
                //Point point = this.control.PointToScreen(new Point(e.X, e.Y));
                Point point = ((Control)sender).PointToScreen(new Point(e.X, e.Y));
                this.control.Top += point.Y - this.point.Y;
                this.control.Left += point.X - this.point.X;
                //this.control.Top += e.Y - this.point.Y;
                //this.control.Left += e.X - this.point.X;
            }
            else
            {
                if (this.IsRange(e))
                {
                    this.control.Cursor = Cursors.SizeAll;
                }
            }
        }

        /// <summary>
        /// マウスがアップした場合の処理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void control_MouseUp(object sender, MouseEventArgs e)
        {
            if (!this.doAction) { return; }

            this.isDragged = false;
        }

        /// <summary>
        /// マウスがダウンされた場合の処理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void control_MouseDown(object sender, MouseEventArgs e)
        {
            if (!this.doAction) { return; }

            if (this.IsRange(e))
            {
                //this.point.X = e.X;
                //this.point.Y = e.Y;
                //this.point = this.control.PointToScreen(new Point(e.X, e.Y));
                this.point = ((Control)sender).PointToScreen(new Point(e.X, e.Y));

                this.isDragged = true;
            }
        }

        private bool IsRange(MouseEventArgs e)
        {
            Rectangle range = new Rectangle(this.margin, this.margin, this.control.Width - this.margin * 2, this.control.Height - this.margin * 2);
    
            return range.Contains(e.Location);
        }
    }

引用返信 編集キー/
■49778 / inTopicNo.4)  Re[1]: ユーザコントロールをマウスで移動する場合の処理について
□投稿者/ やじゅ (1613回)-(2010/05/16(Sun) 21:10:13)
やじゅ さんの Web サイト
2010/05/16(Sun) 22:20:31 編集(投稿者)

No49750 (MONONOKE さん) に返信
> UseControlに配置しているLabelやPictureBoxのイベントを無視して、
> 最背面にあるUserControlのイベントを発生させることは出来るのでしょうか?

NativeWindow クラスを使用して、LabelやPictureBoxのマウスイベントを無視は出来ます。
UserControlへ同イベントを投げる必要があるか確認してないので分からないですけど。
こんな方法もあるよってことで挙げておきます。

.NET でもサブクラス化
http://blogs.wankuma.com/youryella/archive/2007/06/09/80137.aspx

NativeWindow クラス
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.nativewindow
引用返信 編集キー/
■49779 / inTopicNo.5)  (削除)
□投稿者/ -(2010/05/16(Sun) 22:09:33)
この記事は(管理者)削除されました
引用返信 編集キー/
■49781 / inTopicNo.6)  Re[3]: (削除)
□投稿者/ nori (107回)-(2010/05/16(Sun) 23:00:50)
void control_MouseMove(object sender, MouseEventArgs e)
の部分を以下に変えるとどうですか?
Point point = ((Control)sender).PointToScreen(new Point(e.X, e.Y));
this.control.Top += point.Y - this.point.Y;
this.control.Left += point.X - this.point.X;
this.point = point; // ★これ追加★
引用返信 編集キー/
■49782 / inTopicNo.7)  Re[4]: (削除)
□投稿者/ MONONOKE (4回)-(2010/05/17(Mon) 01:13:44)
>やじゅさん
回答ありがとうございます。
NativeWindows見さしていただきましたが、
なかなかムツカシそうです。
じっくりと考えながら再読させていただきます。

>noriさん
追加してみましたが、うまく動きませんでした。
なんといいますか、ブルブルと震えるような感じになってしまっています。
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -