返回首页

{A}{S0}简介
我最喜爱的桌面小工具之一是/谷歌桌面工具栏,但因为谷歌的工作人员决定停止其发展,我决定建立它的一个克隆。
在寻找它的GUI,出现的第一个问题,是像菜单显示切换按钮。我GOOGLE了很多,如果没有平等的组成部分,但没有成功,所以我已经开始思考,我必须遵循开发一个组件具有相同的外观和感觉的方式寻求类似。
首选,自然,使用ToggleButton的,但也是这个组件没有直接提供的。NET,但只是作为一个COM组件。使用COM组件,如果没有必要,可以减少代码的清洁。一些测试表明,与切换般的感觉的一个组成部分,作为一个特殊的外观复选框。因此,我们可以开始编码..."守则"

public partial class ButtonMenu : CheckBox

在构造函数中,我设立的基本面貌面向属性:{C}
使用CheckBox的基类赋予我的能力,以减少codenbsp的,我需要编写,以达到我的目标。唯一的代码,我需要添加特定菜单....把此菜单!
private ContextMenuStrip menu=null;

public ContextMenuStrip Menu

{

    get

    {

        return menu;

    }

    set

    {

        /*

         * If menu != null then we have a menu to clean before to change

         */

        if(menu!=null)

            menu.Closed -= menu_Closed;

        

        menu = value;

        if(menu != null)

            menu.Closed += menu_Closed;

    }

}

使用属性给了我两个优点:我可以改变它在设计时我可以在一个简单的方法管理的添加和移除事件处理程序
的先例代码,我们已经介绍的方法menu_Closed。它是这样的:
private bool frombutton = false;

void menu_Closed(object sender, ToolStripDropDownClosedEventArgs e)

{

    /*

     * Popup Menu closing... raise the button

     */

    if(!frombutton)

        Checked = false;

    

}

布尔标志frombutton,是用来检查菜单关闭的原因,在细节的真实,如果菜单已关闭按钮事件由于它是假的,如果它失去焦点封闭。主要方法是简单... ...之后,你已经明白显示方法的行为:
private void DisplayMenu()

