1樓:火駒
cclientdc(cwnd* pwnd); 建構函式有1個引數是cwnd*指標。
若在檢視類中,這樣寫
cclientdc dc(this);
2樓:匿名使用者
cclientdc建構函式要傳乙個cwnd指標
mfc 中 我定義乙個物件cclientdc dc(this); 然後想dc. 但是.後面沒有出現他的成員函式
3樓:孤松獨海
這個mfc有bug,有時候後面不出來,你關閉了工程重新開啟就會出現了。
4樓:地球9號
刪除工程下.ncb檔案,不過可能還會再次出現此問題,只能反覆刪除。
5樓:匿名使用者
你裝個vc 助手。。很方便的~
關於mfc中的cclientdc的問題
6樓:夜來雨早來晴
this是在視窗類內獲取本視窗指標的方法.
無論在**需要dc,首先要獲取已存在的視窗指標(或控制代碼專)屬,才能獲取dc.括號裡面,就是視窗指標.
在mfc中,有多種框架內獲取視窗指標的方法,這要看你在什麼位置,需要獲取什麼視窗的指標.
常用函式包括:
afxgetmainwnd();//獲取主框架視窗
mdigetactive()->getactiveview;//框架視窗獲取多文件的當前檢視
getactivedocument()->getfirstviewposition() / getnextview() //通過文件獲取檢視視窗。
7樓:匿名使用者
getdc之後要releasedc,
createcompatibledc之後需要deletedccclientdc dc(this);
系統會自動**的 不用進行刪除
8樓:匿名使用者
cclientdc 的析構函式自動幫你呼叫釋放掉了,你不用顯示呼叫...否則,兩遍...
mfc裡的dc是什麼意思?怎麼使用dc?最好能舉個例子說明一下?
9樓:何渡忘川
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中的dc、cdc、hdc、控制代碼、裝置上下文究竟是什麼意思? 希望能解答詳細一點點 謝謝了
10樓:回頭的世界
dc: device context,中文也叫裝置上下文,通俗的理解叫視窗顯示描述裝置也行;
cdc: mfc中封裝了作業系統視窗輸出底層api的封裝類,如cdc的派生類cclientdc,用於視窗客戶區域的輸出。
hdc: vc++開發環境中的dc控制代碼型別,32位元的無符號整數型別,用來標識dc裝置的控制代碼。
裝置上下文:看上面解釋的第一行。
用vs2019怎麼在窗體中用c建個圓點和button鍵,實
你這個是想做五子棋麼?可以參考gdi 那裡有你想要的東西 vs2010 c windows窗體應用程式如何通過按鈕開啟另乙個窗體 語句放到 按鈕的button click 函式內cdialog2 dlg 這就是建立乙個視窗物件,cidalog2就是你要跳轉的那個視窗名稱 dlg.domodal 開啟...
求大神vs2019基於mfc的程式已經連線了mysql資料庫
你弄好了沒有?我也遇到這個問題了,不知道該怎麼辦?mfc如何遠端連線mysql資料庫,主要是vs需要修改包含目錄和庫目錄,這個好像在本地。10 odbc連線是在系統設定裡設定所連線的資料庫的,因此對應用程式來講,odbc的名字才是所關心的。至於odbc連線到哪個資料庫,應用程式不需要關心。也就是說o...
安裝VS2019後我選了C模式,怎樣改為C的
工具 匯入匯出設定 重置所有設定 下一步 可以選擇你要選擇的環境了 建立工程的時候可以選的,你應該選建立c 的工程.我安裝了vs2010,配置時選擇了c 但是現在我需要用c 要怎麼辦呢?如果只是一兩次用c 可以新建工程的時候選擇other languages 如果以後大部分時候都用c 可以在tool...