マウスクリックを実装する場合、WindowsとGtk#の間には、次の2つの主な違いに注意する必要があります。
- Gtk#は、「ダブルクリック」シグナル(Windows用語では「イベント」)を提供しませんが、シングル「クリック」シグナルのみを提供します。ただし、Gdkライブラリは、EventButtonクラスでダブルクリックとトリプルクリックの両方を実装しています。
- Gtk#は、ウィジェット(またはWindows用語では「コントロール」)と「コンテナー」(Windowsには直接比較できるものはありません)を区別します。Gtk#フォームに配置されたほとんどのウィジェットは、マウスクリックイベントを受け取りません。マウスイベントを受信するには、ウィジェットを特定のコンテナ(EventBoxなど)内に配置する必要があります。
これがあなたがそれをする方法ですGtk#:
A.フォームにEventBoxコンテナを追加します(以下の例では、eventbox1)。特に選択しない限り(または背景色を変更しない限り)、他のウィジェットの後ろに配置することも、表示されないために配置することもできます。EventBox内にウィジェットを配置できますが、ウィジェットは1つに制限されており、EventBoxの形状とサイズも取得されます。
B.このEventBoxに、「CommonWidgetSignals」からのシグナル「ButtonPressEvent」を追加します(以下の例では、OnEventbox1ButtonPressEvent)。
EventBox内でマウスボタン(左、中央、中央、またはそれらの組み合わせ)がクリックされるたびに、このイベントがトリガーされ、関数OnEventbox1ButtonPressEvent()が呼び出されます。このイベントの処理中にクリックされたボタンを特定する必要がある場合は、次のuint値を使用します。args.Event.Button通常、「1」はマウスの左ボタン、「2」は中央のボタン、「3」は右のボタンです。 (「2」は、左ボタンと右ボタンの両方がクリックされた場合にも表示される場合があります)。
ちなみに、マウスモーションイベント(ボタンを押さない場合)はデフォルトでは送信されません。したがって、それらを感知する必要がある場合は、以下のコード例の最初のようなものにPointMotionMaskも追加する必要があります。
次に、EventButtonクラスを使用してダブルクリックイベントをキャッチするButtonPressイベントハンドラー(EventBox名は「eventbox1」)のコード例を示します。
// The following line is may not be needed but is here to show how to do it
eventbox1.GdkWindow.Events = eventbox1.GdkWindow.Events | Gdk.EventMask.ButtonPressMask;
protected void OnEventbox1ButtonPressEvent (object o, ButtonPressEventArgs args)
{
if( ((Gdk.EventButton)args.Event).Type == Gdk.EventType.TwoButtonPress)
System.Media.SystemSounds.Beep.Play (); // Play a sound only if this is a double-click event
}
受信したイベントの順序(ダブルクリックの場合)は次のとおりです。
- Gdk.EventType.ButtonPress
- Gdk.EventType.ButtonRelease
- Gdk.EventType.ButtonPress
- Gdk.EventType.TwoButtonPress
- Gdk.EventType.ButtonRelease
お役に立てば幸いです。