- 本程序范例還可以將項目的圖像資源“章立民_01”復制到剪貼板,然后再從剪貼板中取出并粘貼到RichTextBox或PictureBox控件中(如圖8.7所示)。
- 當然,您也可以在其他應用程序中將數據復制到剪貼板,然后再于本程序范例中進行粘貼操作;反之亦然。例如,假設您已經在Microsoft Word中復制文字,則“粘貼為”菜單將會如圖8.8所示,列出剪貼板中所有可用的格式。
- 首先,您必須創建各個變量來持有文本字符串“From Microsoft Taiwan Community!”以及項目的圖像資源“章立民_01.JPG”:// 下列文本字符串會以各種不同格式來存儲文字
// "From Microsoft Taiwan Community!"。
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將項目的圖像資源進行復制與粘貼操作

圖8.8顯示剪貼板中所有可用格式
// 將文本字符串 "From Microsoft Taiwan!" 以標準的 ANSI 文字格式復制到剪貼板。privatevoid tsmiCopyTextAsText_Click(object sender, EventArgs e){
Clipboard.SetDataObject(strText, true);
}
- 當您從“編輯”菜單中選取“將文字復制為/Text”命令時,將會執行以下的程序代碼:
{
Clipboard.SetDataObject(strText, true);
}
- 當您從“編輯”菜單中選取“將文字復制為/HTML”命令時,將會運行以下的程序代碼:
object sender, EventArgs e)
{
DataObject myDataObject =new DataObject();
myDataObject.SetData(DataFormats.Html, strHTML);
Clipboard.SetDataObject(myDataObject, true);
}
- 當您從“編輯”菜單中選取“將文字復制為/RTF”命令時,將會執行以下的程序代碼:
// 請注意,由于 XML 并不是剪貼板所自帶的格式,因而這代表
// 一種獨有的格式。因為此格式在本應用程序之外可能不具有意
// 義,所以我們將 SetDataObject 方法的第二個參數設定成 False,
// 來要求在結束本程序之后不保留剪貼板上的數據,以便不讓其他應
// 用程序使用。privatevoid tsmiCopyTextAsXML_Click(object sender, EventArgs e)
{
DataObject myDataObject =new DataObject();
myDataObject.SetData("MyInternalXmlFormat", strXML);
Clipboard.SetDataObject(myDataObject, false);
}
- 當您從“編輯”菜單中選取“將文字復制為/XML”命令時,將會執行以下的程序代碼:
// 請注意,由于 XML 并不是剪貼板所自帶的格式,因而這代表
// 一種獨有的格式。因為此格式在本應用程序之外可能不具有意
// 義,所以我們將 SetDataObject 方法的第二個參數設定成 False,
// 來要求在結束本程序之后不保留剪貼板上的數據,以便不讓其他應
// 用程序使用。privatevoid tsmiCopyTextAsXML_Click(object sender, EventArgs e)
{
DataObject myDataObject =new DataObject();
myDataObject.SetData("MyInternalXmlFormat", strXML);
Clipboard.SetDataObject(myDataObject, false);
}
- 當您從“編輯”菜單中選取“將文字復制為/所有的格式”命令時,將會執行以下的程序代碼:
// 板。您只能使用 DataObject 對象來完成此項操作。我們會為每一種
// 格式調用 DataObject 對象的 SetData 方法以便將文本字符串以該格式
// 存入 DataObject 對象中。privatevoid tsmiCopyTextAsAllFormats_Click(object sender, EventArgs e)
{
// 創建一個 DataObject 對象。
DataObject myDataObject =new DataObject();
// 將文本字符串以標準的ANSI 文字格式存入 DataObject 對象中。
myDataObject.SetData(DataFormats.Text, strText);
// 將文本字符串以標準的 Windows Unicode 文字格式存入 DataObject 對象中。
myDataObject.SetData(DataFormats.UnicodeText, strText);
// 將文本字符串以 HTML 格式存入 DataObject 對象中。
myDataObject.SetData(DataFormats.Html, strHTML);
// 將文本字符串以 RTF 格式存入 DataObject 對象中。
myDataObject.SetData(DataFormats.Rtf, strRTF);
// 將文本字符串以 XML 格式存入 DataObject 對象中。
myDataObject.SetData("MyInternalXmlFormat", strXML);
// 將DataObject對象與其包含的所有格式數據存入剪貼板中。Clipboard.SetDataObject(myDataObject, true);
}
當您從“編輯”菜單中選取“將圖像復制為/Bitmap”命令時,將會執行以下的程序代碼:
' 將圖形文件中的圖像數據復制到剪貼板。privatevoid tsmiCopyImageAsBitmap_Click(
object sender, EventArgs e)
{
try
{
// 創建一個 DataObject 對象。
DataObject myDataObject =new DataObject();
// 將 myImage 中的圖像數據存入 DataObject 對象中,
// 并設定圖像數據可以被轉換成其他格式。
myDataObject.SetData(DataFormats.Bitmap, true, myImage);
// 將持有圖形文件的圖像數據的 DataObject對象存入剪貼板中。
Clipboard.SetDataObject(myDataObject, true);
}
...
}
- 請大家注意,“粘貼為”菜單是動態產生的。我們將產生“粘貼為”菜單及其子菜單項目標程序代碼編寫在“編輯”菜單項目的DropDownOpening事件處理函數中。之所以如此做,是為了能夠動態地根據剪貼板中數據的可用格式來創建“粘貼為”菜單的各個子菜單。相關程序代碼如下所示:
{
string strType; // 持有格式的值。object obj; // 被用來持有要粘貼的數據。
// 清除 RichTextBox。this.rtbPaste.Clear();
// 清除 TextBox。this.txtPaste.Clear();
// 清除 PictureBox。this.picturePaste.Image =null;
// 取得用戶所選取之格式的文字。
strType = ((ToolStripMenuItem)(sender)).Text;
// 確保剪貼板支持所選取的格式。if (Clipboard.GetDataObject().GetDataPresent(strType))
{
// 依所要求的格式從剪貼板中取得數據并賦給obj。
obj = Clipboard.GetDataObject().GetData(strType);
if (obj !=null)
{
// 使用 RichTextBox 控件的 Paste方法以便以指定的剪貼板格式
// 將剪貼板的內容粘貼到 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不支持此格式,
// 因此會將 Image 設定成 Null 以便清除圖像。try
{
picturePaste.Image = (Image)(obj);
}
...
}
}
}
- 以下所示則是事件處理函數PasteAsMenuEventHandler的程序代碼,它會負責處理所有的粘貼菜單項目的Click事件,而不管哪一種格式被選。
{
string strType; // 持有格式的值。object obj; // 被用來持有要粘貼的數據。
// 清除 RichTextBox。this.rtbPaste.Clear();
// 清除 TextBox。this.txtPaste.Clear();
// 清除 PictureBox。this.picturePaste.Image =null;
// 取得用戶所選取之格式的文字。
strType = ((ToolStripMenuItem)(sender)).Text;
// 確保剪貼板支持所選取的格式。if (Clipboard.GetDataObject().GetDataPresent(strType))
{
// 依所要求的格式從剪貼板中取得數據并賦給obj。
obj = Clipboard.GetDataObject().GetData(strType);
if (obj !=null)
{
// 使用 RichTextBox 控件的 Paste方法以便以指定的剪貼板格式
// 將剪貼板的內容粘貼到 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不支持此格式,
// 因此會將 Image 設定成 Null 以便清除圖像。try
{
picturePaste.Image = (Image)(obj);
}
...
}
}
}
程序范例3
圖8.9所示是程序范例CH8_DemoForm007.cs的運行畫面,它示范如何使用DataObject與Clipboard類將項目的音頻數據復制到剪貼板,然后再播放剪貼板中的音頻數據。相關程序代碼如下所示:

