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

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

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

Re[3]: マウスの左ボタン以外の無効化


(過去ログ 24 を表示中)

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

■10826 / inTopicNo.1)  マウスの左ボタン以外の無効化
  
□投稿者/ エイジ (1回)-(2007/11/27(Tue) 19:47:27)

分類:[C#] 

ボタンクラスを拡張して、オートリピートボタンを作ろうとしています。
長押しするとクリックイベントが一定間隔で連続して起こるボタンクラスです。

↓こんな感じ
namespace 〜〜
{
/// <summary>
/// オートリピート機能を持ったボタンクラス
/// </summary>
public class AutoRepeatButton : Button
{
...............................
}

...................................

}

しかし、マウスの左ボタンでオートリピートボタンを押し下げ中にマウスの右ボタンを押し下げ上げるとマウスのキャプチャが無効になってしまい何かと困ります。
.NetFramework2.0では、マウスイベントで用意されているメソッド(OnMouseUpなど)は左・右ボタンに関係なく呼ばれてしまいます。
イベント変数を用いれば関数内で左・右どのボタンが押されたかは判断できますがメソッドが呼ばれてしまうことには変わりありません(マウスキャプチャが無効になってしまう)。
そこで、マウスの左ボタン以外を無効にしたい(ボタンが押されてもイベントが発生しないなど)のです。

丸投げに近いお願いで恐縮ですが、ご教授よろしくお願いします。


PS .Netframework3.0は使えない状況です。

引用返信 編集キー/
■10833 / inTopicNo.2)  Re[1]: マウスの左ボタン以外の無効化
□投稿者/ カンタービレ (106回)-(2007/11/27(Tue) 22:29:28)
No10826 (エイジ さん) に返信
> .NetFramework2.0では、マウスイベントで用意されているメソッド(OnMouseUpなど)は左・右ボタンに関係なく呼ばれてしまいます。
> イベント変数を用いれば関数内で左・右どのボタンが押されたかは判断できますがメソッドが呼ばれてしまうことには変わりありません(マウスキャプチャが無効になってしまう)。
> そこで、マウスの左ボタン以外を無効にしたい(ボタンが押されてもイベントが発生しないなど)のです。
>
> 丸投げに近いお願いで恐縮ですが、ご教授よろしくお願いします。
>
>
その拡張コントロール上で、WndProcをオーバーライドしてみてはいかがでしょうか?
呼ばれてほしくないイベントをオーバーライドしたWndProc上で破棄することで実現できそうデス。
引用返信 編集キー/
■10837 / inTopicNo.3)  Re[1]: マウスの左ボタン以外の無効化
□投稿者/ 渋木宏明(ひどり) (573回)-(2007/11/27(Tue) 23:12:24)
渋木宏明(ひどり) さんの Web サイト
> しかし、マウスの左ボタンでオートリピートボタンを押し下げ中にマウスの右ボタンを押し下げ上げるとマウスのキャプチャが無効になってしまい何かと困ります。
> .NetFramework2.0では、マウスイベントで用意されているメソッド(OnMouseUpなど)は左・右ボタンに関係なく呼ばれてしまいます。
> イベント変数を用いれば関数内で左・右どのボタンが押されたかは判断できますがメソッドが呼ばれてしまうことには変わりありません(マウスキャプチャが無効になってしまう)。

フラグ変数を1個用意して回避するのが、ごく普通の対応と思います。

引用返信 編集キー/
■10875 / inTopicNo.4)  Re[2]: マウスの左ボタン以外の無効化
□投稿者/ エイジ (2回)-(2007/11/29(Thu) 11:05:34)
カンタービレさん、渋木宏明(ひどり) さん返信ありがとうございます。

また、返信遅くなってすいません。


※WndProcをオーバーライドしてやってみました。
↓な感じです、うまくいっているようです。
protected override void WndProc(ref Message m)
{

//メッセージの選択
switch (m.Msg)
{
//マウス右ボタンの押し下げのメッセージを無効化
case WM_RBUTTONDOWN:
m.Result = (IntPtr)0;
return;
//マウス右ボタンを離した時のメッセージを無効化
case WM_RBUTTONUP:
m.Result = (IntPtr)0;
return;

        ・・・・・・・・
}

base.WndProc(ref m);
}



※左ボタンの押し下げ、押し上げ状態のフラグを作っても実現できました。
マウスキャプチャが離れる時呼ばれるOnMouseChangeCapture()で、左ボタン押し下げ状態であれば
強制的にキャプチャをtrueにするようにしてやればできたもようです。
↓な感じです。

protected override void OnMouseCaptureChanged(EventArgs e)
{
base.OnMouseCaptureChanged(e);

//マウスの左ボタンが押し下げられている時はキャプチャを有効にする
if (isMouseLeftButtonDown)
{
this.Capture = true;
}
i++;
Console.WriteLine("Capturechange{0} {1}", i, this.Capture);
}


改めて、ありがとうございました。

引用返信 編集キー/
■10903 / inTopicNo.5)  Re[3]: マウスの左ボタン以外の無効化
□投稿者/ エイジ (3回)-(2007/11/30(Fri) 12:23:22)
解決済みにするのを忘れていました。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -