- 本程序范例還可以將項(xiàng)目的圖像資源“章立民_01”復(fù)制到剪貼板,然后再?gòu)募糍N板中取出并粘貼到RichTextBox或PictureBox控件中(如圖8.7所示)。
- 當(dāng)然,您也可以在其他應(yīng)用程序中將數(shù)據(jù)復(fù)制到剪貼板,然后再于本程序范例中進(jìn)行粘貼操作;反之亦然。例如,假設(shè)您已經(jīng)在Microsoft Word中復(fù)制文字,則“粘貼為”菜單將會(huì)如圖8.8所示,列出剪貼板中所有可用的格式。
- 首先,您必須創(chuàng)建各個(gè)變量來持有文本字符串“From Microsoft Taiwan Community!”以及項(xiàng)目的圖像資源“章立民_01.JPG”:// 下列文本字符串會(huì)以各種不同格式來存儲(chǔ)文字
privatestring strText ="From Microsoft Community!";
privatestring strHTML ="<P>From <B><FONT
size=' 4'><U>Microsoft</U></FONT></B>" +
"<FONT size=' 5' >Community!</FONT></P>";
圖8.7將項(xiàng)目的圖像資源進(jìn)行復(fù)制與粘貼操作
圖8.8顯示剪貼板中所有可用格式
// 將文本字符串 "From Microsoft Taiwan!" 以標(biāo)準(zhǔn)的 ANSI 文字格式復(fù)制到剪貼板。privatevoid tsmiCopyTextAsText_Click(object sender, EventArgs e){
Clipboard.SetDataObject(strText, true);
}
- 當(dāng)您從“編輯”菜單中選取“將文字復(fù)制為/Text”命令時(shí),將會(huì)執(zhí)行以下的程序代碼:
{
Clipboard.SetDataObject(strText, true);
}
- 當(dāng)您從“編輯”菜單中選取“將文字復(fù)制為/HTML”命令時(shí),將會(huì)運(yùn)行以下的程序代碼:
object sender, EventArgs e)
{
DataObject myDataObject =new DataObject();
myDataObject.SetData(DataFormats.Html, strHTML);
Clipboard.SetDataObject(myDataObject, true);
}
- 當(dāng)您從“編輯”菜單中選取“將文字復(fù)制為/RTF”命令時(shí),將會(huì)執(zhí)行以下的程序代碼:
// 請(qǐng)注意,由于 XML 并不是剪貼板所自帶的格式,因而這代表
// 一種獨(dú)有的格式。因?yàn)榇烁袷皆诒緫?yīng)用程序之外可能不具有意
// 義,所以我們將 SetDataObject 方法的第二個(gè)參數(shù)設(shè)定成 False,
// 來要求在結(jié)束本程序之后不保留剪貼板上的數(shù)據(jù),以便不讓其他應(yīng)
// 用程序使用。privatevoid tsmiCopyTextAsXML_Click(object sender, EventArgs e)
{
DataObject myDataObject =new DataObject();
myDataObject.SetData("MyInternalXmlFormat", strXML);
Clipboard.SetDataObject(myDataObject, false);
}
- 當(dāng)您從“編輯”菜單中選取“將文字復(fù)制為/XML”命令時(shí),將會(huì)執(zhí)行以下的程序代碼:
// 請(qǐng)注意,由于 XML 并不是剪貼板所自帶的格式,因而這代表
// 一種獨(dú)有的格式。因?yàn)榇烁袷皆诒緫?yīng)用程序之外可能不具有意
// 義,所以我們將 SetDataObject 方法的第二個(gè)參數(shù)設(shè)定成 False,
// 來要求在結(jié)束本程序之后不保留剪貼板上的數(shù)據(jù),以便不讓其他應(yīng)
// 用程序使用。privatevoid tsmiCopyTextAsXML_Click(object sender, EventArgs e)
{
DataObject myDataObject =new DataObject();
myDataObject.SetData("MyInternalXmlFormat", strXML);
Clipboard.SetDataObject(myDataObject, false);
}
- 當(dāng)您從“編輯”菜單中選取“將文字復(fù)制為/所有的格式”命令時(shí),將會(huì)執(zhí)行以下的程序代碼:
// 板。您只能使用 DataObject 對(duì)象來完成此項(xiàng)操作。我們會(huì)為每一種
// 格式調(diào)用 DataObject 對(duì)象的 SetData 方法以便將文本字符串以該格式
// 存入 DataObject 對(duì)象中。privatevoid tsmiCopyTextAsAllFormats_Click(object sender, EventArgs e)
{
// 創(chuàng)建一個(gè) DataObject 對(duì)象。
DataObject myDataObject =new DataObject();
// 將文本字符串以標(biāo)準(zhǔn)的ANSI 文字格式存入 DataObject 對(duì)象中。
myDataObject.SetData(DataFormats.Text, strText);
// 將文本字符串以標(biāo)準(zhǔn)的 Windows Unicode 文字格式存入 DataObject 對(duì)象中。
myDataObject.SetData(DataFormats.UnicodeText, strText);
// 將文本字符串以 HTML 格式存入 DataObject 對(duì)象中。
myDataObject.SetData(DataFormats.Html, strHTML);
// 將文本字符串以 RTF 格式存入 DataObject 對(duì)象中。
myDataObject.SetData(DataFormats.Rtf, strRTF);
// 將文本字符串以 XML 格式存入 DataObject 對(duì)象中。
myDataObject.SetData("MyInternalXmlFormat", strXML);
// 將DataObject對(duì)象與其包含的所有格式數(shù)據(jù)存入剪貼板中。Clipboard.SetDataObject(myDataObject, true);
}
當(dāng)您從“編輯”菜單中選取“將圖像復(fù)制為/Bitmap”命令時(shí),將會(huì)執(zhí)行以下的程序代碼:
' 將圖形文件中的圖像數(shù)據(jù)復(fù)制到剪貼板。privatevoid tsmiCopyImageAsBitmap_Click(
object sender, EventArgs e)
{
try
{
// 創(chuàng)建一個(gè) DataObject 對(duì)象。
DataObject myDataObject =new DataObject();
// 將 myImage 中的圖像數(shù)據(jù)存入 DataObject 對(duì)象中,
// 并設(shè)定圖像數(shù)據(jù)可以被轉(zhuǎn)換成其他格式。
myDataObject.SetData(DataFormats.Bitmap, true, myImage);
// 將持有圖形文件的圖像數(shù)據(jù)的 DataObject對(duì)象存入剪貼板中。
Clipboard.SetDataObject(myDataObject, true);
}
...
}
- 請(qǐng)大家注意,“粘貼為”菜單是動(dòng)態(tài)產(chǎn)生的。我們將產(chǎn)生“粘貼為”菜單及其子菜單項(xiàng)目標(biāo)程序代碼編寫在“編輯”菜單項(xiàng)目的DropDownOpening事件處理函數(shù)中。之所以如此做,是為了能夠動(dòng)態(tài)地根據(jù)剪貼板中數(shù)據(jù)的可用格式來創(chuàng)建“粘貼為”菜單的各個(gè)子菜單。相關(guān)程序代碼如下所示:
{
string strType; // 持有格式的值。object obj; // 被用來持有要粘貼的數(shù)據(jù)。
// 清除 RichTextBox。this.rtbPaste.Clear();
// 清除 TextBox。this.txtPaste.Clear();
// 清除 PictureBox。this.picturePaste.Image =null;
// 取得用戶所選取之格式的文字。
strType = ((ToolStripMenuItem)(sender)).Text;
// 確保剪貼板支持所選取的格式。if (Clipboard.GetDataObject().GetDataPresent(strType))
{
// 依所要求的格式從剪貼板中取得數(shù)據(jù)并賦給obj。
obj = Clipboard.GetDataObject().GetData(strType);
if (obj !=null)
{
// 使用 RichTextBox 控件的 Paste方法以便以指定的剪貼板格式
// 將剪貼板的內(nèi)容粘貼到 RichTextBox控件中。this.rtbPaste.Paste(
DataFormats.GetFormat(strType));
// 將純文字表示粘貼到 TextBox 控件中。if (obj.GetType().ToString() =="System.String")
{
this.txtPaste.AppendText((string)(obj));
}
else
{
this.txtPaste.AppendText(obj.GetType().ToString());
}
// 嘗試粘貼到PictureBox控件中。
// 如果失敗的話,表示PictureBox不支持此格式,
// 因此會(huì)將 Image 設(shè)定成 Null 以便清除圖像。try
{
picturePaste.Image = (Image)(obj);
}
...
}
}
}
- 以下所示則是事件處理函數(shù)PasteAsMenuEventHandler的程序代碼,它會(huì)負(fù)責(zé)處理所有的粘貼菜單項(xiàng)目的Click事件,而不管哪一種格式被選。
{
string strType; // 持有格式的值。object obj; // 被用來持有要粘貼的數(shù)據(jù)。
// 清除 RichTextBox。this.rtbPaste.Clear();
// 清除 TextBox。this.txtPaste.Clear();
// 清除 PictureBox。this.picturePaste.Image =null;
// 取得用戶所選取之格式的文字。
strType = ((ToolStripMenuItem)(sender)).Text;
// 確保剪貼板支持所選取的格式。if (Clipboard.GetDataObject().GetDataPresent(strType))
{
// 依所要求的格式從剪貼板中取得數(shù)據(jù)并賦給obj。
obj = Clipboard.GetDataObject().GetData(strType);
if (obj !=null)
{
// 使用 RichTextBox 控件的 Paste方法以便以指定的剪貼板格式
// 將剪貼板的內(nèi)容粘貼到 RichTextBox控件中。this.rtbPaste.Paste(
DataFormats.GetFormat(strType));
// 將純文字表示粘貼到 TextBox 控件中。if (obj.GetType().ToString() =="System.String")
{
this.txtPaste.AppendText((string)(obj));
}
else
{
this.txtPaste.AppendText(obj.GetType().ToString());
}
// 嘗試粘貼到PictureBox控件中。
// 如果失敗的話,表示PictureBox不支持此格式,
// 因此會(huì)將 Image 設(shè)定成 Null 以便清除圖像。try
{
picturePaste.Image = (Image)(obj);
}
...
}
}
}
程序范例3
圖8.9所示是程序范例CH8_DemoForm007.cs的運(yùn)行畫面,它示范如何使用DataObject與Clipboard類將項(xiàng)目的音頻數(shù)據(jù)復(fù)制到剪貼板,然后再播放剪貼板中的音頻數(shù)據(jù)。相關(guān)程序代碼如下所示:
圖8.9復(fù)制與播放音頻數(shù)據(jù)
privatevoid btnCopyWavAudioToClipboard_Click(object sender, EventArgs e)
{
try
{
// 創(chuàng)建一個(gè) DataObject 對(duì)象。
DataObject myDataObject =new DataObject();
// 將項(xiàng)目的音頻數(shù)據(jù)GoTop存入DataObject對(duì)象中,
// 并設(shè)定音頻數(shù)據(jù)可以被轉(zhuǎn)換成其他格式。
myDataObject.SetData(
DataFormats.WaveAudio, true, Resources.GoTop);
// 將持有音頻數(shù)據(jù)的 DataObject 對(duì)象存入剪貼板中。
Clipboard.SetDataObject(myDataObject, true);
btnPlayClipboardWavAudio.Enabled =true;
}
...
}
privatevoid btnPlayClipboardWavAudio_Click(object sender, EventArgs e)
{
try
{
// 將剪貼板中的數(shù)據(jù)以一個(gè)
// 實(shí)現(xiàn) IDataObject 接口的對(duì)象返回。
IDataObject oDataObj = Clipboard.GetDataObject();
if (oDataObj !=null)
{
// 檢測(cè)從剪貼板所返回的數(shù)據(jù)是否存在 Wav Audio 的格式。if (oDataObj.GetDataPresent(
DataFormats.WaveAudio))
{
// 以 Wave Audio 格式取得音頻數(shù)據(jù)并進(jìn)行播放。
SoundPlayer player =new SoundPlayer(
(System.IO.Stream)(
oDataObj.GetData(
DataFormats.WaveAudio, true)));
player.Play();
}
}
}
...