4

過去2か月間、Visual StudioのC#でアプリケーションを作成しました。次に、MonodevelopによってそのアプリケーションをLinuxに移植する必要があります。さて、私はすでにほとんどの移植エラーを解決しましたが、私が理解できないものがあります。Visual Studioからのすべてのダブルクリックおよびマウスのダブルクリックイベントが機能しなくなりました-フォームと1つのイベント(ダブルクリック)のみでMonoに移植した小さな1-フォームアプリケーションを作成しました-それも機能しませんでした-つまり、Monodevelopはダブルを移植できませんVisual Studioからイベントをクリックしますか?私はすでにWND_Proc関数をチェックしましたが、Linuxは対応するダブルクリックイベントをスローしません(ウィンドウ内では515、タイトルバーでは300でした...)。私はすでにあきらめて、私のコードのすべてのダブルクリックの問題を修正するための追加のコードを書く準備をしていますが、誰かが答えを持っているかもしれません。

Ubuntu linux(必要に応じて、カーネルのバージョンを明日チェックする可能性があります)、MONO:2.8.3、Visual Studio 2008、および.NET3.5のプロジェクトを使用しています。

4

2 に答える 2

2

マウスクリックを実装する場合、WindowsとGtk#の間には、次の2つの主な違いに注意する必要があります。

  1. Gtk#は、「ダブルクリック」シグナル(Windows用語では「イベント」)を提供しませんが、シングル「クリック」シグナルのみを提供します。ただし、Gdkライブラリは、EventButtonクラスでダブルクリックとトリプルクリックの両方を実装しています。
  2. 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
}

受信したイベントの順序(ダブルクリックの場合)は次のとおりです。

  1. Gdk.EventType.ButtonPress
  2. Gdk.EventType.ButtonRelease
  3. Gdk.EventType.ButtonPress
  4. Gdk.EventType.TwoButtonPress
  5. Gdk.EventType.ButtonRelease

お役に立てば幸いです。

于 2012-09-08T00:52:24.633 に答える
0

GTK#は、ダブルクリックイベントをWindowsフォームとは異なる方法で処理します。イベントを変換するコードを作成する必要があります。あなたがそれをしているなら、あなたはイディオムとしてダブルクリックに反対することに時間を費やしたほうがよいでしょう。

于 2012-09-07T20:47:13.930 に答える