.NET Framework 2.0对剪贴板存取操作做了哪些强化

2010-08-28 10:50:09来源:西部e网作者:

为了让剪贴板的数据存取操作更加便利且单纯化,.NET Framework 2.0替Clipboard类新增了下列方法:
  • 您现在可以调用Clipboard.Clear方法来清除剪贴板中的所有数据。不过由于剪贴板并非是单一程序所使用的,而是多个进程所共享的,因此在调用Clear方法之前,请先确认此举不会对其他的进程造成不良影响。
  • 我们在前一节中一再强调,Clipboard类的SetDataObject方法会使用IDataObject接口将数据以“多重格式”存储在剪贴板中,而此举最大的好处是,以后可以采用各种不同的格式从剪贴板中撷取数据。但是或许您就是想以特定的单一数据格式来将数据存储在剪贴板中,而不需要使用多重格式,为了让您以更直接的方式来完成此类操作,Clipboard类现在新增了下列数个前缀为Set的方法来让您将数据以特定格式存入剪贴板中,而不再需要通过DataObject对象来完成:
    • Clipboard.SetText方法能够将文字数据存入剪贴板中。
    • Clipboard.SetImage方法能够将一个Image以Bitmap格式存入剪贴板中。
    • Clipboard.SetAudio方法能够将数据以WaveAudio格式存入剪贴板中。
    • Clipboard.SetFileDropList方法能够将一个文件名称集合以FileDrop 格式存入剪贴板中。
    • Clipboard.SetData方法能够将数据以特定的格式存入剪贴板中。
         
    1. 在我们从剪贴板提取数据之前,通常会先确认是否存在所需格式的数据。为了帮助您以更直接且便利的方式完成此类操作,Clipboard类现在新增了下列数个前缀为Contains的方法,而不再需要通过IDataObject接口来完成:
    2. Clipboard.ContainsText方法能够判断剪贴板中是否存在文字数据。
      •     Clipboard.ContainsImage方法能够判断剪贴板中是否存在Bitmap格式的数据或是数据能否转换成Bitmap格式。
      • Clipboard.ContainsFileDropList方法能够判断剪贴板中是否存在FileDrop格式的数据或是数据能否转换成FileDrop格式。
      • Clipboard.ContainsAudio方法能够判断剪贴板中是否存在WaveAudio格式的数据。
      • Clipboard.ContainsData方法能够判断剪贴板中是否存在指定格式的数据或是数据能够转换成所指定的格式。
           
      1. 确认剪贴板中存在所指定格式的数据后,接下来就是要将该数据提取出来。Clipboard类现在新增了下列数个前缀为Get的方法,来让您直接提取剪贴板中特定格式的数据,而不再需要通过IDataObject接口来完成:
        • Clipboard.GetText方法能够从剪贴板中提取文字数据。
        • Clipboard.GetImage方法能够从剪贴板中提取图像数据。
        • Clipboard.GetFileDropList方法能够从剪贴板中提取文件名称的集合。
        • Clipboard.GetAudioStream方法能够从剪贴板中提取音频数据流。
        • Clipboard.GetData方法能够从剪贴板中提取特定格式的数据。
             
          显而易见地,借助于Clipboard类新增的这些方法,将使得剪贴板的数据存取操作变得更加容易与直观。现在,我们就要用这些方法,来改写前一节的程序范例。
          程序范例1
          程序范例CH8_DemoForm008.cs的功能用途与前一节的第一个程序范例CH8_DemoForm005.cs完全相同,只不过本程序范例CH8_DemoForm008.cs改用Clipboard类所新提供的SetImage、ContainsImage与GetImage方法来进行剪贴板的图像数据的存取操作。从以下的程序代码可以看出,新的方法可以让程序代码更为精简且容易了解:
          privatevoid btnCopyImageToClipboard_Click(object sender, EventArgs e)

          {

          try

          {

          // 将项目的图像资源存入剪贴板中。
          Clipboard.SetImage(Resources.章立民的大头照);



          btnSaveClipboardToFile.Enabled
          =true;

          }

          ...

          }



          privatevoid btnSaveClipboardToFile_Click(object sender, EventArgs e)

          {

          try

          {

          // 判断剪贴板中是否存在图像数据。if (Clipboard.ContainsImage())

          {

          // 使用GetImage方法取得剪贴板中的图像数据。
          System.Drawing.Image oImgObj
          =

          Clipboard.GetImage();



          // 存储成 Bitmap。
          oImgObj.Save(
          @"C:\Test.bmp"

          System.Drawing.Imaging.ImageFormat.Bmp);



          // 存储成 JPEG。
          oImgObj.Save(
          @"C:\Test.jpeg"

          System.Drawing.Imaging.ImageFormat.Jpeg);



          // 存储成 GIF。
          oImgObj.Save(
          @"C:\Test.gif"

          System.Drawing.Imaging.ImageFormat.Gif);



          Process.Start(
          "explorer.exe"@"C:\");

          }

          }

          ...

          }


          程序范例2
          程序范例CH8_DemoForm009.cs的功能用途与前一节的第二个程序范例CH8_DemoForm006.cs完全相同,只不过本程序范例CH8_DemoForm009.cs改用Clipboard类所新提供的SetText、SetImage与SetData方法来将文本字符串与图像数据存入剪贴板中。从以下的程序代码可以看出,新的方法可以让程序代码更为精简且容易了解:
          // 将文本字符串 "From Microsoft !" 以标准的 ANSI 文字格式复制到剪贴板。privatevoid tsmiCopyTextAsText_Click(object sender, EventArgs e)

          {

          Clipboard.SetText(strText, TextDataFormat.Text);

          }



          // 将文本字符串 "From Microsoft !" 以 HTML格式复制到剪贴板。privatevoid tsmiCopyTextAsHTML_Click(object sender, EventArgs e)

          {

          Clipboard.SetText(strHTML, TextDataFormat.Html);

          }



          // 将文本字符串 "From Microsoft !" 以 RTF格式复制到剪贴板。privatevoid tsmiCopyTextAsRTF_Click(object sender, EventArgs e)

          {

          Clipboard.SetText(strRTF, TextDataFormat.Rtf);

          }



          // 将文本字符串 "From Microsoft !" 以 XML 格式复制到剪贴板。

          // 请注意,由于 XML 并不是剪贴板所自带的格式,因而这代表

          // 一种独有的格式。privatevoid tsmiCopyTextAsXML_Click(object sender, EventArgs e)

          {

          Clipboard.SetData(
          "MyInternalXmlFormat", strXML);

          }



          // 将项目的图像资源存入剪贴板中。privatevoid tsmiCopyImageAsBitmap_Click(object sender, EventArgs e)

          {

          try

          {

          Clipboard.SetImage(Resources.章立民_01);

          }

          ...

          }


          仔细比较程序范例CH8_DemoForm009.cs与CH8_DemoForm006.cs之后可以发现,CH8_DemoForm009.cs仍然保留了CH8_DemoForm006.cs极大部分的写法,尤其是在将数据以“多重格式”存储在剪贴板中以及判断剪贴板中拥有哪些格式的操作方面,仍然必须借助于DataObject对象以及IDataObject接口。因此大家可别以为有了新的就忘了旧的,应该学会如何综合运用所有的技巧才是上策。
          程序范例3
          程序范例CH8_DemoForm010.cs的功能用途与前一节的第三个程序范例CH8_DemoForm007.cs完全相同,只不过本程序范例CH8_DemoForm010.cs改用Clipboard类所新提供的SetAudio、ContainsAudio与GetAudioStream方法来进行剪贴板的音频数据的存取操作。从以下的程序代码可以看出,新的方法可以让程序代码更为精简且容易了解:
          privatevoid btnCopyWavAudioToClipboard_Click(

          object sender, EventArgs e)

          {

          try

          {

          // 将项目的音频资源 GoTop 存入剪贴板中。
          Clipboard.SetAudio(Resources.GoTop);



          btnPlayClipboardWavAudio.Enabled
          =true;

          }

          ...

          }



          privatevoid btnPlayClipboardWavAudio_Click(object sender, EventArgs e)

          {

          try

          {

          // 判断剪贴板中是否存在音频数据。if (Clipboard.ContainsAudio())

          {

          // 使用 GetAudioStream 方法取得剪贴板中的音频数据以便加以播放。
          SoundPlayer player
          =new SoundPlayer(Clipboard.GetAudioStream());

          player.Play();

          }

          }

          ...

          }
          关键词:VS.NET