今天,突然想起了怎样在一个文本中实现复制、剪切与粘贴的功能,并给这些功能添加右键的快捷方式。于是,就用自己的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,则是十分重要。 |
|