[轉]MFC獲取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)。
就相當於你在畫布上畫圖,你手里本來默認拿着一只白色的畫筆,現在你要畫藍色線條,所以你選了一個藍色畫筆,畫圖完畢,你還要恢復你手里默認拿着的白色畫筆。

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM