CDC簡介

CPaintDC dc(this);
CDC  *dc=GetDlgItem(IDC_STATIC)->GetDC();
CDC  *dc=GetDC();

DC(Device Context) 設備上下文,可以理解爲我們要在上面寫寫畫畫的那張紙。VC中有CDC,CClientDC,CPaintDC。

CDC是Windows繪圖設備的基類。

CClientDC:
(1)(客戶區設備上下文)用於客戶區的輸出,與特定窗口關聯,可以讓開發者訪問目標窗口中客戶區,其構造函數中包含了GetDC,析構函數中包含了ReleaseDC。

CPaintDC:
(1)用於響應窗口重繪消息(WM_PAINT)是的繪圖輸出。
(2)CPaintDC在構造函數中調用BeginPaint()取得設備上下文,在析構函數中調用EndPaint()釋放設備上下文。EndPaint()除了釋放設備上下文外,還負責從消息隊列中清除WM_PAINT消息。因此,在處理窗口重畫時,必須使用CPaintDC,否則WM_PAINT消息無法從消息隊列中清除,將引起不斷的窗口重畫。
(3)CPaintDC也只能用在WM_PAINT消息處理之中。

CWindowDC:
(1)可在非客戶區繪製圖形,而CClientDC,CPaintDC只能在客戶區繪製圖形。
(2)座標原點是在屏幕的左上角,CClientDC,CPaintDC下座標原點是在客戶區的左上角。
(3)關聯一特定窗口,允許開發者在目標窗口的任何一部分進行繪圖,包含邊界與標題,這種DC同WM_NCPAINT消息一起發送。


兼容的DC指不是具體的圖形設備,而是虛擬的設備,例如我們可以建一個虛擬的DC來存放和畫bitmap,兼容DC的類可以理解成CDC的派生類,可以調用CDC的各種繪圖函數。
舉幾個例子吧,

1、在整個屏幕上畫畫

創建一個基於對話框的MFC AppWizard(exe),添加一個按鈕 button1,建立相關聯的響應函數OnButton1(),在函數中添加如下代碼:

//獲取當前桌面的指針

CWnd* pwnd = GetDesktopWindow();

//獲取當前桌面的設備上下文

CDC* pdc = pwnd->GetWindowDC();

//畫圖

for(int x = 0; x < 600; x++)
    for(int y = 0; y < 400; y++)
          pdc->SetPixel(x,y,x*y);

編譯->運行。

關閉程序,會發現桌面的圖畫還是存在,怎麼在關閉對話框程序後使得圖畫也消失呢?

可以在classwizard中添加一個WM_ONDESTROY消息,併爲它創建OnDestroy()函數,在函數中添加如下代碼:

GetDesktopWindow()->RedrawWindow(NULL,NULL,RDW_INVALIDATE|RDW_ALLCHILDREN|RDW_ERASENOW);

就ok了。

2、在對話框上畫畫

接着怎麼在生成的對話框中畫畫呢,可以用CClientDC即當前程序的設備上下文。創建第二個按鈕button2和對應的響應函數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);

如果要爲對話框設置一個背景畫呢,那就要重寫OnPaint()函數了,將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);//用畫點的辦法畫一根線,最後一個參數是顏色(32位)

CPen pen(PS_SOLID,2,0x00ff00); //生成綠色畫筆
CPen *OldPen=dc->SelectObject(&pen);//把畫筆引入設備場境


dc->MoveTo(20,50); //設置畫線起點
dc->LineTo(520,550);      //畫到終點

dc->Arc(100,100,300,300,350,500,350,500);//畫圓

dc->SelectObject(OldPen);

ReleaseDC(dc);

發佈了22 篇原創文章 · 獲贊 25 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章