web-dev-qa-db-ja.com

アイテムに右クリックメニューを追加する

私はしばらくの間、単一のアイテムのシンプルな右クリックメニューを探していました。たとえば、画像を右クリックすると、追加、削除などの小さなメニューで独自のラベルが表示されるようになります。誰かが助けてくれれば、私は最も素晴らしいでしょう。

見てくれてありがとう。

完成したコードは次のとおりです。

    ContextMenu cm = new ContextMenu();             
    cm.MenuItems.Add("Item 1", new EventHandler(Removepicture_Click));             
    cm.MenuItems.Add("Item 2", new EventHandler(Addpicture_Click));              
    pictureBox1.ContextMenu = cm; 
42
Marshal

コンテキストメニューをフォームに追加し、ContextMenuStripの下のコントロールのプロパティに割り当てます。お役に立てれば :)。

お役に立てれば:

ContextMenu cm = new ContextMenu();
cm.MenuItems.Add("Item 1");
cm.MenuItems.Add("Item 2");

pictureBox1.ContextMenu = cm;
71
Yuki Kutsuya

これは、この質問に対する包括的な答えです。このページはGoogleの検索結果の上位にあり、答えが十分に詳細にならないため、これを行っています。この投稿では、Visual Studio C#フォームの使用に習熟していることを前提としています。これはVS2012に基づいています。

  1. ContextMenuStripをフォームにドラッグするだけで開始します。メニュー項目を追加して、必要に応じて名前を変更できる左上隅に配置します。

  2. コードを表示し、フォームに自分でイベントを入力する必要があります。問題のアイテムのマウスダウンイベントを作成し、そのように右クリックイベントを割り当てます(ContextMenuStripを「rightClickMenuStrip」と呼んでいます)。

    private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
    {
    switch (e.Button)
        {
            case MouseButtons.Right:
            {
                rightClickMenuStrip.Show(this, new Point(e.X, e.Y));//places the menu at the pointer position
            }
            break;
        }
    }
    
  3. イベントハンドラーをform.designerに手動で割り当てます(System.Windows.Formsの「使用」を追加する必要がある場合があります。解決することもできます)。

    this.pictureBox1.MouseDown += new MouseEventHandler(this.pictureBox1_MouseDown);
    
  4. この時点で必要なことは、各メニュー項目をダブルクリックし、他のボタンの場合と同じ方法で各クリックイベントに対して目的の操作を実行することです。

これは、この操作の基本的なコードです。コーディングの慣行に合うように明らかに変更できます。

26
Cheesus Toast

Visual Studioを使用している場合、GUIソリューションもあります。

  1. ツールボックスからContextMenuStripを追加します
  2. コンテキストメニューを選択し、右クリック項目を追加します
  3. 各アイテムに対して、クリックイベントを対応する機能に設定します
  4. 右クリックメニューが接続されるフォーム/ボタン/画像/など(任意のアイテム)を選択します
  5. ContextMenuStripプロパティを作成したメニューに設定します。
12
Dorku

これをいじってしまったので、eX/eYポイントがコントロールに対して相対的であることを知っておくと便利です。フォームの起源。以下の例では、x/yに20を追加して、メニューが少し右およびカーソルの下に表示されるようにしました。

cmDelete.Show(this, new Point(e.X + ((Control)sender).Left+20, e.Y + ((Control)sender).Top+20));
0
Paul