2012-02-29 94 views
4

我想創建一個自定義上下文菜單。這個想法是創建一個帶有文本框一個按鈕和一個標籤列表的面板,並能夠右鍵單擊顯示它,並使其行爲完全像contextMenu。我可以使用無邊界的表單,但我想可能有一個我可以派生出來的類,它可以幫助我處理上下文菜單和底紋的位置。有任何想法嗎? 謝謝自定義上下文菜單

編輯:一個清晰幾個想法的例子:假設你在表單上有一個標籤,當你點擊它(或者甚至是左鍵單擊)時,出現一個菜單。這個菜單不是經典的上下文菜單,而是一個帶有我創建personnaly控件的自定義面板。一個例子是搜索框頂部的項目列表。當您輸入字母時,列表將被修剪爲匹配項目,並且當某個項目被點擊時,上下文菜單將消失,並且所選的值會在我們首次點擊的標籤中顯示。

+1

我想你在談論的WinForms嗎? – 2012-02-29 11:34:36

+0

顯然你錯過了工具箱中的ContextMenuStrip控件。 – adelphus 2012-02-29 11:39:09

+0

不,我沒有錯過,我想創造我自己的,做更多,然後選擇其中的一個項目。是的這是關於C#中的WinForms。 – amnesyc 2012-02-29 11:41:17

回答

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 2012-02-29 12:14:04