Visual C# 2005復(fù)制與擷取操作

2010-08-28 10:50:09來源:西部e網(wǎng)作者:

  • 本程序范例還可以將項(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ǔ)文字
      \// "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將項(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í)行以下的程序代碼:
        // 將文本字符串 "From Microsoft Taiwan!" 以標(biāo)準(zhǔn)的 ANSI 文字格式復(fù)制到剪貼板。privatevoid tsmiCopyTextAsText_Click(object sender, EventArgs e)

        {

        Clipboard.SetDataObject(strText,
        true);

        }


        • 當(dāng)您從“編輯”菜單中選取“將文字復(fù)制為/HTML”命令時(shí),將會(huì)運(yùn)行以下的程序代碼:
          // 將文本字符串 "From Microsoft Taiwan!" 以HTML 格式復(fù)制到剪貼板。privatevoid tsmiCopyTextAsHTML_Click(

          object sender, EventArgs e)

          {

          DataObject myDataObject
          =new DataObject();



          myDataObject.SetData(DataFormats.Html, strHTML);

          Clipboard.SetDataObject(myDataObject,
          true);

          }


          • 當(dāng)您從“編輯”菜單中選取“將文字復(fù)制為/RTF”命令時(shí),將會(huì)執(zhí)行以下的程序代碼:
            // 將文本字符串 "From Microsoft Taiwan!" 以 XML 格式復(fù)制到剪貼板。

            // 請(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í)行以下的程序代碼:
              // 將文本字符串 "From Microsoft Taiwan!" 以 XML 格式復(fù)制到剪貼板。

              // 請(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í)行以下的程序代碼:
                // 將文本字符串 "From Microsoft Taiwan!" 以所有可用的格式復(fù)制到剪貼

                // 板。您只能使用 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)程序代碼如下所示:
                  privatevoid PasteAsMenuEventHandler(object sender, System.EventArgs e)

                  {

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

                    {

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

                    }

                    }

                    }

                    ...
                    關(guān)鍵詞:VS.NET