GDI 學習筆記5 裝置環境DC的概念

2022-02-03 01:47:58 字數 2804 閱讀 9316

dc(device context)又稱裝置上下文,裝置描述表。它是乙個關於如何繪製圖形的方法的集合,它既可以繪製各種圖形,也可以確定在應用視窗中繪製圖形的方式,就是繪圖模式和對映模式。

在win32程式設計中,裝置環境是用hdc來標識。h: handle

獲取hdc的三種方法:

1. 通過getdc函式來獲得相應視窗的hdc

getdc函式適合在視窗現有圖形的基礎上進行繪製。

**段:

getdc總傳入的引數hwnd是視窗的控制代碼,它返回和這個視窗相關的dc.

2. 通過beginpaint函式來獲得所在視窗的hdc

beginpaint和endpaint用於響應wm_paint訊息

beginpaint函式是將視窗上所有內容清除乾淨,然後在上面繪製

code:

typedef struct tagpaintstructpaintstruct;

3. 通過createcompatibledc建立相容記憶體dc

一般用於解決介面的閃爍問題

code:

常用的gdi物件的介紹:

畫筆pen:

在gdi中,用hpen來表示畫筆,畫線,畫邊框(如矩形邊框,圓邊框,餅邊框)都是採用畫筆來操作的。

gdi預設的畫筆為黑色,寬度為1,樣式為solid

畫刷brush:

在gdi中,用hbrush來表示畫刷。填充矩形,填充圓,填充餅等以及刷視窗背景都是通過畫刷來操作的。gdi預設的畫刷是白色的。

字型font:

在gdi中,用hfont來表示字型。所有文字繪製都要基於具體的字型物件來繪製的。

gdi中預設的字型是系統等寬字型。

區域region:

在gdi中,用hregn來表示區域,在視窗中,乙個區域可以是橢圓形,多邊形或矩形。

點陣圖bitmap:

在gdi中,用hbitmap來表示位圖。gdi的繪製分為圖形繪製(線,矩形,橢圓,餅等),影象繪圖(位圖)

selectobject:

hgdiobj winapi selectobject(hdc hdc,hgdiobj h);

第乙個引數是裝置dc

第二個引數是hgdiobj,其實是乙個void*. 這個函式傳入乙個新的gdi物件到第乙個引數的dc中,並返回該dc的老的同型別的gdi物件。

gdi物件的例子:

;lf.lfwidth = 16;

lf.lfheight = 40;

lf.lfcharset = gb2312_charset;

hfont hfont = ::createfontindirect(&lf);

hfont holdfont = ::selectobject(hdc,hfont);

drawtext(hdc,_t("abc"),3,&rect,dt_left);

...::selectobject(hdc,holdfont);

::deleteobject(hfont);

}庫存gdi物件的使用:

//畫刷

#define white_brush 0 // 白色畫刷

#define ltgray_brush 1 // 亮灰色畫刷

#define gray_brush2// 灰色畫刷

#define dkgray_brush3 // 深灰色畫刷

#define black_brush4 // 黑色畫刷

#define null_brush5// 空畫刷,透明畫刷

#define hollow_brushnull_brush

// 畫筆

#define white_pen  6// 白色畫筆

#define black_pen7// 黑色畫筆

#define null_pen8// 空畫筆

// 字型

#define oem_fixed_font10

#define ansi_fixed_font 11

#defineansi_var_font12

#define system_font13

#define device_default_font14

#define default_palette15

#definesystem_fixed_font16

#definedefault_gui_font17

通過物件的id號來獲得庫存的gdi物件的函式如下:

hgdiobj getstockobject(int i);

getstockobject(white_pen)

stock:庫存,getstockobject獲取的物件不需要銷毀,因為庫存物件是整個系統共用的。

gdi物件的資訊獲取:

獲得物件的一些資訊可以通過呼叫getobject函式來實現:

int winapi getobject(handle h,int c,lpvoid pv);

第乙個引數填入gdi物件的控制代碼

第二個引數填入結構的大小

第三個引數填入結構的指標

比如:點陣圖hbitmap物件的結構是bitmap,畫刷hbrush物件的結構是logbrush。現以獲得位圖物件的資訊為例:得到點陣圖的寬度和高度:

bitmap bm;

::getobject(hbitmap,sizeof(bitmap)&bm);

typedef struct tagbitmap bitmap, *pbitmap;

dc和gdi裝置之間的關係:

dc:畫布,gdi:繪製裝置

與顏色:

rgb,各個分量取值(0-255),沒有透明度資訊,rgb實際占用三個位元組。

argb: 占用四個位元組

GDI 學習筆記之GDI 環境初始化

儘管以前接觸過一下gdi 但決心從現在開始系統學習gdi 所用的教材為 精通gdi程式設計 在vs 2010以下版本的vs 編譯器使用gdi 都需要對gdi 環境進行初始化操作 vs 2010中的mfc 10依賴gdi 故不用初始化 vs 2003 vs 2005和vs 2008的gdi 環境初始化...

GDI 學習筆記之GDI 環境初始化

儘管以前接觸過一下gdi 但決心從現在開始系統學習gdi 所用的教材為 精通gdi程式設計 在vs 2010以下版本的vs 編譯器使用gdi 都需要對gdi 環境進行初始化操作 vs 2010中的mfc 10依賴gdi 故不用初始化 vs 2003 vs 2005和vs 2008的gdi 環境初始化...

GDI 學習筆記之GDI 環境初始化

儘管以前接觸過一下gdi 但決心從現在開始系統學習gdi 所用的教材為 精通gdi程式設計 在vs 2010以下版本的vs 編譯器使用gdi 都需要對gdi 環境進行初始化操作 vs 2010中的mfc 10依賴gdi 故不用初始化 vs 2003 vs 2005和vs 2008的gdi 環境初始化...