Visual C#是微軟.Net框架中的一個重要的程序開發語言,雖然在.Net框架中還有其他的程序開發語言,但微軟似乎對Visual C#更喜愛有加。這同時也就決定了Visual C#在.Net框架中的地位,以及他以後的發展前途。由於針對剪切板方面的編程始終是程序設計的一個重點,當然也可以算是一個難點。本文將探討如何利用Visual C#進行剪切板編程。本文將結合二個具體的程序例子來介紹Visual C#剪切板編程的二個重要方面:判定剪切板中的數據類型、保存剪切板中的數據。首先來介紹Visual C#如何判定剪切板中的數據類型的。{)b}}
bpf
剪切板中可以存放許多類型的數據,而Visual C#可以判定剪切板中的數據類型大致有21種,這其中包括位圖(Bitmap)、文本(Text)、超文本(Html)等,由於類型比較將多,本文將只介紹比較典型的數據類型,對於其他的數據類型,操作方法基本類似。2oN
}}2sT
一. 本文程序設計和運行的環境AlgsBE
_F
(1).微軟公司視窗2000服務器版^QM_A
(2)..Net FrameWork SDK Beta 2Kc+4
f[fMEY
二. 介紹程序中使用到的類和接口^5"^U
Qb
Visual C#判斷剪切板中的數據類型,要使用到.Net FrameWork SDK中二個類(Class)和一個接口(Interface),具體的就是:Clipboard類、Dataformats類和IdataObject接口。這三者的作用是:Clipboard類是一個不可以繼承的類,他的主要作用是通過自身的方法來實現在計算機系統的剪切板中存放和獲得數據。Dataformats類主要是提供了一個預先設定好的剪切板數據類型,並可以被IdataObject接口調用來判定剪切板數據類型。IdataObject接口提供了一個自由格式的裝置來傳輸數據。下面就結合這些類和接口來具體看一下,具體的使用方法。cc|@=
eU@>M
三. Visual C#判定剪切板數據類型的解決思路以及重要步驟的解決辦法J!
&M
(1).首先要讀取剪切板中的數據內容:0zO0g,
wP;P
Clipboard類中有一個方法叫GetDataObject ( ),此方法的作用就是讀取當前剪切板中的數據內容。要把讀取了當前剪切板中數據存放起來,這就要用到IdataObject接口,這個接口可以使用在Clipboard類和Drag and Drop的操作中。下面這些代碼就是讀取把當前剪切板中的數據內容並存放起來。.
fUac
IDataObject d = Clipboard.GetDataObject ( ) ;\(OQ
)6u}
(2).判定當前剪切板中的數據類型:&@
}
在IdataObject接口中有一個方法名稱是GetDataPresent ( ),這個方法的作用是檢測存放在接口的數據是否是指定的數據類型或者可以轉換成指定的數據類型。他的返回值是布爾型,True表示為指定的數據類型或者可以轉換成指定的數據類型。False於上面意思相反。下面語句實現的功能是判定當前剪切板的數據內容是否為位圖、文本和超文本的,具體如下:;:R2
-
if ( d.GetDataPresent ( Dataformats.Bitmap ) ) {*
Console.WriteLine ( "當前剪切板中的數據類型是位圖!" ) ;D*
} else if ( d.GetDataPresent ( Dataformats.Text ) ) {o"=8P
Console.WriteLine ( "當前剪切板中的數據類型是文本!" ) ;%3b
} else if ( d.GetDataPresent ( Dataformats.Html ) ) {.en cA
Console.WriteLine ( "當前剪切板中的數據類型是超文本!" ) ;\<
} else {Pr
Console.WriteLine ( "當前剪切板中的數據類型是其他類型數據!" ) ;+_N
} j
L6E
四. 程序源代碼6Zt
ro9B*
通過上面的介紹,我們不難理解下面這些程序代碼,這些程序代碼的功能就是判定當前剪切板中的數據是什麼類型。具體如下:~QNU
u
using System ;Tl
using System.Windows.forms ;ARn
public class MyClipboard_`3O
{ yR`8``
public static void Main ( string [ ] args )!I
{ $qcPj7
IDataObject d = Clipboard.GetDataObject ( ) ;|ECJ
yNhq
if ( d.GetDataPresent ( Dataformats.Bitmap ) ) {=?H
Console.WriteLine ( "當前剪切板中的數據類型是位圖!" ) ;|Lg8&
} else if ( d.GetDataPresent ( Dataformats.Text ) ) {ogC](<
Console.WriteLine ( "當前剪切板中的數據類型是文本!" ) ; xzNR
} else if ( d.GetDataPresent ( Dataformats.Html ) ) {YO{^
Console.WriteLine ( "當前剪切板中的數據類型是超文本!" ) ;Mj
} else {\y_
Console.WriteLine ( "當前剪切板中的數據類型是其他類型數據!" ) ;Pmj>
} Scf5
} #;c.>"
} o^jQyB
五. Visual C#保存剪切板數據的解決思路以及重要步驟的解決辦法Ow%O
|
用Visual C#保存剪切板中的數據要使用的類和接口和判定剪切板中的數據類型基本一樣。但由於要讀取剪切板數據,就需要用到了IdataObject接口的方法GetData ( ),這個方法的作用就是獲得指定類型的數據內容。他的語法為:;.Ba
!
object GetData ( Type ) ;4yD
xfwTf
我們注意到這個方法返回的類型是一個Object類型,這是一個參考類型,他的變量就是一個參考類型變量,而我們讀取的內容應該是一個實值類型變量,這就又涉及到裝箱和出箱的問題了。由於在前面的文章中已經比較詳細的說明了這二者的關係(見《用Visual C#動態生成組件》),所以在本文就不介紹了。在本文的程序中是通過下列二行語句來實現這種由參考類型變量轉換成實值類型變量的過程:)>/Q+
3.rmmR
Bitmap b = ( Bitmap ) d.GetData ( Dataformats.Bitmap ) ;//位圖g
String c = ( String ) d.GetData ( Dataformats.Text ) ;//文本n9od
2NR)D_
實現保存剪切板中數據的程序的設計思路是,首先判定當前剪切板中的數據類型,如果數據類型為位圖,則保存到C盤的"my.bmp"文件中,如果數據類型是文本,則用一個RichText組件顯示出來。否則則提示是其他類型數據。?V4
3FC~
如何判定剪切板數據類型在上面已經介紹過了,程序的另外一個難點就是,假定已經判定剪切板中的數據類型為位圖,如何保存數據。在程序中是通過名稱空間System.Windows.forms中的Bitmap類的Save ( )方法來實現的。下列語句就是具體的實現方法。K
<uDW
Bitmap b = ( Bitmap ) d.GetData ( Dataformats.Bitmap ) ;e
b.Save ( @"c:\my.bmp" ) ;Qqz's
MessageBox.Show ( "當前剪切板內容是位圖,已經保存到"MY.BMP"文件中!" ) ;X]
+(
六. 用Visual C#讀取當前剪切板中數據內容並保存的程序源代碼rXT@>f
>pua
通過上面的介紹,可以得到實現上述功能的源程序代碼,如下:!hmP
\
using System ;>HDP<Q
using System.Drawing ;=y5
using System.Collections ;u@lzX
using System.ComponentModel ;}wPq{C
using System.Windows.forms ;]*}~:D
using System.Data;c
public class form1 : formR4O34
{ TbpHa=
private RichTextBox richTextBox1 ;";0
private Button button1 ;IA
private System.ComponentModel.Container components = null ;Ec-d
public form1()\^49j
{ r
//初始化窗體中的各個組件d%Xnd
InitializeComponent ( ) ;VEM
} 0#&-g
//清除程序中使用過的資源juF1~I
protected override void Dispose ( bool disposing )c`4Ees
{ @
if ( disposing )T
{ kZ.
if ( components != null ) *O
{ hD+:
components.Dispose ( ) ;sh$'
} &N]^?
} G2
base.Dispose ( disposing );'#
} [
private void InitializeComponent ( )_6
{ YC+
this.richTextBox1 = new RichTextBox ( ) ;qI[
this.button1 = new Button ( ) ;P
this.SuspendLayout ( ) ;tH
a.UZv
this.richTextBox1.Location = new System.Drawing.Point ( 40 , 16 ) ;*
this.richTextBox1.Name = "richTextBox1" ;HR
this.richTextBox1.Size = new System.Drawing.Size ( 336 , 264 ) ;.k`/%
this.richTextBox1.TabIndex = 0 ;jbKg
this.richTextBox1.Text = "" ;2:+
<<
this.button1.Location = new System.Drawing.Point ( 128 , 304 ) ;T-JsKw
this.button1.Name = "button1" ;#dnK&
this.button1.Size = new System.Drawing.Size ( 128 , 24 ) ;_+R:]U
this.button1.TabIndex = 1 ;d^D-
this.button1.Text = "獲得剪切板中的數據" ;M
this.button1.Click += new System.EventHandler ( this.button1_Click ) ;5BEhF
S7p
this.AutoScaleBaseSize = new System.Drawing.Size ( 6 , 14 ) ;=j>
this.ClientSize = new System.Drawing.Size ( 408 , 357 ) ;SZU2D
this.Controls.Add ( button1 );-Jr
this.Controls.Add ( richTextBox1 );vzws?
this.Name = "form1";vUd2J
this.Text = "用Visual C#來保存剪切板中的數據!";YvQg
this.ResumeLayout(false);0f
&IZz[
} y5
static void Main ( ) Tq_b
{ s&/4M
Application.Run ( new form1 ( ) ) ;)SFIN
} ;ZP
private void button1_Click ( object sender , System.EventArgs e )y
{ //定義一個IDataObject接口\*bnP
IDataObject d = Clipboard.GetDataObject ( ) ;.3qw
//如果剪切板中數據是位圖,則另存為C盤的my.bmp文件ZJo_hO
if ( d.GetDataPresent ( Dataformats.Bitmap ) ) Nq
{ X|/
//出箱-
Bitmap b = ( Bitmap ) d.GetData ( Dataformats.Bitmap ) ;`6
b.Save ( @"c:\my.bmp" ) ;MM
MessageBox.Show ( "當前剪切板內容是位圖,已經保存到"MY.BMP"文件中!" ) ;obb
} //如果是文本,則用窗體中的RichText組件顯示文本內容。2
else if ( d.GetDataPresent ( Dataformats.Text ) ) kzhk
{ 1<4F6@
//出箱C,x
String c = ( String ) d.GetData ( Dataformats.Text ) ; WC<C
richTextBox1.Text = c ;lu`%iZ
} 6L6l'w
else 7:
{ ^8)
MessageBox.Show ( "剪切板中是其他類型的數據!" ) ;}=
} H
} h(Kx
} G&`
N2EV
七. 總結bK
in4Q9
本文介紹了在用Visual C#進行剪切板編程的二個重要方面的內容,即:判定剪切板中的數據和保存剪切板中的數據。其實針對剪切板的編程用途是比較廣的,譬如有了上面的知識做鋪墊,我想如果要你用Visual C#開發一個抓圖程序,你一定不會說很難吧!
原帖地址:http://blog.csdn.net/fishrimp/archive/2005/10/08/497109.aspx n9Z