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

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

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

Re[2]: 左ボタンが押された状態でのMouseMoveイベントキャッチ


(過去ログ 58 を表示中)

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

■32923 / inTopicNo.1)  左ボタンが押された状態でのMouseMoveイベントキャッチ
  
□投稿者/ たこやき (92回)-(2009/02/17(Tue) 18:53:07)

分類:[C#] 

VS2008 C#
いつも大変お世話になっています。

マウスの左ボタンを押した状態で別のコントロール内にマウスを進入させるのですが、
そうした場合通常は、別のコントロールのMouseMoveイベントが機能しませんが、
それを機能させるにはどうしたらいいのでしょうか。

失敗例
        class aaa : Control
        {
            const int WM_MOUSEMOVE = 0x200;   // このWindeowsMessageではだめです。 
            protected override void WndProc(ref Message m)
            {
                switch (m.Msg)
                {
                    case WM_MOUSEMOVE:
                        Console.WriteLine("aaa>>> " + m.Msg); break;
                }
                base.WndProc(ref m);
            }
        }

ご指導よろしくお願いいたします。

引用返信 編集キー/
■32931 / inTopicNo.2)  Re[1]: 左ボタンが押された状態でのMouseMoveイベントキャッチ
□投稿者/ 魔界の仮面弁士 (997回)-(2009/02/17(Tue) 21:38:44)
No32923 (たこやき さん) に返信
> そうした場合通常は、別のコントロールのMouseMoveイベントが機能しませんが、
> それを機能させるにはどうしたらいいのでしょうか。

別のコントロールの MouseMove 発動中、元コントロール(aaa)の MouseMove も発動されねばなりませんか?
それとも、その座標にあるコントロールに対してのみ MouseMove が発生すれば良いのでしょうか?


とりあえず、Capture プロパティを false にするという案。


public partial class Form1 : Form
{
 private aaa ctrl;
 public Form1()
 {
  InitializeComponent();
  ctrl = new aaa();
  ctrl.Size = new Size(100, 100);
  Controls.Add(ctrl);
  ctrl.MouseMove += new MouseEventHandler(ctrl_MouseMove);
 }

 void ctrl_MouseMove(object sender, MouseEventArgs e)
 {
  listBox1.Items.Insert(0, "aaa - " + e.Location.ToString());
 }

 private void panel1_MouseMove(object sender, MouseEventArgs e)
 {
  listBox1.Items.Insert(0, "panel1 - " + e.Location.ToString());
 }

 private void panel1_MouseEnter(object sender, EventArgs e)
 {
  panel1.BackColor = Color.Yellow;
 }

 private void panel1_MouseLeave(object sender, EventArgs e)
 {
  panel1.BackColor = Color.Empty;
 }
}

class aaa : Control
{
 protected override void OnMouseMove(MouseEventArgs e)
 {
  base.Capture = false; //★
  base.OnMouseMove(e);
 }
 protected override void OnPaintBackground(PaintEventArgs pevent)
 {
  base.OnPaintBackground(pevent);
  using (Pen p = new Pen(Color.Blue, 2))
  {
   p.Alignment = PenAlignment.Inset;
   pevent.Graphics.DrawRectangle(p, pevent.ClipRectangle);
  }
 }
}
引用返信 編集キー/
■32940 / inTopicNo.3)  Re[2]: 左ボタンが押された状態でのMouseMoveイベントキャッチ
□投稿者/ Azulean (298回)-(2009/02/17(Tue) 23:55:01)
ボタンが押されたままのマウス移動はドラッグ操作というようなものになるんですよね。

.NETのコントロールでは自動的にマウスキャプチャが設定(CaptureInternal)されて、ボタンを離すまでは他のウィンドウにメッセージを渡さずに奪い続けるようにはなっています。
キャプチャを無理矢理外せばできるのかもしれませんが、めんどくさいかもしれません。
引用返信 編集キー/
■32963 / inTopicNo.4)  Re[2]: 左ボタンが押された状態でのMouseMoveイベントキャッチ
□投稿者/ たこやき (93回)-(2009/02/18(Wed) 10:43:57)
No32931 (魔界の仮面弁士 さん) に返信

いつも本当にありがとうございます。

> それとも、その座標にあるコントロールに対してのみ MouseMove が発生すれば良いのでしょうか?
> とりあえず、Capture プロパティを false にするという案。
>   base.Capture = false; //★

ばっちりうまく行きました。
魔界の仮面弁士さんから返信を頂くと、「やったー!」とすごい幸福感に
見舞われます。それほどにご丁寧なご助言をいつもしてくださり、
申し訳なく感じます。多くのみなさんもそう思っておられることでしょう。
ありがとうございました。


Azuleanさん ご返信ありがとうございます。

>ボタンが押されたままのマウス移動はドラッグ操作というようなものになるんですよね。
>.NETのコントロールでは自動的にマウスキャプチャが設定(CaptureInternal)されて、
>ボタンを離すまでは他のウィンドウにメッセージを渡さずに奪い続けるようにはなっています。
全く知らなかったです。勉強になりました。
ドラッグ操作でも試みてみたのですが、うまく行かず投稿したのですが、
聞いてよかったです。大変勉強になりました。 
ありがとうございました。




解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -