Visual C# 2005复制与撷取操作

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

  • 本程序范例还可以将项目的图像资源“章立民_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”命令时,将会执行以下的程序代码:
        // 将文本字符串 "From Microsoft Taiwan!" 以标准的 ANSI 文字格式复制到剪贴板。privatevoid tsmiCopyTextAsText_Click(object sender, EventArgs e)

        {

        Clipboard.SetDataObject(strText,
        true);

        }


        • 当您从“编辑”菜单中选取“将文字复制为/HTML”命令时,将会运行以下的程序代码:
          // 将文本字符串 "From Microsoft Taiwan!" 以HTML 格式复制到剪贴板。privatevoid tsmiCopyTextAsHTML_Click(

          object sender, EventArgs e)

          {

          DataObject myDataObject
          =new DataObject();



          myDataObject.SetData(DataFormats.Html, strHTML);

          Clipboard.SetDataObject(myDataObject,
          true);

          }


          • 当您从“编辑”菜单中选取“将文字复制为/RTF”命令时,将会执行以下的程序代码:
            // 将文本字符串 "From Microsoft Taiwan!" 以 XML 格式复制到剪贴板。

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

            // 一种独有的格式。因为此格式在本应用程序之外可能不具有意

            // 义,所以我们将 SetDataObject 方法的第二个参数设定成 False,

            // 来要求在结束本程序之后不保留剪贴板上的数据,以便不让其他应

            // 用程序使用。privatevoid tsmiCopyTextAsXML_Click(object sender, EventArgs e)

            {

            DataObject myDataObject
            =new DataObject();

            myDataObject.SetData(
            "MyInternalXmlFormat", strXML);

            Clipboard.SetDataObject(myDataObject,
            false);

            }


            • 当您从“编辑”菜单中选取“将文字复制为/XML”命令时,将会执行以下的程序代码:
              // 将文本字符串 "From Microsoft Taiwan!" 以 XML 格式复制到剪贴板。

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

              // 一种独有的格式。因为此格式在本应用程序之外可能不具有意

              // 义,所以我们将 SetDataObject 方法的第二个参数设定成 False,

              // 来要求在结束本程序之后不保留剪贴板上的数据,以便不让其他应

              // 用程序使用。privatevoid tsmiCopyTextAsXML_Click(object sender, EventArgs e)

              {

              DataObject myDataObject
              =new DataObject();

              myDataObject.SetData(
              "MyInternalXmlFormat", strXML);

              Clipboard.SetDataObject(myDataObject,
              false);

              }


              • 当您从“编辑”菜单中选取“将文字复制为/所有的格式”命令时,将会执行以下的程序代码:
                // 将文本字符串 "From Microsoft Taiwan!" 以所有可用的格式复制到剪贴

                // 板。您只能使用 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事件处理函数中。之所以如此做,是为了能够动态地根据剪贴板中数据的可用格式来创建“粘贴为”菜单的各个子菜单。相关程序代码如下所示:
                  privatevoid PasteAsMenuEventHandler(object sender, System.EventArgs e)

                  {

                  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事件,而不管哪一种格式被选取:
                    privatevoid PasteAsMenuEventHandler(object sender, System.EventArgs e)

                    {

                    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();

                    }

                    }

                    }

                    ...
                    关键词:VS.NET