获取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)。
就相当于你在画布上画图,你手里本来默认拿着一只白色的画笔,现在你要画蓝色线条,所以你选了一个蓝色画笔,画图完毕,你还要恢复你手里默认拿着的白色画笔。

 

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