獲取DC

經常需要DC的

一:

     HDC hdc;

     hdc=::GetDc(m_hWnd);加兩個冒號表示我們用的是全局SDK的函數,否則表示我們有的是CWND中的函數

     ::ReleaseDc(m_hWnd,hdc);

二:

    CDC *pdc=GetDC();
    ReleaseDC(pdc);

必須要釋放,每個進程的GDI句柄數是有上限的(MSDN: The number of DCs is limited only by available memory. ),超過上限後,進程再GetDC就會失敗

CDC * ppDC = GetDC();
ppDC->TextOut(0,0,"zhaonan");

 

 

三:

    CClientDC dc(this);不需要我們去釋放,自己會去釋放;

CClientDC dc(this);
dc.TextOut(0,0,"zhaonan");

四:

    CWindowDC dc(this);阤不需要我們去釋放,好處是可以訪問整個屏幕區域;

CWindowDC dc(this);
dc.TextOut(0,0,"zhaonan");

 

實驗二三四結果怎麼是一樣的呢? 

五:

CPaintDC(),只在OnPaint中使用,那麼OnPaint和OnDraw的關係呢?

OnPaint是WM_PAINT消息的消息處理函數,在OnPaint中調用OnDraw,一般來說,用戶自己的繪圖代碼應放在OnDraw中。

MFC中OnDraw與OnPaint的區別 - xiexievv的專欄 - CSDN博客  https://blog.csdn.net/xiexievv/article/details/6271153

 

 

GetDC():最常見的取得DC的用法,如果是API的話,給它一個窗口句柄,它返回給你這個窗口的DC,這樣取得的DC 必須 手動用ReleaseDC()來釋放,否則……嘿嘿
舉例: HDC dc = GetDC(NULL); // 如果窗口句柄設爲NULL,取得整個屏幕的DC

CClientDC()和CWindowDC():更好用的取得DC的用法,前面一個取得當前窗口的客戶區的DC,後面那個取得整個窗口的DC,這樣得到的DC用完就完了,它會自己處理後事,包括釋放
舉例: CClientDC dc;

CPaintDC():專用於OnPaint(),它構造的時候會調用CWnd::BeginPaint(),析構的時候調用CWnd::EndPaint()
舉例: CPaintDC dc;

1)API函數方法用HDC
 
HDC hdc;
hdc=::GetDC(m_hWnd);
MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL);
LineTo(hdc,point.x,point.y);
::ReleaseDC(m_hWnd,hdc);//必須成對使用
這裏獲得GetDC()函數需要跟ReleaseDC()函數成對使用
 
2)用CDC類成員函數。此時別忘記ReleaseDC
 
CDC *pDC=GetDC();
pDC->MoveTo(m_ptOrigin);
pDC->LineTo(point);
ReleaseDC(pDC);//必須成對使用
同樣需要成對使用手動釋放DC
 
3)用CClientDC
 
CClientDC dc(this);
//CClientDC dc(GetParent());
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);//此處不需要ReleaseDC,因爲CClientDC會自動釋放DC
CClientDC構造函數傳遞一個窗口類的對象。其在用完後自動釋放DC,不需要顯式的調用ReleaseDC()
 
4)用CWindowDC,用它甚至可以整個屏幕區域畫線
 
CWindowDC dc(this);
//CWindowDC dc(GetParent());
/*CWindowDC dc(GetDesktopWindow());//此時可以在整個屏幕上畫線。
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);*/
CPen pen(PS_DOT,1,RGB(0,255,0));
CClientDC dc(this);
CPen *pOldPen=dc.SelectObject(&pen);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
dc.SelectObject(pOldPen);
同樣CWindowDC構造函數也需要傳遞一個窗口類的對象。與CClientDC的區別是該對象可以訪問整個窗口區域,包括框架窗口(菜單欄,工具欄)。而CClientDC只能訪問的是客戶區。
 
這裏同時可以初步瞭解一下
 
CPen *pOldPen=dc.SelectObject(&pen);函數,同時注意一下其返回值!
 
這是GDI畫圖的特點,當給dc執行一次SelectObject,它將返回前一次SelectObject的內容,繪圖完畢,執行dc.SelectObject(pOldPen)。
就相當於你在畫布上畫圖,你手裏本來默認拿着一隻白色的畫筆,現在你要畫藍色線條,所以你選了一個藍色畫筆,畫圖完畢,你還要恢復你手裏默認拿着的白色畫筆。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章