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,则是十分重要。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值