.NET开发

本类阅读TOP10

·vs.net 2005中文版下载地址收藏
·NHibernate快速指南(翻译)
·【小技巧】一个判断session是否过期的小技巧
·通过Web Services上传和下载文件
·?dos下编译.net程序找不到csc.exe文件
·VB/ASP 调用 SQL Server 的存储过程
·学习笔记(补)《.NET框架程序设计(修订版)》--目录
·对比.NET PetShop和Duwamish来探讨Ado.NET的数据库编程模式
·Autodesk官方最新的.NET教程(一)(vb.net版)
·Duwamish深入剖析-结构篇

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
做过:演练:在 Windows 窗体上创建动态上下文菜单

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

若要节省创建应用程序所需的时间并减少代码量,可以让多个控件共享单个上下文菜单对象。利用一个只包含该控件必需菜单项的“动态”上下文菜单(或快捷方式菜单),可以减少应用程序中控件所需的上下文菜单总数。以下演练显示如何更改每个控件的菜单项。

创建应用程序

以下步骤将创建一个 Windows 应用程序,它具有包含两个控件的窗体。在运行时,如果右击每个控件(只要它具有焦点,即被选定),将显示相应的上下文菜单。RadioButton 控件的上下文菜单将包含两个项;CheckBox 控件的上下文菜单将包含三个项。

