MFC----DC

来源:互联网 发布:网络零售市场交易额 编辑:程序博客网 时间:2024/05/21 08:39



类CClientDC派生于CDC,在构造时调用了Windows函数GetDC,在析构时调用了ReleaseDC。这意味着和CClientDC对象相关的设备上下文是窗口的客户区。

几种DC及区别

  CClientDC:(客户区设备上下文)用于客户区的输出,与特定窗口关联,可以让开发者访问目标窗口中客户区,其构造函数中包含了GetDC,析构函数中包含了ReleaseDC:
  用法是:CClientDC dc(this);//this一般指向本窗口或当前活动视图dc.TextOut(10,10,str,str.GetLength());//利用dc输出文本,如果是在CScrollView中使用,还要注意调用OnPrepareDC(&dc)调整设备上下文的坐标。CPaintDC用于响应窗口重绘消息(WM_PAINT)时的绘图输出。CPaintDC在构造函数中调用BeginPaint()取得设备上下文,在析构函数中调用EndPaint()释放设备上下文。EndPaint()除了释放设备上下文外,还负责从消息队列中清除WM_PAINT消息。因此,在处理窗口重画时,必须使用CPaintDC,否则WM_PAINT消息无法从消息队列中清除,将引起不断的窗口重画。CPaintDC也只能用在WM_PAINT消息处理之中。
  CWindowDC:关联一特定窗口,允许开发者在目标窗口的任何一部分进行绘图,包含边界与标题,这种DC同WM_NCPAINT消息一起发送
  CWindowDC与CClientDC,CPaintDC的区别:CWindowDC可在非客户区绘制图形,而CClientDC,CPaintDC只能在客户区绘制图形。CWindowDC下坐标原点是在屏幕的左上角,CClientDC,CPaintDC下坐标原点是在客户区的左上角。CClientDC与CPaintDC的区别:
  CPaintDC的对象一般用在OnPaint内以响应Windows消息WM_PAINT,自动完成绘制,在整个窗口内进行重画,维持原有窗口完整性。CClientDC应用在非响应Windows消息WM_PAINT的情况下,进行实时绘制,绘制的区域内被重画。 

MFC中的绘图功能需要用到DC,即设备上下文环境,下面列举出几中常用的DC和用法(以直线绘制为例子).
1.普通DC
   HDC hdc;//声明一个DC句柄
   hdc=::GetDC(m_hWnd);
//通过API函数获得当前窗口类的DC句炳(如果在类的成员函数中使用的              话),m_hWnd是每个窗 口类都有的一个与自身相关的窗口句柄.
   MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL);//原点的移动
   LineTo(hdc,point.x,point.y);//绘制一条从新原点到(x,y)的直线.
   ::ReleaseDC(m_hWnd,hdc);//释放DC

  
   用另外一种方法(指针)
CDC *pDC=GetDC();//用窗口的成员函数获得DC指针
pDC->MoveTo(m_ptOrigin);
pDC->LineTo(point);
ReleaseDC(pDC);//这几句不用多说了吧

2用CWindowDC类(用类操作的一个好处是:可以不用显式地释放DC,由类的析构函数处理)
CWindowDC dc(this);
CWindowDC dc(GetParent());
CWindowDC dc(GetDesktopWindow());
//这三句任意选取一句就好了,至于区别应该不难看出吧.
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
CWindowDC用于整个窗口,包括非客户区

3 使用CClientDC
CClientDC dc(this);
CClientDC dc(GetParent());
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
CClientDC用于窗口客户区
0 0