2017-04-16 7 views
-4

3秒遅れてポインタの周りに4つのボタンを表示させたい。 4つのボタンのうちの1つをホバリングしてアクティブにすると、すべてのボタンが非表示になります。このようC#マウスの周りにボタンを作成

Mouse selection

おかげMetaColonは、あなたは私の命を救っています。

+0

ご迷惑をおかけして申し訳ありません。これらのボタンの作成方法はわかりません。 –

+0

対象とするもの:Winforms、WPF、ASP ..? __Always__あなたの質問に正しくタグを付けてください! – TaW

答えて

0

私はWinFormsを使用していると仮定します。

画像が四角いボタンではなく実際に表示されるという問題があります。これはもう一つの難点ですが、私はそれをあなたの問題に限定したいのです。したがって、あなたはいくつかのことをすることができる必要があります。

  1. マウス位置
  2. は、マウスの動きなしの3秒が動的にボタンの位置を設定するボタン
  3. を作成
  4. を通過したときに呼び出されるメソッドをゲット。

はのステップでこの手順を実行してみましょう:

1.マウスの位置に

を取得するため、あなたがMouseMoveイベントを処理する必要があります。したがって、フォームを選択し、プロパティ(F4キー)に移動し、イベントタブ(稲妻のアイコン)を選択し、MouseMoveのフィールドをダブルクリックします。これによりコード内にForm1_MouseMoveメソッドが作成されます。この方法では、e.Location;でマウスの位置を取得することができます。

private void Form1_MouseMove(object sender, MouseEventArgs e) 
{ 
    var location = e.Location; 
} 

2.マウスの動きなしの3秒。したがって、私はタイマーを使用したい

を通過したときに呼び出されるメソッドを取得:

ここまでの私たちの方法は、そのように見えます。これを行うには、デザイナーに再度切り替えます(F7キーを押します)、ツールボックス(Ctrl + Alt + X)を開き、タイマーアイテムをフォームにドラッグします。新しく作成されたタイマーを選択して(プロパティの下に表示されます)、プロパティタブ(雷ボルトの左にあるアイコン)を選択し、の有効なフィールドをダブルクリックしてをtrueに設定し、 [イベント]タブにもう一度、の右にあるフィールドをダブルクリックします。このメソッドは、100ミリ秒ごとに呼び出されます。次に、_timePassedSinceLastMoveのようなフィールドを追加します。 Form1_MouseMoveが呼び出されると、tickメソッドが呼び出されるたびにこの値が増え、0に再び設定されます。 timer1_Tickメソッドでは、_timePassedSinceLastMoveフィールドが既に30以上であるかどうかを確認します。そうであれば、3秒ごとに呼び出されるメソッドを呼び出します。実際には、マウスの位置が実際の位置と実際の位置が実際とは異なっているかどうかを確認する必要があります。なぜなら、winFormsはそのような場合には少し敏感だからです。したがって、古い場所のフィールドを追加し、新しい場所と比較します。あなたのクラスは今、そのようになります。

public partial class Form1 : Form 
{ 
    private Point _oldMousePosition; 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_MouseMove(object sender, MouseEventArgs e) 
    { 
     var location = e.Location; 
     if (_oldMousePosition == location) 
      return; 
     _oldMousePosition = location; 
     _timePassedSinceLastMove = 0; 
    } 

    private int _timePassedSinceLastMove; 

    private void timer1_Tick(object sender, EventArgs e) 
    { 
     _timePassedSinceLastMove++; 
     if (_timePassedSinceLastMove > 30) 
     { 
      MouseNotMove3Seconds(); 
      _timePassedSinceLastMove = 0; 
     } 
    } 

    private void MouseNotMove3Seconds() 
    { 
    } 
} 

3.動的に私はすべての最も簡単なこのタスクを呼びたいボタン

を作成します。私はそれが最良の例で説明したと思う:私たちは、単に(これは、同様の後ろにコード内で実行される)新しいボタンを作成し、当社のフォームのコントロールにこれを追加し

var button = new Button(); 
Controls.Add(button); 

。ボタンの位置を設定するボタン

の位置を設定する

private void MouseNotMove3Seconds() 
{ 
    var button1 = new Button(); 
    Controls.Add(button1); 
    var button2 = new Button(); 
    Controls.Add(button2); 
    var button3 = new Button(); 
    Controls.Add(button3); 
    var button4 = new Button(); 
    Controls.Add(button4); 
} 

4:私たちは4つのボタンを追加したい場合は、マウスが動かなかった時はいつでも私たちは、単にそのようにそれをやります私たちは、オブジェクト初期化子と同様に、これはより美しく書くことができ

var button1 = new Button(); 
button1.Location = new Point(0, 0); 

:あまりにもどちらか難しいことではありません

var button1 = new Button {Location = new Point(0, 0)}; 

