none
Winform中右键菜单显示问题请教 RRS feed

  • 问题

  •  

    如果ContextMenuStrip的长度超过了屏幕的高度,会自动在屏幕上下两端增加箭头,而不是分成多列来显示,如何能实现菜单的多列显示?
    在VB中使用API中的ModifyMenu可以实现菜单的分列显示。

    在C#中如果不使用API,ContextMenuStrip是否可以通过属性改变显示方式?
    在网上搜索有介绍说 Layout 和LayoutStyle可以实现,但尝试无效。如果必须使用API才可以实现的话,
    ModifyMenu在C#中如何使用?

    我是这样写的,但是不管用:
    在窗体中增加一个(ContextMenuStrip) Name=cmsListColumns

    const long MF_BYPOSITION = 0x400; 
    const long MF_MENUBARBREAK = 0x20;
    const long MF_MENUBREAK = 0x40; 

    [DllImport("user32", EntryPoint = "ModifyMenuA")]
    private static extern long ModifyMenu(long hMenu, long nPosition, long wFlags, long wIDNewItem, string lpString);
    private static extern long GetSubMenu(long hMenu, long nPos);
    [DllImport("user32", EntryPoint = "GetMenuItemID")]

    Form_Load()
    {
        for(int i=0; i<100;i++
        {
             ToolStripMenuItem tsmi = new ToolStripMenuItem();
             tsmi.Text="菜单项目" + i.ToString();
             cmsListColumns.Items.Add(tsmi);
             if(i==50)
             {
                      ModifyMenu(cmsListColumns.Handle, 50, MF_MENUBARBREAK, GetMenuItemID(cmsListColumns.Handle,50), "Menu Item ");
             }
        }
    }

    dog
    2011年5月27日 6:57

答案

  • Hi, 尝试修改代码如下:

      const long MF_BYPOSITION = 0x400;
            const long MF_MENUBARBREAK = 0x20;
            const long MF_MENUBREAK = 0x40;

            [DllImport("user32", EntryPoint = "ModifyMenuA")]
            private static extern long ModifyMenu(IntPtr hMenu, long nPosition, long wFlags, long wIDNewItem, string lpString);
            private static extern long GetSubMenu(long hMenu, long nPos);
            [DllImport("user32")]
            static extern uint GetMenuItemID(IntPtr hMenu, int nPos);


            private void Form2_Load(object sender, EventArgs e)
            {
                for (int i = 0; i < 100; i++)
                {
                    ToolStripMenuItem tsmi = new ToolStripMenuItem();
                    tsmi.Text = "菜单项目" + i.ToString();
                    cmsListColumns.Items.Add(tsmi);
                    if (i == 50)
                    {
                        ModifyMenu(cmsListColumns.Handle, 50, MF_MENUBARBREAK, GetMenuItemID(cmsListColumns.Handle, 50), "Menu Item ");
                    }
                }


    Paul Zhou [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 Paul Zhou 2011年6月6日 5:36
    2011年5月31日 9:08