各種獲得裝置環境控制代碼的方法

2021-09-02 09:28:42 字數 2520 閱讀 9683

以下解讀來自《windows 程式設計》(第5版 珍藏版)p103~105

裝置環境

如果想希望在圖形輸出裝置(諸如螢幕或者印表機)上繪製圖形,必須首先獲得乙個裝置環境(即 dc)控制代碼。將控制代碼傳回給程式時,windows 就給了你使用裝置的許可權。接著,在 gdi 函式中將這個控制代碼作為乙個引數,告訴 windows 你將要在哪個裝置上進行繪圖。

裝置環境包含了許多決定 gdi 函式如何工作的屬性。這些屬性使得 gdi 函式只需要提供少量的引數(如繪製的起始座標),而不需要提供 windows 在裝置上顯示物件時需要的所有其它資訊。例如,呼叫 textout 函式時,你只需要在函式中給出裝置環境控制代碼(hdc)、起始座標、文字和文字的長度。你不需要指定字型、文字顏色、文字後面的背景色彩以及字元間距,因為這些屬性都是裝置環境的一部分。當你想改變這些屬性之一時,你可以通過呼叫指定函式來實現,此後針對該裝置環境的 textout 函式就會使用改變後的新屬性。

小甲魚解讀:這其實很好理解,裝置環境控制代碼(hdc)其實就是一張通行證,這張通行證上有該裝置的資訊(dc),有了它,你才被允許使用該裝置。

獲取裝置環境控制代碼

windows 提供了幾種取得裝置內容控制代碼的方法。如果在處理乙個訊息時取得了裝置環境控制代碼,應該在退出視窗函式之前釋放它(或者刪除它)。一旦釋放了控制代碼,它就不再有效了。對於印表機裝置內容控制代碼,規則就沒有這麼嚴格(我們將在後邊的教程中討論)。

方法一:

最常用的取得並釋放裝置內容控制代碼的方法是,在處理 wm_paint 訊息時,使用 beginpaint 和 endpaint 函式:

hdc = beginpaint(hwnd, &ps);

// 其他**

endpaint(hwnd, &ps);

複製**

涉及的 api 函式:

其中,變數 ps 是乙個型別為 paintstruct 的結構。這個結構中的字段 hdc 和 beginpaint 函式返回的裝置環境控制代碼的值相同。paintstruct 結構還包含了乙個名為 rcpaint 的矩形結構(【api檔案】rect 結構),該結構定義了乙個包圍窗戶區無效範圍的矩形。使用從 beginpaint 函式獲取的裝置環境控制代碼,就只能在這個矩區域內繪圖。呼叫 beginpaint 函式將使這個區域有效。

方法二:

裝置環境控制代碼還可以在處理非 wm_paint 訊息時由 windows 程式獲取:

hdc = getdc(hwnd);

// 其他**

releasedc(hwnd, hdc);

複製**

涉及的 api 函式:

其中,裝置環境指的是視窗控制代碼為 hwnd 的視窗客戶區。呼叫這些函式和使用 beginpaint、endpaint 函式組合的主要差別是從 getdc 函式返回的控制代碼可以在整個客戶區內繪製。並且,getdc 和 releasedc 函式並不使任何客戶區的無效區域變為有效。

方法三:

windows 程式還可以獲得用於整個視窗的,而不僅僅是視窗客戶區的裝置環境控制代碼:

hdc = getwindowdc(hwnd);

// 其他**

releasedc(hwnd, hdc);

複製**

涉及的 api 函式:

例如,你可以通過呼叫下面的函式獲取當前整個螢幕的裝置環境控制代碼:

hdc = createdc(text("display"), null, null, null);

複製**

在視窗外輸出文字或影象不是很好,但是對於一些特殊的應用還是有用的。(雖然在官方文件中並沒有提到這種方法,但是你還是可以通過在呼叫 getdc 時使用乙個 null 引數來得到整個螢幕的裝置環境。)在後邊的教學中,印表機的裝置環境控制代碼就是使用 createdc 函式來獲取的。

方法五:

有時候,僅需要獲取一些關於裝置環境的資訊,而不需要在上面繪製任何東西。在這些情況下,可以呼叫 createic 函式獲取乙個「資訊上下文」(information context)控制代碼。這個函式的引數和 createdc 函式的引數相同:

hdc = createic(pszdriver, pszdevice, pszoutput, pdata);

// 其他**

deletedc(hdc);

複製**

涉及的 api 函式:

【api檔案】createic

【api檔案】deletedc

但是,往裝置上寫東西時,不能使用資訊上下文控制代碼。

方法六:

處理點陣圖時,有時可能會用到乙個「記憶體裝置環境」:

hdcmem = createcompatibledc(hdc);

// 其他**

deletedc(hdcmem);

複製**

涉及的 api 函式:

在圖元檔案裝置環境有效時,使用 hdcmeta 所做的任何 gdi 呼叫都不會被直接顯示出來,它們都會變成圖元檔案的一部分。當你呼叫 closemetafile 時,圖元檔案裝置環境控制代碼變為無效,該函式返回乙個圖元檔案控制代碼(hmf)。

來自群組: winsdk

windows下獲得DC控制代碼的幾個方法

1.sdk win32 api函式在view類中獲得dc控制代碼 hdc hdc hdc getdc m hwnd releasedc m hwnd,hdc 一定要釋放控制代碼 2.利用mfc獲得dc控制代碼 cdc pdc getdc releasedc pdc 一定要釋放控制代碼 3.利用ccl...

獲取裝置的控制代碼

獲取裝置內容控制代碼的方法,hdc hdc 在處理wm paint訊息裡 1.paintstruct ps hdc beginpaint hwnd,ps 獲取裝置環境控制代碼 endpaint hwnd,ps 釋放資源 處理非wm paint 如在wm create 訊息裡使用以下函式載入裝置 2....

獲得任意程序的控制代碼

要對乙個任意程序 包括系統安全程序和服務程序 進行指定了寫相關的訪問權的openprocess操作,只要當前程序具有sededebug許可權就可以 了。要是乙個使用者是administrator或是被給予了相應的許可權,就可以具有該許可權。可是,就算我們用administrator帳號對乙個系統安 ...