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

创建一个“搜索 Google”上下文菜单

starIconstarIconemptyStarIconemptyStarIconemptyStarIcon

2.00/5 (7投票s)

2008年3月26日

CPOL

4分钟阅读

viewsIcon

28551

介绍如何创建一个实用的“谷歌搜索”上下文菜单(类似 Firefox 中的)。

引言

本文介绍了在 C# .NET 中创建上下文菜单的基础知识,同时也深入探讨了如何动态生成上下文菜单中的文本。您不一定需要掌握所有内容,但即使您不打算这样做,我认为它也很有价值。如果您想在您的程序中添加一个“谷歌搜索”上下文菜单,本文将为您提供一些提示。

背景

在设计程序时,我总是先编写重要的后端代码。这没问题,但到某个时候,我会意识到需要让界面更漂亮(甚至一开始就要创建界面)。一旦我添加了按钮、菜单、偏好设置对话框等便利功能,我就会想,没有它们我怎么活过来的。拥有一个漂亮的界面能让测试程序更愉快——我甚至还没谈论用户会有什么感受。我曾长期忽视用户界面,只专注于算法设计和逻辑,但现在我开始意识到,用户界面能让程序变得好得多。我想,我不会在命令行上浏览网页——我使用 Safari(WebKit),它看起来相当不错。而且我使用 Vista,它具有各种半透明效果和阴影。所以——我喜欢漂亮的界面,因此我应该投入一些精力来创建漂亮的界面。

我的程序有一个书签系统、一些菜单项、一个状态栏和一个输入框,该输入框(在按键时)会即时更新定义文本框。该程序玩起来很有趣。今天我添加了一个功能,允许用户右键单击定义框中的单词,并在上下文菜单中查找该单词。这并不难,但如果事先在测试项目中做过,在关键时刻会容易得多。此功能的一些要求是:

  1. 选中的内容必须以引号的形式出现在上下文菜单中。
  2. 选中的文本在显示在上下文菜单之前必须经过清理(去除无用的字符)。

Using the Code

所以,我这样做是这样的。

  1. 在设计器中创建一个新的窗体元素——上下文菜单控件。当您在窗体的设计器中时,转到右侧的“工具箱”,然后双击 ContextMenu。这将在托盘区域添加上下文菜单的表示。
  2. 在上下文菜单中输入任何静态上下文菜单项(它会出现在左上角)。在第一个截图里,静态文本是“复制”。
  3. 对于 ContextMenu,为以下三个事件添加事件处理程序:OpenedOpeningItemClicked。最好的方法是选择窗体底部设计器托盘中的 ContextMenu,然后转到“属性”窗格,然后单击闪电图标。在那里,您可以看到可以创建的事件。向下滚动到 ItemClickedOpeningOpened 事件,并在 Id 旁边的空白处**双击**。

googlecontextmenu/contextopening.jpg

在上图的例子中,我点击了“托盘”中的 ContextMenu 项目,然后在(右侧的)属性中,我选择了闪电图标,并双击了 Opening 词语旁边的空白处。

确保将上下文菜单连接到您希望它出现的窗体控件!点击您需要上下文菜单的窗体,然后点击它。接着,在属性窗格中,在显示 ContextMenuStrip 的地方,将您的新 ContextMenu 选项设置上去。

googlecontextmenu/contextset.jpg

您可能需要修改选中文本,然后再将其放入上下文菜单的显示中。如果需要,创建一个使用正则表达式或一些简单的输入检查代码的漂亮成员函数。

那么,在哪里生成动态文本呢——在这个例子中是“查找 {string}”,或者在另一个程序中,可能是“谷歌搜索 {string}”。

void contextMenuStrip1_Opened(object sender, EventArgs e)
{
    // get the text from the textbox. then, set the second item in the context menu
    // to the string "Lookup {string}". You could also use the text "Google For".
    string text = textBox1.SelectedText;
    
    // you will want to write a method to "clean up" the text variable here,
    // but you can figure out that easily on your own.
    contextMenuStrip1.Items[1].Text = "Lookup " + text;
    
    // save our lookup string for use later.
    contextMenuStrip1.Tag = text;
} 

最后,我们希望当用户点击 ContextMenu 时能实际执行某些操作!我们将使用 ItemClicked 事件处理程序。如果它尚不存在,请在“属性”中的 ItemClicked 项下双击。这是一个您可以使用的 EventHandler 的例子。实现这些功能有很多种方法。下面是一种方法:

void contextMenuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
    // if we clicked on the "Lookup" item (you could use "Google" or something instead
    if (e.ClickedItem.Text.IndexOf("Lookup") != -1)
    {
        // you can set another text box with the Tag
        inputBox.Text = (string)contextMenuStrip1.Tag;
        
        // or you can start IE, Firefox, or Safari (Windows) and search Google!
        // you can replace this with your national Google, or even another engine.
        Process.Start("http://google.com/search?q=" + (string)contextMenuStrip1.Tag);
    }
}

这将实现第一个截图中的效果。“谷歌搜索”上下文菜单项,随心所欲!如果您使用 Process.Start(),用户偏好的网络浏览器将会弹出。

© . All rights reserved.