今天,突然想起了怎樣在一個(gè)文本中實(shí)現(xiàn)復(fù)制、剪切與粘貼的功能,并給這些功能添加右鍵的快捷方式。于是,就用自己的VS2008寫(xiě)了一個(gè)簡(jiǎn)單的小應(yīng)用,以熟悉C#中剪貼板與快捷菜單的使用。
首先,我們不難發(fā)現(xiàn),剪貼板大致上有復(fù)制、粘貼和剪切三個(gè)功能。
復(fù)制,就是將選定的內(nèi)容復(fù)制到內(nèi)存當(dāng)中;粘貼,則將內(nèi)存中的數(shù)據(jù)寫(xiě)到所選中的區(qū)域或容器上,如文本區(qū)TextArea中,C#語(yǔ)言則往往是RichTextBox;剪切,可以把選定的內(nèi)容復(fù)制到內(nèi)存中,并清除掉這些選中的東西。
那么三個(gè)功能的實(shí)現(xiàn)我們可以大致這樣定義:
復(fù)制:選中+存儲(chǔ)
粘貼:選中+取出
剪切:選中+存儲(chǔ)+清除
接著,我們可以考慮快捷菜單的設(shè)計(jì),這種菜單屬于彈出式菜單,點(diǎn)擊鼠標(biāo)右鍵可以將該菜單調(diào)出來(lái)。在C#中就是ContextMenuStrip,在Java中貌似叫PopedMenu。
最后將上述兩者結(jié)合起來(lái),制作一個(gè)包含了復(fù)制、粘貼和剪切功能的快捷菜單。按照一般軟件的設(shè)計(jì),當(dāng)剪貼板中沒(méi)有內(nèi)容時(shí),“粘貼”一項(xiàng)應(yīng)該呈灰色,標(biāo)識(shí)不可用。
用C#對(duì)上述內(nèi)容進(jìn)行實(shí)現(xiàn),寫(xiě)了一個(gè)很簡(jiǎn)單的程序:
這時(shí)候,剪貼板上沒(méi)有東西,所以“粘貼”一項(xiàng)不可用。
對(duì)內(nèi)容進(jìn)行復(fù)制、粘貼或剪切粘貼,則粘貼功能被激活:
給出部分程序代碼,不當(dāng)之處請(qǐng)大家指正。
/// <summary>
/// 剪貼板和快捷菜單示例
/// </summary>
public partial class SampleClipBoard : Form
{
/// <summary>
/// 構(gòu)造方法
/// </summary>
public SampleClipBoard()
{
InitializeComponent();
}
/// <summary>
/// 復(fù)制編輯區(qū)上的一段文字到剪切板
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tsmiCopy_Click(object sender, EventArgs e)
{
Clipboard.SetDataObject(richTextBox.SelectedText);
}
/// <summary>
/// 粘貼一段文字到選定區(qū)域
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tsmiPaste_Click(object sender, EventArgs e)
{
IDataObject data;
data = Clipboard.GetDataObject();
//如果數(shù)據(jù)為文本,則使用其指定的RichTextBox文本
if (data.GetDataPresent(DataFormats.Text))
{
richTextBox.SelectedText = data.GetData(DataFormats.Text).ToString();
}
}
/// <summary>
/// 將選定的內(nèi)容剪切到剪貼板
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tsmiCut_Click(object sender, EventArgs e)
{
Clipboard.SetDataObject(richTextBox.SelectedText);
richTextBox.SelectedText = "";
}
/// <summary>
/// 快捷菜單打開(kāi)時(shí)的狀態(tài)設(shè)定方法
/// <para>若剪貼板中內(nèi)容為空,則粘貼選項(xiàng)失效。</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;
}
}
}
最后,還有一個(gè)值得注意的問(wèn)題,那就是快捷菜單要顯示出來(lái),必須以某一容器為框架,也就是說(shuō),某個(gè)容器要能彈出菜單,則必須在其ContextMenuStrip一欄填上ContextMenuStrip類的對(duì)象名稱。
例如這里的richTextBox中的ContextMenuStrip屬性,選擇了一個(gè)快捷菜單:
對(duì)于快捷菜單的更多內(nèi)容,我們可以右擊ContextMenuStrip的某個(gè)控件,選擇當(dāng)中的編輯項(xiàng),編輯更多的屬性。而進(jìn)行C#開(kāi)發(fā)時(shí)參考MSDN,則是十分重要。
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)
點(diǎn)擊舉報(bào)。