しかし、ここではすべてのボタンが位置0,0にあるのではなく、カーソルの周りにあるようにしたいと考えています。だから我々は(位置は常に左上隅のある)そのようなことをやる:あなたは今、あなたが推移したときにもう一度ボタンを削除したいと言っ

private void MouseNotMove3Seconds() 
{ 
    var button1 = new Button {Location = new Point(_oldMousePosition.X + Cursor.Size.Width, _oldMousePosition.Y)}; 
    Controls.Add(button1); 
    var button2 = new Button {Location = new Point(_oldMousePosition.X - button1.Width/2, _oldMousePosition.Y + Cursor.Size.Height)}; //I cheated a little bit here, but as the buttons are all the same... 
    Controls.Add(button2); 
    var button3 = new Button {Location = new Point(_oldMousePosition.X - (int)(button1.Width * 1.5), _oldMousePosition.Y)}; 
    Controls.Add(button3); 
    var button4 = new Button {Location = new Point(_oldMousePosition.X - button1.Width/2, _oldMousePosition.Y - (int)(button1.Height * 1.5))}; 
    Controls.Add(button4); 
} 

。だから我々は方法ButtonHoveredを作成する必要があります:

private void ButtonHovered(object sender, EventArgs e) 
{ 
    Controls.Clear(); 
} 

今、我々は、単に我々がフォームに追加されたすべてのコンポーネント(ボタン)を削除しています。もちろん、フォームにコンポーネントがある場合は、これらの4つのボタンをコンポーネントから削除して残りの部分を残すだけです。

このメソッドは、まだ処理されていないため呼び出されませんボタンのホバーイベント。したがって、我々は少し私たちのMouseNotMoved3Seconds方法を変更する必要があります:

private void MouseNotMove3Seconds() 
{ 
    var button1 = new Button {Location = new Point(_oldMousePosition.X + Cursor.Size.Width, _oldMousePosition.Y)}; 
    Controls.Add(button1); 
    var button2 = new Button {Location = new Point(_oldMousePosition.X - button1.Width/2, _oldMousePosition.Y + Cursor.Size.Height)}; //I cheated a little bit here, but as the buttons are all the same... 
    Controls.Add(button2); 
    var button3 = new Button {Location = new Point(_oldMousePosition.X - (int)(button1.Width * 1.5), _oldMousePosition.Y)}; 
    Controls.Add(button3); 
    var button4 = new Button {Location = new Point(_oldMousePosition.X - button1.Width/2, _oldMousePosition.Y - (int)(button1.Height * 1.5))}; 
    Controls.Add(button4); 
    button1.MouseHover += ButtonHovered; 
    button2.MouseHover += ButtonHovered; 
    button3.MouseHover += ButtonHovered; 
    button4.MouseHover += ButtonHovered; 
} 

を今、私たちは、ユーザーがいずれかのボタンの上に置いたときに呼び出されますButtonHovered方法、に添付イベントがあります。

ボタンを消したボタンを知りたい場合は、プロパティでイベントを発生させたボタンをButtonHoveredメソッドに渡します。

あなたの写真のボタンにもテキストが書かれているので、それもやってみましょう。したがって、我々はMouseNotMove3Seconds方法でオブジェクト初期化子内のボタンのTextプロパティを変更します:

private void MouseNotMove3Seconds() 
{ 
    var button1 = new Button 
    { 
     Location = new Point(_oldMousePosition.X + Cursor.Size.Width, _oldMousePosition.Y), 
     Text = "B" 
    }; 
    Controls.Add(button1); 
    var button2 = new Button 
    { 
     Location = new Point(_oldMousePosition.X - button1.Width/2, _oldMousePosition.Y + Cursor.Size.Height),//I cheated a little bit here, but as the buttons are all the same... 
     Text = "C" 
    }; 
    Controls.Add(button2); 
    var button3 = new Button 
    { 
     Location = new Point(_oldMousePosition.X - (int)(button1.Width * 1.5), _oldMousePosition.Y), 
     Text = "D" 
    }; 
    Controls.Add(button3); 
    var button4 = new Button 
    { 
     Location = new Point(_oldMousePosition.X - button1.Width/2, _oldMousePosition.Y - (int)(button1.Height * 1.5)), 
     Text = "A" 
    }; 
    Controls.Add(button4); 
    button1.MouseHover += ButtonHovered; 
    button2.MouseHover += ButtonHovered; 
    button3.MouseHover += ButtonHovered; 
    button4.MouseHover += ButtonHovered; 
} 

をこのソリューションは、あなたの写真のようには見えませんが(それは異なる形状のボタンためです)、それはあなたを助ける必要がありますあなたの問題と一緒に。あなたの問題が異なる形のボタンであった場合は、新しい質問をしてください。

私はあなたを助けてくれることを願っています。

+0

ありがとうございます。私はあなたの助けを願います。 –

+0

@YingYoh私はあなたの質問の一部を見逃し、要件に合わせて私の答えを編集しました。 – MetaColon

+0

ありがとう、それは私を助けてくれました。 –

関連する問題