圖8.9復制與播放音頻數據
privatevoid btnCopyWavAudioToClipboard_Click(object sender, EventArgs e)
{
try
{
// 創建一個 DataObject 對象。
DataObject myDataObject =new DataObject();
// 將項目的音頻數據GoTop存入DataObject對象中,
// 并設定音頻數據可以被轉換成其他格式。
myDataObject.SetData(
DataFormats.WaveAudio, true, Resources.GoTop);
// 將持有音頻數據的 DataObject 對象存入剪貼板中。
Clipboard.SetDataObject(myDataObject, true);
btnPlayClipboardWavAudio.Enabled =true;
}
...
}
privatevoid btnPlayClipboardWavAudio_Click(object sender, EventArgs e)
{
try
{
// 將剪貼板中的數據以一個
// 實現 IDataObject 接口的對象返回。
IDataObject oDataObj = Clipboard.GetDataObject();
if (oDataObj !=null)
{
// 檢測從剪貼板所返回的數據是否存在 Wav Audio 的格式。if (oDataObj.GetDataPresent(
DataFormats.WaveAudio))
{
// 以 Wave Audio 格式取得音頻數據并進行播放。
SoundPlayer player =new SoundPlayer(
(System.IO.Stream)(
oDataObj.GetData(
DataFormats.WaveAudio, true)));
player.Play();
}
}
}
...