{

    // No menu...

    if (menu == null)

        return;

    

    Point offset = new Point();

    switch (direction)

    {

        case ToolStripDropDownDirection.AboveLeft:

            offset.X = menu.Width;

            offset.Y = 0;

            break;

        case ToolStripDropDownDirection.AboveRight:

            offset.X = this.Width-menu.Width;

            offset.Y = 0;

            break;

        case ToolStripDropDownDirection.BelowLeft:

            offset.X = menu.Width;

            offset.Y = this.Height;

            break;

        case ToolStripDropDownDirection.BelowRight:

            offset.X = this.Width - menu.Width;

            offset.Y = this.Height;

            break;

        case ToolStripDropDownDirection.Default:

            offset.X = (this.Width - menu.Width)/2;

            offset.Y = this.Height;

            break;

        case ToolStripDropDownDirection.Left:

            offset.X = 0;

            offset.Y = 0;

            break;

        case ToolStripDropDownDirection.Right:

            offset.X = this.Width;

            offset.Y = 0;

            break;    

    }

    

    menu.Show(this, offset, direction);

在上面的代码,方向是在ToolStripDropDownDirection枚举值用一个标准的get / set方法对访问。使用
作为代码,还指示很简单,添加ButtonMenu组件后,你工具箱,拖动窗体上的设置菜单属性和属性页(或通过代码)。享受。编辑:我已经合并autoplacing BlackTigerAP(我做了一个小quot书面代码的情况下compressionquo​​t,以减少代码复制我已经添加了一个新的公共财产ButtonMenuStyle风格从设计,平面和按钮样式之间切换。课程:
public enum ButtonMenuStyle

{

  Flat = 0,

  Button = 1,

}

回答

评论会员:zohre_j 时间:2011/12/06
我都试图使您的代码工作在NET 1.1,但没有toolStripMenuItem.popDownDirection(我不知道我写是正确的)那里,也没有菜单宽度。或长度,所以我不知道该怎么办!你能帮助我吗?

- 修改1:09(星期六)七月十五日,2006年
评论会员:Doncp 时间:2011/12/06
NET 1.1是内置的。没有ToolStripMenuItem
。ToolStripItem的控制是新的控制在2.0净
评论会员:。lbenini 时间:2011/12/06
尼斯控制!但是,我无法弄清楚如何
创建一个事件处理程序(successfully!
)一个菜单项(即menuEntry3ToolStripMenuItem)
我的尝试:
& #160; menuEntry3ToolStripMenuItem.Click =新的EventHandler(menu​​Entry3ToolStripMenuItem_Click)

无效menuEntry3ToolStripMenuItem_Click(对象发件人,EventArgs的发送)
{
/ /从来没有得到这里!
Console.WriteLine("点击数:{0}",E)
}
我错过什么?

另外,我改变了文本的菜单项(
Items.Collection,但它并没有显示出来,当我点击
按钮。

我知道我会觉得愚蠢的,当我找到了如何做到这一点,
但我没有用ContextMenuStrips多,如果在所有



评论会员:Doncp 时间:2011/12/06
你能发表你的代码
反正在形式下面的代码:

ContextMenuStrip ms = new ContextMenuStrip();

ToolStripMenuItem tsmi = new ToolStripMenuItem("Hi");

ms.Items.Add(tsmi);

tsmi.Click += new EventHandler(testShow);

this.ContextMenuStrip = ms;



void testShow(object sender, EventArgs e)

{

   MessageBox.Show(((ToolStripMenuItem)sender).Text);

}

ToolStripMenuItem的工作和工作的处理程序添加了一个工作的ContextMenuStrip。
如果您使用的GUI设计师:
新增的ContextMenuStrip形式从工具箱
添加ToolStripMenuItem写作中的ContextMenuStrip
它的名字双击驱动器已添加的处理程序。
ButtonMenu不接触的ContextMenuStrip,所以我不认为您的问题与ButtonMenu ...
让我知道!
细则
卢卡

评论会员:lbenini 时间:2011/12/06
好吧,我只是想通了。 (顺便说一句,我使用您的演示代码)。

& #160; ToolStripItem的menuItemProva = buttonMenu2.Menu.Items"provaToolStripMenuItem"]
menuItemProva.Click =新的EventHandler(provaToolStripMenuItem_Click)
&# 160; ToolStripItem的menuItem1 = buttonMenu2.Menu.Items"menuEntry1ToolStripMenuItem"]
menuItem1.Click =新的EventHandler(menu​​Item1_Click)
 60; ToolStripItem的menuItem2 = buttonMenu2.Menu.Items"menuEntry2ToolStripMenuItem"]
menuItem2.Click =新的EventHandler(menu​​Item2_Click)
 0; ToolStripItem的menuItem3 = buttonMenu2.Menu.Items"menuEntry3ToolStripMenuItem"]
menuItem3.Click =新的EventHandler(menu​​Entry3ToolStripMenuItem_Click)

是否有一个更好的办法呢?


评论会员:BlackTigerAP 时间:2011/12/06
不,我不认为... ...

至少:

buttonMenu2.Menu.Items["menuEntry1ToolStripMenuItem"].Click+=new EventHandler(menuItem1_Click);


评论会员:lbenini 时间:2011/12/06
?如何添加"自动"位置BR}
我的意思是,确定按钮的位置和菜单大小的最佳菜单的位置?举例来说,如果没有显示"超越左"(按钮过于接近屏幕钮),那么显示广告"上述左"。

地产像"PreferredPosition"/"DefaultPosition "...{ BR}& #160;
评论会员:BlackTigerAP 时间:2011/12/06
?自动的,它是一个好主意,但自动由父窗口或屏幕的X / Y
这是非常有用... ...但我已经开始工作,就可以开发一个桌面工具栏,所以我的想法是有限的,它的外观和感觉(保持更新,我会上传的代码...){ BR}
评论会员:BlackTigerAP 时间:2011/12/06
我建议:
- 新增"自动"的方向或创造一些"关闭屏幕/窗口"跟踪"属性
样 - 为"自动"的方向,你还需要属性"默认/首选方向"
- 创建属性指定"如何追踪"。 Bcos为"MDI子"的形式,你要跟踪"主"的形式,为其他窗口 - 屏幕(WorkArea!)

我已经修改了你的代码。 但是我只是扭转"方向",如果菜单"关闭屏幕"。

评论会员:lbenini 时间:2011/12/06
你可以得到"我的你"版本


PS:我讨厌平面按钮!

- 修改于9:34(星期二)6月6日,2006年
评论会员:lbenini 时间:2011/12/06
感谢
明天我来看看它。