65.9K
CodeProject 正在变化。 阅读更多。
Home

我的 QuickMouseMenu

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.87/5 (5投票s)

2007年8月11日

CPOL

2分钟阅读

viewsIcon

43109

downloadIcon

1405

我的 QuickMouseMenu

QuickMouseMenu1.jpgQuickMouseMenu2.jpg

引言

我正在为一家公司开发一个集成系统,具有很多功能(CRM、发票、商店、保修管理、财务等)。因此,该应用程序有很多表单。

该应用程序的第一个版本有一个ToolStripMenu,大约有8-10个根菜单和许多子菜单。当然,主要功能有快捷键,但不是每个人都喜欢快捷键。也许我们可以使用工具栏,但我不喜欢它们,因为您需要为每个菜单项制作工具栏项,这很麻烦……我想 :)

我在我的应用程序中使用 DevExpress 组件,它们有一个很棒的控件:RibbonControl(类似于新的 MS office 2007)。我认为它是一个非常有用的控件,带有应用程序菜单、状态栏等。(它对用户和开发人员都很有用,因为您可以将相同的“Item”(具有相同处理程序的相同对象)添加到菜单、应用程序菜单、状态栏等...)

但是...与快捷键和上下文菜单相同的问题...所以我决定制作我自己的“上下文菜单”,它可以与 DevExpress 功能区项目一起使用(并非全部,但可以与菜单一起使用)。对于“试点”项目,我为 2.0 MenuStrip 制作了它...

当然,您可以在没有 menustrip 的情况下使用它!!!!

使用代码

因为它是一个试点项目(一个试点测试项目),我没有为控件制作设计支持、错误处理等。真的,它不是一个控件,它是一个表单,但是如果你需要一个 UserControl 或一个组件,你可以简单地做到,带有设计支持...

QuickMenuItem(类 QuickMouseMenuItem)

它是一个简单的类来存储菜单项。

属性

private Image menuimage;

/// <summary>
/// menu image
/// 
public Image MenuImage
{
    get { return menuimage; }
    set { menuimage = value; }
}

private string description = "";

/// <summary>
/// menudescription to tooltip
/// 
public string Description
{
    get { return description; }
    set { description = value; }
}

private string caption = "";

/// <summary>
/// menucaption to tooltip
/// 
public string Caption
{
    get { return caption; }
    set { caption = value; }
}

private string key;

/// <summary>
/// the key to identify the menuitem
/// 
public string Key
{
    get { return key; }
    set { key = value; }
}

你如何使用它?!这非常简单:控件(类 QuickMouseMenuUC)有一个方法(带有一些重载)来添加根项

public QuickMouseMenuItem AddQuickMouseMenuItem(string key, Image img,
                          string Caption, string Description)
{
    QuickMouseMenuItem newitem = new QuickMouseMenuItem(img, Caption,
        Description);
    newitem.Key = key;
    lstRootItems.Add(newitem);

    return newitem;
}

QuickMouseMenuItem 有两种方法可以添加子项

//
/// <summary>
/// Add child menuItem
/// </summary>
/// <param name="childitem" />
/// <returns>
public QuickMouseMenuItem AddChildQuickMouseMenuItem(
                          QuickMouseMenuItem childitem)
{
    lstSubQuickMouseMenuItems.Add(childitem);
    childitem.ParentQuickMouseMenuItem = this;
    return childitem;
}

/// <summary>
/// Add child menu from Menustrip with Click event!!!
/// </summary>
/// </returns>
/// <param name="menustrip">
/// <returns>
public QuickMouseMenuItem CreateChildQuickMouseMenuItemFromMenuStrip(
       System.Windows.Forms.ToolStripMenuItem menustrip)
{
    QuickMouseMenuItem childitem = new QuickMouseMenuItem();
    childitem.caption = menustrip.Text;
    childitem.description = menustrip.ToolTipText;
    if (menustrip.Image == null)
    {                    
        childitem.menuimage = resQMM.defaultIMAGE;
    }
    else
    {
        childitem.menuimage = menustrip.Image;
    }
    tsmenuitem = menustrip;

    lstSubQuickMouseMenuItems.Add(childitem);
    childitem.ParentQuickMouseMenuItem = this;
    return childitem;
}

如果您想将其与 MenuStrip 一起使用,您需要使用第二种方法,如果您想将其与其他菜单、工具栏等一起使用,请编写您自己的方法!!!

而且使用它的唯一一件事就是,您需要将控件(Form)添加到您的应用程序中,例如

//create quickmenu
QMM.QuickMouseMenuUC quickMouseMenuUC1 = new QMM.QuickMouseMenuUC();

quickMouseMenuUC1.Size = new Size(200, 200);

//setttings
//hide when leave, if false close than back click on top level
quickMouseMenuUC1.HideOnMouseLeave = true;

//if have submenu than navigate
quickMouseMenuUC1.NavigateOnHover = true;
foreach (Control act in this.Controls)
{
    //i add the handler to mdifrom mdiclient area
    if (act is MdiClient)
    {
        // add to mouse down event
        // do it for that controls you want...
        act.MouseDown += new MouseEventHandler(
            quickMouseMenuUC1.Parent_MouseDown);
        break;
    }
}

//QuickMenuItem click event...
quickMouseMenuUC1.QuickMenuItemClicked +=new MouseEventHandler(
     quickMouseMenuUC1_QuickMenuItemClicked);

示例应用程序包含一个 MDI 应用程序。演示,其中包含一些演示菜单,当用户单击 mdiclient 区域时出现。一些演示菜单项

//add some test menu
quickMouseMenuUC1.AddQuickMouseMenuItem(respic.addd, "Add",
    "Adding new value...");
quickMouseMenuUC1.AddQuickMouseMenuItem(respic.cancel, "Cancel",
    "Cancel last operation...");
QMM.QuickMouseMenuItem file_menu = 
    quickMouseMenuUC1.AddQuickMouseMenuItem(respic.AppMenu32, "File",
    "File menu");
//add some test menu from toolstripitem
file_menu.CreateChildQuickMouseMenuItemFromMenuStrip(newToolStripMenuItem);
file_menu.CreateChildQuickMouseMenuItemFromMenuStrip(closeToolStripMenuItem);

//some menu with sub menu...
quickMouseMenuUC1.AddQuickMouseMenuItem(respic.user, "Users", "Useres form");
QMM.QuickMouseMenuItem qmm_eamil = quickMouseMenuUC1.AddQuickMouseMenuItem(
    respic.email2, "email");

QMM.QuickMouseMenuItem qmm_print = qmm_eamil.AddChildQuickMouseMenuItem(
    new QMM.QuickMouseMenuItem(respic.print, "Print", ""));

qmm_eamil.AddChildQuickMouseMenuItem(new QMM.QuickMouseMenuItem(respic.sync,
    "Sync", ""));

qmm_print.AddChildQuickMouseMenuItem(new QMM.QuickMouseMenuItem(respic.copy,
    "Copy", ""));
qmm_print.AddChildQuickMouseMenuItem(new QMM.QuickMouseMenuItem(respic.addd,
     "Add printer", "add printer"));

现在完成了!!!

所以它是一个简单的“控件”,在一个简单的演示中,如果您喜欢它,请下载并自定义它,无论您想要什么,以及您的应用程序需要什么!!!

我在我的应用程序中这样做,并且使用 devexpress 控件 (http://www.devexpress.com/Products/NET/WinForms/Index.xml)。

尽情享受并投票。

历史

Beta 1。

© . All rights reserved.