C#中的Clipboard与ContextMenuStrip应用举例

今天,突然想起了怎样在一个文本中实现复制、剪切与粘贴的功能,并给这些功能添加右键的快捷方式。于是,就用自己的VS2008写了一个简单的小应用,以熟悉C#中剪贴板与快捷菜单的使用。

首先,我们不难发现,剪贴板大致上有复制、粘贴和剪切三个功能。

复制,就是将选定的内容复制到内存当中;粘贴,则将内存中的数据写到所选中的区域或容器上,如文本区TextArea中,C#语言则往往是RichTextBox;剪切,可以把选定的内容复制到内存中,并清除掉这些选中的东西。

那么三个功能的实现我们可以大致这样定义:

复制:选中+存储

粘贴:选中+取出

剪切:选中+存储+清除

接着,我们可以考虑快捷菜单的设计,这种菜单属于弹出式菜单,点击鼠标右键可以将该菜单调出来。在C#中就是ContextMenuStrip,在Java中貌似叫PopedMenu。

最后将上述两者结合起来,制作一个包含了复制、粘贴和剪切功能的快捷菜单。按照一般软件的设计,当剪贴板中没有内容时,“粘贴”一项应该呈灰色,标识不可用。

用C#对上述内容进行实现,写了一个很简单的程序:

这时候,剪贴板上没有东西,所以“粘贴”一项不可用。

对内容进行复制、粘贴或剪切粘贴,则粘贴功能被激活:

给出部分程序代码,不当之处请大家指正。


    

/// <summary>
    
/// 剪贴板和快捷菜单示例
    
/// </summary>
    public partial class SampleClipBoard : Form
    {
        
/// <summary>
        
/// 构造方法
        
/// </summary>
        public SampleClipBoard()
        {
            InitializeComponent();
        }
        

 
/// <summary>
        
/// 复制编辑区上的一段文字到剪切板
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>
        private void tsmiCopy_Click(object sender, EventArgs e)
        {
            Clipboard.SetDataObject(richTextBox.SelectedText);
        }

        
/// <summary>
        
/// 粘贴一段文字到选定区域
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>
        private void tsmiPaste_Click(object sender, EventArgs e)
        {
            IDataObject data;
            data 
= Clipboard.GetDataObject();
            
//如果数据为文本,则使用其指定的RichTextBox文本
            if (data.GetDataPresent(DataFormats.Text))
            {
                richTextBox.SelectedText 
= data.GetData(DataFormats.Text).ToString();
            }
        }

        
/// <summary>
        
/// 将选定的内容剪切到剪贴板
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>
        private void tsmiCut_Click(object sender, EventArgs e)
        {
            Clipboard.SetDataObject(richTextBox.SelectedText);
            richTextBox.SelectedText 
= "";
        }

        
/// <summary>
        
/// 快捷菜单打开时的状态设定方法
        
/// <para>若剪贴板中内容为空,则粘贴选项失效。</para>
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>
        private void contextMenuStrip_Opening(object sender, CancelEventArgs e)
        {
            
if (!Clipboard.ContainsData(DataFormats.Text))
            {
                tsmiPaste.Enabled 
= false;
            }
            
else
            {
                tsmiPaste.Enabled 
= true;
            }
        }
    }

 

 

最后,还有一个值得注意的问题,那就是快捷菜单要显示出来,必须以某一容器为框架,也就是说,某个容器要能弹出菜单,则必须在其ContextMenuStrip一栏填上ContextMenuStrip类的对象名称。

例如这里的richTextBox中的ContextMenuStrip属性,选择了一个快捷菜单:

 

对于快捷菜单的更多内容,我们可以右击ContextMenuStrip的某个控件,选择当中的编辑项,编辑更多的属性。而进行C#开发时参考MSDN,则是十分重要。

posted @ 2009-02-09 13:29  wang's Blog  阅读(2202)  评论(1编辑  收藏  举报