在 Windows 窗体上创建动态上下文菜单

  1. 创建新的 Windows 应用程序。有关详细信息,请参见创建 Windows 应用程序项目
  2. CheckBox 控件和 RadioButton 控件从“工具箱”拖到窗体上。

    虽然任何两个(或更多个)控件都可以共享一个上下文菜单,但使具有类似命令的控件共享上下文菜单也是有好处的,因为这样可以减少必需动态显示及隐藏的量。

  3. 双击“工具箱”中的“ContextMenu”组件,将其添加到窗体中。它将成为共享的上下文菜单。
  4. 在“属性”窗口中,将 CheckBox 控件和 RadioButton 控件的 ContextMenu 属性设置为 ContextMenu1(在 Visual Basic 中)或 contextMenu1(在 Visual C# 或 Visual C++ 中)。
  5. 在“属性”窗口中,将 CheckBox 控件的 ThreeState 属性设置为 true
    注意   您还可以完全使用代码生成 ContextMenuThreeState 属性的菜单项和设置。有关详细信息,请参见向 Windows 窗体添加上下文菜单设置控件、文档和窗体的属性。有关 ThreeState 属性的详细信息,请参见 Windows 窗体 CheckBox 控件介绍
  6. 从设计器中双击 ContextMenu 组件,为该组件的 Popup 事件创建默认的处理程序。有关详细信息,请参见在 Windows 窗体设计器上创建事件处理程序
  7. 在事件处理程序中插入执行以下任务的代码:
    • 添加两个菜单项,一个表示控件的 Checked 状态,另一个表示 Unchecked 状态。
    • If 语句检验 CheckBox 控件是否为窗体上的 SourceControl。根据检验结果,动态地添加第三个菜单项,该菜单项表示控件的 Indeterminate 状态。

    以下示例显示如何使用 Add 方法来设置菜单项的 Text 属性以及如何定义与该菜单项相关联的事件处理程序。有关其他具有不同签名的 Add 方法,请参见 Menu.MenuItemCollection.Add 方法

    ' Visual Basic
    Protected Sub ContextMenu1_Popup(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ContextMenu1.Popup
    ' Clear the contents of the context menu.
       ContextMenu1.MenuItems.Clear()
    ' Add a menu item for the Checked state.
       ContextMenu1.MenuItems.Add("Checked", New System.EventHandler(AddressOf Me.Checked_OnClick))
    ' Add a menu item for the Unchecked state.
       ContextMenu1.MenuItems.Add("Unchecked", New System.EventHandler(AddressOf Me.Unchecked_OnClick))
    ' Test which control it is.
    ' If it is the CheckBox, add a menu item for the Indeterminate state.
       If ContextMenu1.SourceControl Is CheckBox1 Then
         ContextMenu1.MenuItems.Add("Indeterminate", New System.EventHandler(AddressOf Me.Indeterminate_OnClick))
       End If
    End Sub
    
    // C#
    protected void contextMenu1_Popup(System.Object sender, System.EventArgs e)
    {
    // Clear the contents of the context menu.
       contextMenu1.MenuItems.Clear();
    
    // Add a menu item for the Checked state.
       contextMenu1.MenuItems.Add("Checked",new System.EventHandler(this.Checked_OnClick));
    // Add a menu item for the Unchecked state.
       contextMenu1.MenuItems.Add("Unchecked",new System.EventHandler(this.Unchecked_OnClick));
    
    // Test which control it is.
    // If it is the CheckBox, add a menu item for the Indeterminate state.
       if (contextMenu1.SourceControl == checkBox1)
       {
         this.contextMenu1.MenuItems.Add("Indeterminate", new System.EventHandler(this.Indeterminate_OnClick));
       }
    }
    
    // C++
    private:
      System::Void contextMenu1_Popup(System::Object *  sender,
        System::EventArgs *  e)
      {
        // Clear the contents of the context menu.
        contextMenu1->MenuItems->Clear();
    
        // Add a menu item for the Checked state.
        contextMenu1->MenuItems->Add("Checked",
          new System::EventHandler(this, Checked_OnClick));
    
        // Add a menu item for the Unchecked state.
        contextMenu1->MenuItems->Add("Unchecked",
          new System::EventHandler(this, Unchecked_OnClick));
    
        // Test which control it is.
        // If it is the CheckBox, add a menu item 
        // for the Indeterminate state.
        if (contextMenu1->SourceControl == checkBox1)
        {
          this->contextMenu1->MenuItems->Add("Indeterminate",
            new System::EventHandler(this, Indeterminate_OnClick));
        }
      }
  8. 为 MenuItem1 创建一个事件处理程序。添加如下代码,检验窗体的 SourceControl 属性,然后根据检验结果设置 RadioButtonCheckBox 控件的 Checked 属性:
    ' Visual Basic
    Protected Sub Checked_OnClick(ByVal sender As System.Object, ByVal e As System.EventArgs)
       If ContextMenu1.SourceControl Is RadioButton1 Then
         RadioButton1.Checked = True
       ElseIf ContextMenu1.SourceControl Is CheckBox1 Then
         CheckBox1.Checked = True
       End If
    End Sub
    
    // C#
    protected void Checked_OnClick(System.Object sender, System.EventArgs e)
    {
         if (contextMenu1.SourceControl == radioButton1)
            radioButton1.Checked = true;
         else if (contextMenu1.SourceControl == checkBox1)
            checkBox1.Checked = true;
    }
    
    // C++
    private:
      System::Void Checked_OnClick(System::Object *  sender,
        System::EventArgs *  e)
      {
        if (contextMenu1->SourceControl == radioButton1)
          radioButton1->Checked = true;
        else if (contextMenu1->SourceControl == checkBox1)
          checkBox1->Checked = true;
      }
    注意   此示例使用 CheckState 属性在 Indeterminate_OnClick 事件处理程序中将 CheckBox 控件设置为 Indeterminate

    有关如何在 Visual Basic 中创建事件处理程序的详细信息,请参见在 Visual Basic 代码编辑器中创建事件处理程序。有关如何在 C# 中创建事件处理程序的详细信息,请参见在 Windows 窗体设计器上创建默认事件处理程序。有关如何在 C++ 中创建事件处理程序的详细信息,请参见 Visual C++ 中的事件处理

  9. 为 MenuItem2 创建类似的事件处理程序。为该事件处理程序输入如下代码:
    ' Visual Basic
    Protected Sub Unchecked_OnClick(ByVal sender As System.Object, ByVal e As System.EventArgs)
       If ContextMenu1.SourceControl Is RadioButton1 Then
         RadioButton1.Checked = False
       ElseIf ContextMenu1.SourceControl Is CheckBox1 Then
         CheckBox1.Checked = False
       End If
    End Sub
    
    // C#
    protected void Unchecked_OnClick(System.Object sender, System.EventArgs e)
    {
       if (contextMenu1.SourceControl == radioButton1)
         radioButton1.Checked = false;
       else if (contextMenu1.SourceControl == checkBox1)
         checkBox1.Checked = false;
    }
    
    // C++
    private:
      System::Void Unchecked_OnClick(System::Object *  sender,
        System::EventArgs *  e)
      {
        if (contextMenu1->SourceControl == radioButton1)
          radioButton1->Checked = false;
        else if (contextMenu1->SourceControl == checkBox1)
          checkBox1->Checked = false;
      }
  10. 为 MenuItem3 创建类似的事件处理程序。为该事件处理程序输入如下代码,确保将事件命名为 Indeterminate_OnClick
    ' Visual Basic
    Protected Sub Indeterminate_OnClick(ByVal sender As System.Object, ByVal e As System.EventArgs)
       If ContextMenu1.SourceControl Is CheckBox1 Then
         CheckBox1.CheckState = System.Windows.Forms.CheckState.Indeterminate
       End If
    End Sub
    
    // C#
    protected void Indeterminate_OnClick(System.Object sender, System.EventArgs e)
    {
    if (contextMenu1.SourceControl == checkBox1)
       checkBox1.CheckState = System.Windows.Forms.CheckState.Indeterminate;
    }
    
    // C++
    private:
      System::Void Indeterminate_OnClick(System::Object *  sender,
        System::EventArgs *  e)
      {
        if (contextMenu1->SourceControl == checkBox1)
          checkBox1->CheckState =
            System::Windows::Forms::CheckState::Indeterminate;
      }

测试应用程序

此时,请运行该应用程序,并观察在动态添加和移除上下文菜单中的菜单项时,应用程序的行为。

  1. 调试该应用程序,然后按 F5 键运行它。有关调试的详细信息,请参见调试基础知识
  2. 单击 RadioButton 控件将其选定,然后右击 RadioButton 显示上下文菜单。

    请注意,其中有两个菜单项,它们会将 RadioButton 控件设置为 Checked Unchecked

  3. 单击 CheckBox 控件将其选定,然后右击 CheckBox 显示上下文菜单。

    请注意,其中有三个菜单项,它们会将 CheckBox 控件设置为 CheckedUncheckedIndeterminate

请参见




相关文章

相关软件




月光软件程序下载编程文档电脑教程网站设计网址导航网络文学游戏天地幽默笑话生活休闲写作范文安妮宝贝
电脑技术编程开发网络专区谈天说地情感世界游戏元素分类游戏热门游戏体育运动手机专区业余爱好影视沙龙
音乐天地数码广场教育园地科学大观古今纵横谈股论金人文艺术医学保健动漫图酷二手专区地方风情各行各业

月光软件站·版权所有