
作者:劉勝 和c/c++相關(guān) 2009916
簡介:這是CDC簡介的詳細(xì)頁面,介紹了和c/c++,有關(guān)的知識(shí),加入收藏請(qǐng)按鍵盤ctrl+D,要查看更多相關(guān)信息,請(qǐng)點(diǎn)擊此處
CPaintDC dc(this);
CDC *dc=GetDlgItem(IDC_STATIC)->GetDC();
CDC *dc=GetDC();
DC(Device Context) 設(shè)備上下文,可以理解為我們要在上面寫寫畫畫的那張紙。VC中有CDC,CClientDC,CPaintDC。
CDC是Windows繪圖設(shè)備的基類。
CClientDC:
(1)(客戶區(qū)設(shè)備上下文)用于客戶區(qū)的輸出,與特定窗口關(guān)聯(lián),可以讓開發(fā)者訪問目標(biāo)窗口中客戶區(qū),其構(gòu)造函數(shù)中包含了GetDC,析構(gòu)函數(shù)中包含了ReleaseDC。
CPaintDC:
(1)用于響應(yīng)窗口重繪消息(WM_PAINT)是的繪圖輸出。
(2)CPaintDC在構(gòu)造函數(shù)中調(diào)用BeginPaint()取得設(shè)備上下文,在析構(gòu)函數(shù)中調(diào)用EndPaint()釋放設(shè)備上下文。EndPaint()除了釋放設(shè)備上下文外,還負(fù)責(zé)從消息隊(duì)列中清除WM_PAINT消息。因此,在處理窗口重畫時(shí),必須使用CPaintDC,否則WM_PAINT消息無法從消息隊(duì)列中清除,將引起不斷的窗口重畫。
(3)CPaintDC也只能用在WM_PAINT消息處理之中。
CWindowDC:
(1)可在非客戶區(qū)繪制圖形,而CClientDC,CPaintDC只能在客戶區(qū)繪制圖形。
(2)坐標(biāo)原點(diǎn)是在屏幕的左上角,CClientDC,CPaintDC下坐標(biāo)原點(diǎn)是在客戶區(qū)的左上角。
(3)關(guān)聯(lián)一特定窗口,允許開發(fā)者在目標(biāo)窗口的任何一部分進(jìn)行繪圖,包含邊界與標(biāo)題,這種DC同WM_NCPAINT消息一起發(fā)送。
兼容的DC指不是具體的圖形設(shè)備,而是虛擬的設(shè)備,例如我們可以建一個(gè)虛擬的DC來存放和畫bitmap,兼容DC的類可以理解成CDC的派生類,可以調(diào)用CDC的各種繪圖函數(shù)。
舉幾個(gè)例子吧,
1、在整個(gè)屏幕上畫畫
創(chuàng)建一個(gè)基于對(duì)話框的MFC AppWizard(exe),添加一個(gè)按鈕 button1,建立相關(guān)聯(lián)的響應(yīng)函數(shù)OnButton1(),在函數(shù)中添加如下代碼:
//獲取當(dāng)前桌面的指針
CWnd* pwnd = GetDesktopWindow();
//獲取當(dāng)前桌面的設(shè)備上下文
CDC* pdc = pwnd->GetWindowDC();
//畫圖
for(int x = 0; x < 600; x++)
for(int y = 0; y < 400; y++)
pdc->SetPixel(x,y,x*y);
編譯->運(yùn)行。
關(guān)閉程序,會(huì)發(fā)現(xiàn)桌面的圖畫還是存在,怎么在關(guān)閉對(duì)話框程序后使得圖畫也消失呢?
可以在classwizard中添加一個(gè)WM_ONDESTROY消息,并為它創(chuàng)建OnDestroy()函數(shù),在函數(shù)中添加如下代碼:
GetDesktopWindow()->RedrawWindow(NULL,NULL,RDW_INVALIDATE|RDW_ALLCHILDREN|RDW_ERASENOW);
就ok了。
2、在對(duì)話框上畫畫
接著怎么在生成的對(duì)話框中畫畫呢,可以用CClientDC即當(dāng)前程序的設(shè)備上下文。創(chuàng)建第二個(gè)按鈕button2和對(duì)應(yīng)的響應(yīng)函數(shù)OnButton2(),在OnButton2()中添加如下代碼:
CClientDC pdc(this);
for(int x = 0; x < 200; x++)
for(int y = 0; y < 200; y++)
pdc.SetPixel(x,y,x*y);
如果要為對(duì)話框設(shè)置一個(gè)背景畫呢,那就要重寫OnPaint()函數(shù)了,將OnPaint()中的代碼用以下代碼替換:
CPaintDC pdc(this);
RECT* prect = &pdc.m_ps.paintrect;
for(int x = 0; x < prect->right; x++)
for(int y = 0; y < prect->bottom; y++)
pdc->SetPixel(x,y,x+y);
3、在控件上畫畫
CDC *dc=GetDlgItem(IDC_STATIC)->GetDC();
//CDC *dc=GetDC();
for(int i=0;i<500;++i)
dc->SetPixel(10+i,10+i,0x0000ff);//用畫點(diǎn)的辦法畫一根線,最后一個(gè)參數(shù)是顏色(32位)
CPen pen(PS_SOLID,2,0x00ff00); //生成綠色畫筆
CPen *OldPen=dc->SelectObject(&pen);//把畫筆引入設(shè)備場境
dc->MoveTo(20,50); //設(shè)置畫線起點(diǎn)
dc->LineTo(520,550); //畫到終點(diǎn)
dc->Arc(100,100,300,300,350,500,350,500);//畫圓
dc->SelectObject(OldPen);
ReleaseDC(dc);
愛華網(wǎng)


