今天,突然想起了怎样在一个文本中实现复制、剪切与粘贴的功能,并给这些功能添加右键的快捷方式。于是,就用自己的VS2008写了一个简单的小应用,以熟悉C#中剪贴板与快捷菜单的使用。
首先,我们不难发现,剪贴板大致上有复制、粘贴和剪切三个功能。
复制,就是将选定的内容复制到内存当中;粘贴,则将内存中的数据写到所选中的区域或容器上,如文本区TextArea中,C#语言则往往是RichTextBox;剪切,可以把选定的内容复制到内存中,并清除掉这些选中的东西。
那么三个功能的实现我们可以大致这样定义:
复制:选中+存储
粘贴:选中+取出
剪切:选中+存储+清除
接着,我们可以考虑快捷菜单的设计,这种菜单属于弹出式菜单,点击鼠标右键可以将该菜单调出来。在C#中就是ContextMenuStrip,在Java中貌似叫PopedMenu。
最后将上述两者结合起来,制作一个包含了复制、粘贴和剪切功能的快捷菜单。按照一般软件的设计,当剪贴板中没有内容时,“粘贴”一项应该呈灰色,标识不可用。
用C#对上述内容进行实现,写了一个很简单的程序:
这时候,剪贴板上没有东西,所以“粘贴”一项不可用。
对内容进行复制、粘贴或剪切粘贴,则粘贴功能被激活:
给出部分程序代码,不当之处请大家指正。
/// 剪贴板和快捷菜单示例
/// </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,则是十分重要。