- 本程序范例还可以将项目的图像资源“章立民_01”复制到剪贴板,然后再从剪贴板中取出并粘贴到RichTextBox或PictureBox控件中(如图8.7所示)。
- 当然,您也可以在其他应用程序中将数据复制到剪贴板,然后再于本程序范例中进行粘贴操作;反之亦然。例如,假设您已经在Microsoft Word中复制文字,则“粘贴为”菜单将会如图8.8所示,列出剪贴板中所有可用的格式。
- 首先,您必须创建各个变量来持有文本字符串“From Microsoft Taiwan Community!”以及项目的图像资源“章立民_01.JPG”:// 下列文本字符串会以各种不同格式来存储文字









图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();
}
}
}
...