MFC获取DC的四种方式

来源:互联网 发布:jquery.form.js cdn 编辑:程序博客网 时间:2024/05/21 06:47


1)API函数方法用HDC
[cpp] view plain copy
  1. HDC hdc;  
  2. hdc=::GetDC(m_hWnd);  
  3. MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL);  
  4. LineTo(hdc,point.x,point.y);  
  5. ::ReleaseDC(m_hWnd,hdc);//必须成对使用  
这里获得GetDC()函数需要跟ReleaseDC()函数成对使用


2)用CDC类成员函数。此时别忘记ReleaseDC
[cpp] view plain copy
  1. CDC *pDC=GetDC();  
  2. pDC->MoveTo(m_ptOrigin);  
  3. pDC->LineTo(point);  
  4. ReleaseDC(pDC);//必须成对使用  
同样需要成对使用手动释放DC


3)用CClientDC
[cpp] view plain copy
  1. CClientDC dc(this);  
  2. //CClientDC dc(GetParent());  
  3. dc.MoveTo(m_ptOrigin);  
  4. dc.LineTo(point);//此处不需要ReleaseDC,因为CClientDC会自动释放DC  
CClientDC构造函数传递一个窗口类的对象。其在用完后自动释放DC,不需要显式的调用ReleaseDC()


4)用CWindowDC,用它甚至可以整个屏幕区域画线
[cpp] view plain copy
  1. CWindowDC dc(this);  
  2. //CWindowDC dc(GetParent());  
  3. /*CWindowDC dc(GetDesktopWindow());//此时可以在整个屏幕上画线。 
  4. dc.MoveTo(m_ptOrigin); 
  5. dc.LineTo(point);*/  
  6. CPen pen(PS_DOT,1,RGB(0,255,0));  
  7. CClientDC dc(this);  
  8. CPen *pOldPen=dc.SelectObject(&pen);  
  9. dc.MoveTo(m_ptOrigin);  
  10. dc.LineTo(point);  
  11. dc.SelectObject(pOldPen);  
同样CWindowDC构造函数也需要传递一个窗口类的对象。与CClientDC的区别是该对象可以访问整个窗口区域,包括框架窗口(菜单栏,工具栏)。而CClientDC只能访问的是客户区。


这里同时可以初步了解一下

CPen *pOldPen=dc.SelectObject(&pen);函数,同时注意一下其返回值!

这是GDI画图的特点,当给dc执行一次SelectObject,它将返回前一次SelectObject的内容,绘图完毕,执行dc.SelectObject(pOldPen)。
就相当于你在画布上画图,你手里本来默认拿着一只白色的画笔,现在你要画蓝色线条,所以你选了一个蓝色画笔,画图完毕,你还要恢复你手里默认拿着的白色画笔。

原创粉丝点击