2012-02-29 5 views
4

私はカスタムコンテキストメニューを作成したいと思います。そのアイデアは、ボタンとラベルのリストを持つtextBoxを持つパネルを作成し、それを右クリックして表示してcontextMenuのように正しく動作させることです。私はおそらく境界線のないフォームを使用することができますが、そこから導き出すことができるクラスがあると思っていました。コンテキストメニューとシェーディングの位置を処理するのに役立ちます。何か案は? ありがとうございますカスタムコンテキストメニュー

編集:いくつかのアイデアをクリアする例:フォームにラベルがある場合、右クリック(または左クリック)するとメニューが表示されます。このメニューは古典的なコンテキストメニューではなく、私が作成したコントロールを持つカスタムパネルです。一例は、アイテムのリストを含む検索ボックスのトップです。文字を入力すると、リストは一致する項目にトリムされ、項目がクリックされると、コンテキストメニューが消え、選択した値が最初にクリックされたラベルに表示されます。

+1

私はあなたがここにWinformsの話をしているそれを取りますか? –

+0

明らかに、ツールボックスのContextMenuStripコントロールが見付かりませんでした。 – adelphus

+0

いいえ、私はそれを見逃していませんでした。はい、これはC#のwinformsです。 – amnesyc

答えて

3

あなたがここで説明する方法で使用することができます。

http://www.codeproject.com/Articles/22780/Super-Context-Menu-Strip

をContextMenuStripを使用するので、その位置を設定することができます:

contextMenuStrip1.Show(Cursor.Position); 

と影の効果:

http://msdn.microsoft.com/en-us/library/system.windows.controls.contextmenu.hasdropshadow.aspx

+0

これを調べます。ありがとうございました!!! – amnesyc

3

最も簡単な方法(これは実際のメニューではありませんので)ボーダレスフォームを作成し、それに影を追加するには、次のようになります。位置について

public class ShadowForm : Form 
{ 
    // Define the CS_DROPSHADOW constant 
    private const int CS_DROPSHADOW = 0x00020000; 

    // Override the CreateParams property 
    protected override CreateParams CreateParams 
    { 
     get 
     { 
      CreateParams cp = base.CreateParams; 
      cp.ClassStyle |= CS_DROPSHADOW; 
      return cp; 
     } 
    } 
} 

は、それまであまりありません。 Cursor.Positionをチェックするか、MouseUpイベントハンドラの引数を使用して座標を設定してください。

public partial class ParentForm : Form 
{ 
    public ParentForm() 
    { 
     InitializeComponent(); 
    } 

    protected override OnMouseUp(object sender, MouseEventArgs e) 
    { 
     if (e.Button == MouseButtons.Right) 
     { 
      var menu = new CustomMenu(); 
      menu.Location = PointToScreen(e.Location); 
      menu.Show(this);     
     } 
    } 
} 

と "メニュー" フォームの:

完全なコードは次のようになります

public partial class CustomMenu : Form 
{ 
    public CustomMenu() 
    { 
     InitializeComponent(); 
     this.StartPosition = FormStartPosition.Manual; 
    } 

    private const int CS_DROPSHADOW = 0x00020000; 
    protected override CreateParams CreateParams 
    { 
     get 
     { 
      CreateParams cp = base.CreateParams; 
      cp.ClassStyle |= CS_DROPSHADOW; 
      return cp; 
     } 
    } 

    protected override void OnLostFocus(EventArgs e) 
    { 
     this.Close(); 
     base.OnLostFocus(e); 
    } 
} 
+0

私はあるクラスから派生することによって、私のカスタムメニューをデザインモードでContextMenuのように使うことができると考えていました。しかし、はい、私はこれが仕事をすることができることに同意します。ありがとうございました。 ContextMenuの外側をクリックすると消えますが、あなたの例ではこれをどのように扱いますか? – amnesyc

関連する問題