程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> 托管C++中GDI+和GDI混合編程技術

托管C++中GDI+和GDI混合編程技術

編輯:vc教程

1.引言

早期的Windows程序中,可以使用GDI(Graphics Device Interface,圖形設備接口)在一個窗體中繪制圖形、文本和圖像,但它的功能比較有限,尤其是圖像處理方面。GDI+是GDI的一個新版本,它不僅在GDI基礎上添加許多新特性,而且對原有的GDI功能進行優化,並在為開發人員提供的二維矢量圖形、文本、圖像處理、區域、路徑以及圖形數據矩陣等方面構造了一系列相關的類。其中,圖形類Graphics是GDI+接口中的一個核心類,許多繪圖操作都可用它來完成。

與GDI相比,GDI+增加了漸變畫刷、樣條曲線、持久的路徑對象、矩陣和矩陣變換、Alpha混色、色彩修正、消除走樣以及元數據等新的特性。但是,GDI+卻並不支持GDI中的AND(與)、OR(或)以及XOR(異或)等光柵操作(ROP)以及硬件加速。其中,XOR光柵操作是實現圖元動態定位的橡皮條技術的最重要方法,其次GDI+中的圖像處理速度上並不比GDI更具優勢。為此,本文通過若干托管C++實例來探討在托管環境下GDI+和GDI的混合編程的方法和技巧。

2.托管C++和GDI

在Visual C++ .NET 2003中,程序員可以使用MFC和托管C++( Managed Extensions for C++,C++托管擴展)等編程方式進行圖形圖像程序開發。MFC是一套Microsoft基礎類庫,它是使用面向對象技術對Windows API進行封裝。因此在MFC中進行圖形圖像程序開發時既可以使用MFC類CDC來編程,也可直接使用GDI API中的函數和結構。

托管C++是在C++基礎上建立的,用來為Visual C++程序員開發.NET框架應用程序而設計。它除了保留標准C++的全部功能,還可通過.NET Framework(.NET框架)來創建對象,實現自動化內存管理以及與其他.NET語言的互操作性。由於托管環境與非托管環境的區別,因此GDI API並不能像MFC那樣直接在托管C++中進行調用。但在GDI+中的Graphics類[4]提供了與GDI交互的一些方法,如GetHdc和ReleaseHdc,分別用於獲取或釋放與Graphics對象相關聯的設備環境句柄。

由於GDI API不使用托管代碼,它使用的數據類型與托管C++中所用的數據類型不同,且它也不是COM對象,所以在托管C++使用GDI是通過平台調用(PInvoke)來實現的。

3.平台調用和數據封送

平台調用[5]是一種服務,它使托管代碼能夠調用DLL中實現的非托管函數,使用時需要指定Runtime::InteropServices命名空間。

3.1 調用GDI API函數的一般方法

在托管C++中調用GDI API(GDI32.DLL)一般是按標識 DLL中的函數、在托管代碼中創建原型和函數調用三個部分。其中,函數調用與一般托管C++中調用相同,這裡不作討論。

在托管C++中,DLL 函數的標識是通過DllImport屬性來操作的,它包括常用的EntryPoint、CharSet、ExactSpelling和CallingConvention等字段。EntryPoint字段用來指定要調用的DLL入口點的名稱。CharSet字段用來指定控制名稱損壞和封送字符串參數的方式。ExactSpelling字段用來指定是否在非托管DLL中搜索入口點指定的函數或方法名稱。CallingConvention字段用來指定入口點的調用約定,默認為WinAPI。

需要說明的是,DLL 函數的標識中不一定全部指定上述字段,通過設置一個或多個字段可以改變DllImport屬性的默認行為。例如:

using namespace System::Runtime::InteropServices;
typedef void* HDC;
[DllImport("gdi32", EntryPoint="LineTo")]
extern "C" bool LineTo(HDC hDC, int nXEnd, int nYEnd);

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved