在mfc中dcselectobject中的dc是什麼意思

2021-03-21 00:45:50 字數 5988 閱讀 4423

1樓:小名鬆鬆

dc是畫圖的控制代碼,就相當於某一個東西上的畫板

有了這個才可以在控制元件上畫出你要的東西

2樓:匿名使用者

這裡的dc是指向cdc類的一個物件;表示裝置上下文:dc.selectobject();表示選入上下文,可以是畫刷等,去檢視cdc類吧,用msdn

mfc中是什麼意思

3樓:襲鸞彭頡

oldfont是dc

的上一個

hfont,這裡只是做一下備份;

gdi太老啦

。。。win7

或以上使用者改用

direct2d

吧。。。

mfc裡的dc是什麼意思

4樓:匿名使用者

dc就是一個裝置指標,c++為了遮蔽裝置差異,專門定義了一個虛擬裝置指標,獲取後,可在任何環境下進行操作。cdc是一個繪圖的指標

5樓:匿名使用者

dc:device context 畫圖用的

cdc表示是一個dc的類

mfc裡的dc是什麼意思?怎麼使用dc?最好能舉個例子說明一下?

6樓:何渡忘川

dc(裝置描述表):windows應用程式通過為指定裝置(螢幕,印表機等)建立一個裝置描述表(device context, dc)在dc表示的邏輯意義的「畫布」上進行圖形的繪製。dc是一種包含裝置資訊的資料結構,它包含了物理裝置所需的各種狀態資訊。

win32程式在繪製圖形之前需要獲取dc的控制代碼hdc,並在不繼續使用時釋放掉。

在c++ 程式設計中常會見到hdc,cdc,cclientdc,cpaintdc,cwindowdc這樣的類。

hdc是dc的控制代碼,api中的一個類似指標的資料型別。

cdc是mfc的dc的一個類。

cdc等裝置上下分類,都含有一個類的成員變數:m_nhdc;即hdc型別的控制代碼。

cdc及其派生類的繼承檢視:

cobject

public |------cdc

public |------|------cclientdc

public |------|------cpaintdc

public |------|------cwindowdc

public |------|------cmetafiledc

(注意: 除cmetafiledc以外的三個派生類用於圖形繪製.)

cdc類定義了一個裝置描述表相關的類,其物件提供成員函式操作裝置描述表進行工作,如顯示器,印表機,以及顯示器描述

表相關的視窗客戶區域。

通過cdc的成員函式可進行一切繪圖操作。cdc提供成員函式進行裝置描述表的基本操作,使用繪圖工具,選擇型別安全的圖形裝置結構(gdi),以及色彩,調色盤。除此之外還提供成員函式獲取和設定繪圖屬性,對映,控制視口,窗體範圍,轉換座標,區域操作,裁減,劃線以及繪製簡單圖形(橢圓,多邊形等)。

成員函式也提供繪製文字,設定字型,印表機換碼,滾動,處理元檔案。

其派生類:

1.cpaintdc:封裝beginpaint和endpaint兩個api的呼叫。

(1)用於響應視窗重繪訊息(wm_paint)的繪圖輸出。

(2)cpaintdc在建構函式中呼叫beginpaint()取得裝置上下文,在解構函式中呼叫endpaint()釋放裝置上下文。 endpaint()除了釋放裝置上下文外,還負責從訊息佇列中清除wm_paint訊息。因此,在處理視窗重畫時,必須使用cpaintdc,否則 wm_paint訊息無法從訊息佇列中清除,將引起不斷的視窗重畫。

(3)cpaintdc也只能用在wm_paint訊息處理之中。

2.cclientdc(客戶區裝置上下文): 處理顯示器描述表的相關的窗體客戶區域。

構造時自動呼叫getdc函式,析構時自動呼叫releasedc函式.一般應用於客戶區視窗的繪製。

當需要處理一個滑鼠的單擊,然後馬上畫出一個圓,你不能等到下一個wm_paint的訊息到來才畫圖,而是馬上,這是就需要cclientdc了。它可以在onpaint的外面建立一個客戶區域dc

void cmainwindow::onlbuttondown (uint nflags, cpoint point)

3.cwindowdc: 處理顯示器描述表相關的整個窗體區域,包括了框架和控 件(子窗體)。

(1)可在非客戶區繪製圖形,而cclientdc,cpaintdc只能在客戶區繪製圖形。

(2)座標原點是在螢幕的左上角,cclientdc,cpaintdc下座標原點是在客戶區的左上角。

(3)關聯一特定視窗,允許開發者在目標視窗的任何一部分進行繪圖,包含邊界與標題,這種dc同wm_ncpaint訊息一起傳送。

4.cmetafiledc:與元檔案相關的裝置描述表關聯。

下面說下一些細點的知識點

1、cclientdc,cwindowdc 區別不大, 可以說 cwindowdc包含了cclientdc。 就拿記事本來說,cclientdc 就只是我們可以編輯文字的那個區域,是客戶區,cwindowdc 除了上面說的區域, 還包括選單欄和工具欄等。

2、cclientdc和cwindowdc與 cpaintdc 的區別大點,在dc的獲取方面 cclientdc和cwindowdc 使用的是並只能是getdc 和 releasedc。cpaintdc 使用的是並只能是 beginpaint 和 endpaint。

3、cpaintdc只能用在響應 wm_paint 事件cclientdc,cwindowdc 只能用在響應非wm_paint 事件

4、關於 wm_paint事件

系統會在多個不同的時機傳送wm_paint訊息:當第一次建立一個視窗時,當改變視窗的大小時,當把視窗從另一個視窗背後移出時,當最大化或最小化視窗時,等等,這些動作都是由系統管理的,應用只是被動地接收該訊息,在訊息處理函式中進行繪製操作;大多數的時候應用也需要能夠主動引發視窗中的繪製操作,比如當視窗顯示的資料改變的時候,這一般是通過invalidaterect和invalidatergn函式來完成的。invalidaterect和 invalidatergn把指定的區域加到視窗的update region中,當應用的訊息佇列沒有其他訊息時,如果視窗的update region不為空時,系統就會自動產生wm_paint訊息。

系統為什麼不在呼叫invalidate時傳送wm_paint訊息呢?又為什麼非要等應用訊息佇列為空時才傳送wm_paint訊息呢?這是因為系統把在視窗中的繪製操作當作一種低優先順序的操作,於是儘可能地推後做。

不過這樣也有利於提高繪製的效率:兩個wm_paint訊息之間通過 invalidaterect和invaliatergn使之失效的區域就會被累加起來,然後在一個wm_paint訊息中一次得到更新,不僅能避免多次重複地更新同一區域,也優化了應用的更新操作。像這種通過invalidaterect和invalidatergn來使視窗區域無效,依賴於系統在合適的時機傳送wm_paint訊息的機制實際上是一種非同步工作方式,也就是說,在無效化視窗區域和傳送wm_paint訊息之間是有延遲的;有時候這種延遲並不是我們希望的,這時我們當然可以在無效化視窗區域後利用sendmessage 傳送一條wm_paint訊息來強制立即重畫,但不如使用windows gdi為我們提供的更方便和強大的函式:

updatewindow和redrawwindow。updatewindow會檢查視窗的update region,當其不為空時才傳送wm_paint訊息;redrawwindow則給我們更多的控制:是否重畫非客戶區和背景,是否總是傳送 wm_paint訊息而不管update region是否為空等。

5、hdc和cdc相互轉換:

(1)、hdc到cdc的轉換:

方法一: 此方法在裝置結束時不會銷燬原來的資源(即:hdc,hbitmap)

cdc *pdc = cdc::fromhandle(hdc);

方法二:此方法在裝置結束時會銷燬原來的資源(即:hdc,hbitmap)

cdc dc;

dc.attach(hdc);

(2)、cdc到hdc的轉換:

cdc dc;

hdc hdc;

hdc = dc.getsafehdc();

6、首先:cdc 不可以釋放。 fromhandle 是通過 hdc 來建立了一個cdc 物件,以方便操作,釋放 dc 的操作應該針對於hdc 而非此cdc , 如果釋放了它 pdc->releasedc,就會造成隱患。

hdc hdc = getdc(hwnd);

cdc *pdc = cdc::fromhandle(hdc);

這兩者是指向的一個dc物件,只能釋放一次,而這個釋放應該針對 hdc 而非 pdc。

然後:getdc和releasedc的呼叫匹配,createdc和deletedc的呼叫匹配。getdc是從視窗獲取現有的dc,而createdc是建立dc,所以releasedc和deletedc的作用一個是釋放,一個是銷燬。

mfc中關於;的疑問。

7樓:

oldfont 是 dc 的上一個 hfont,這裡只是做一下備份;

gdi 太老啦 。。。win7 或以上使用者改用 direct2d 吧 。。。

dc.selectobjet(&pen) 與selectobject(dc,&pen)是不是一樣的呢?

8樓:秋天來了仔陳

dc.selectobjet(&pen);//用在mfc中dc.selectobject(pen);也是可以的,因為cpen封裝了。

等價於::selectobject(dc.m_hdc,&(pen.m_hpen);//windows api

其他兩種寫法都是錯的。

9樓:匿名使用者

兩個語句必然有一個是錯誤的,前一個dc必須是cdc類的例項,後一個dc,必須是dc裝置控制代碼。

不考慮語法和用法錯誤,這兩個函式功能是一樣的,前一個作為cdc類成員函式,做了安全處理並呼叫了系統api函式(你的後一個)

10樓:magic_旭

功能是一樣的,一個是直接呼叫api,一個是在其內部封裝了該api

mfc初學,如圖,請問這個程式的兩處selectobject是做什麼用的?只用一處可以麼?謝謝

11樓:匿名使用者

selectobject的作用是將指定gdi物件選定進入指定的dc,並作為其繪畫時使用的當前物件。

請仔細看下面這段話:

確保釋放dc的時候dc中的各gdi物件都不是你自己建立的!!!!確保個gdi物件在釋放的時候不被任何dc選中使用!!!!

假如我們要使用gdi函式畫圖,正確的步驟應該如下:

a.建立一個記憶體相容dc(create***patibledc)

b.建立一個記憶體相容bitmap(create***patiblebitmap)

c.關聯建立的記憶體相容dc和bitmap(selectobject)

d.畫圖

e.bitblt到目的dc上

f.斷開記憶體相容dc和bitmap關聯(selectobject)

g.銷燬記憶體相容bitmap

h.銷燬記憶體相容dc

由於selectobject在選入一個新的gdi物件的時候會返回一個原來的gdi物件(假如成功的話),所以需要在步驟c的時候儲存返回值,在步驟f的時候當作入口引數使用.還有,步驟g和步驟h實際上順序可以隨意,因為他們兩個此刻已經沒有關係了,但是為了結構清晰,我建議按照 "先create的後釋放,後create的先釋放 "的原則進行.

關於步驟f,可能會有爭議,因為即使省略這一步,步驟g和步驟h看起來照樣可以返回一個成功的值.但實際上可能並沒有執行成功,至少boundschecker會報告有錯,錯誤資訊大致是說,在釋放dc的時候還包含有非預設的gdi物件,在釋放gdi物件的時候又說這個gdi物件還被一個dc在使用.所以,我建議保留步驟f.

mfc中怎麼連線sql資料庫,MFC中怎麼連線SQL資料庫

告訴你個簡單的方法,直接新增一個類,基類是crecordset,然後選擇你所新增的資料來源就ok了。前提是你首先要在控制面板,管理工具,odbc資料來源中新增你的資料庫 j a中怎麼連線sql資料庫 mfc用ado連線資料庫 sql server 的相關問題 望大神解決啊 一般是 data sour...

c中的MFC是什麼意思vc中的mfc到底是什麼?

mfc是微來軟基礎類庫的簡稱,是微軟 源公司實現的一bai個c 類庫,主要封裝了大部分的duwindows api函式,zhivc 是微軟公司開發dao的c c 的整合開發環境,所謂整合開發環境,就是說利用它你可以編輯,編譯,除錯,而不是使用多種工具輪換操作,靈活性較大。有時人們說vc呢也指它的內部...

MFC編輯框中游標問題,MFC 編輯框中 如何獲得游標所在位置

據我所知,你還是不要用那個updatedata函式,如果你想往編輯框裡的某個位置插入字串,你可以用setsel,然後replacesel插入字串,應該就可以了 vc6.0mfc怎麼讓編輯框裡預設顯示游標 資源編輯器中,開啟對話方塊資源,ctrl d設定控制元件順序 tab order 將編輯框設定為...