運用C#制作屏幕捕捉程序
隨著微軟.Net戰略的進一步深入,各種新的技術、概念可謂層出不窮,特別是C#語言的推出,在業界產生了重大影響。C#是一門高效的語言,它既有VB的RAD特性,又不乏C++語言的高效性。最重要的它是基於.Net Framework的,在圖形圖像、網絡編程等方面有著強大的優勢,所以它很可能發展成為未來的主要編程語言之一。
本文通過一個實例來向大家展示一下用C#進行圖形圖像編程的特性。實例中運用到了GDI+編程的一些基礎知識,GDI+是從GDI演化而來的,是.Net環境下的新的圖形圖像編程機制。它不僅具有GDI編程的一些基本功能,而且對GDI進行了不少擴充,使得它功能更強大。在Visual Studio的以前版本中使用GDI是相當復雜的,而且工作量十分大。現在在GDI+中,微軟已經幫我們解決了許多問題,因而使用GDI+進行圖形圖像編程將變得非常容易。不過要指出的是:用GDI編程雖然較復雜,卻可以完成幾乎所有的復雜功能,比如在實例中用GDI可以輕易做一個屏幕捕捉程序。那麼,現在我們在GDI+是否也能完成同樣的功能呢?答案是肯定的。正因為GDI+是從GDI演化而來的,我們只要在GDI+中調用GDI的一些功能就行了。
C#有一個特性,那就是它允許你運用任何預先已經完成的動態連接庫文件(*.dll),其中當然包括了gdi32.dll這個文件。該文件包含了進行GDI編程所需的基本類庫、函數、方法等。這樣,我們在GDI+編程機制下也同樣可以享受GDI為我們留下的寶貴資源。具體導入的方法如下:
[System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
在GDI中做屏幕捕捉程序的話,就要用到上下文設備(device context)了。在程序中,我們用它獲得屏幕圖形並將它寫入內存中的一個位圖中,實現的方法就是調用BitBlt()函數。同樣在GDI+中實現的原理是一樣的,下面給出了GDI+中的外部聲明函數(用C#語言描述):
privatestaticexternbool BitBlt(
IntPtr hdcDest, file://目的上下文設備的句柄
int nXDest, file://目的圖形的左上角的x坐標
int nYDest, file://目的圖形的左上角的y坐標
int nWidth, file://目的圖形的矩形寬度
int nHeight, file://目的圖形的矩形高度
IntPtr hdcSrc, file://源上下文設備的句柄
int nXSrc, file://源圖形的左上角的x坐標
int nYSrc, file://源圖形的左上角的x坐標
System.Int32 dwRop file://光柵操作代碼
);
為了能在GDI+中調用GDI,我們還需要取得上下文設備的鉤子。在GDI+中有一個方法就提供了這種操作的具體實現:
IntPtr dc1 = aGraphicsObject.GetHdc();
在取得了源上下文設備以及目的上下文設備的句柄後,我們就可以在上面的BitBlt()函數運用它們(作為參數),實現圖像創建功能了。在圖像創建後,還必須釋放源上下文設備以及目的上下文設備資源。