DC、HDC和CDC的区别及MFC常见类的作用

DC:设备上下文(设备描述表),是WINDOWS的一种数据类型。

HDC:设备上下文句柄(可以理解为指向DC结构的指针),它指向一块描述设备的相关的内容的内存块。

CDC:是MFC里面的一个类,且这类封装了几乎所有关于HDC的操作,由于类的内部包含一个m_hWnd的句柄,

所以,CDC封装的操作(函数)与SDK平台中与关于HDC的操作都缺少一个指向设备上网的句柄(不是没有,而是这个句柄在被封装起来)。

程序画线(WINDOWS编程基于消息机制的,通过MoveTo函数(先让鼠标所在的位置移动到另一个位置,再画线,否则,你线就画不出来了)和LineTo函数(从MoveTo函数移所移动的点位置到鼠标所在的位置,这样一条直线就可以画出来了))

1、直线的画法和曲线及扇形(需要三个点)的画法,MFC每次窗口重绘都会加载视图类的onDraw成员函数。

HDC画直线实例:

HDC hdc;
hdc=::GetDC(m_hWnd);
::MoveToEx(hdc,m_sPoint.x,m_sPoint.y,NULL);
::LineTo(hdc,m_ePoint.x,m_ePoint.y);
::ReleaseDC(m_hWnd,hdc);

CDC画直线实例:

CDC *cdc=GetDC();
cdc->MoveTo(m_sPoint);
cdc->LineTo(m_ePoint);
ReleaseDC(cdc);

CDC画曲线实例:

 
  1. void CTestqView::OnMouseMove(UINT nFlags, CPoint point)

  2. {

  3. // TODO: Add your message handler code here and/or call default

  4.  
  5. CDC *cdc=GetDC();

  6. if (m_draw==TRUE)

  7. {

  8. cdc->MoveTo(m_sPoint);

  9. cdc->LineTo(point);

  10. m_sPoint=point;

  11. }

  12.  
  13. CView::OnMouseMove(nFlags, point);

  14. }


 

采用GDI绘图:

HDC hdc;
hdc=::GetDC(m_hWnd);
HPEN hpen=::CreatePen(PS_SOLID,1,RGB(255,0,55));//创建画笔
HPEN oHpen;
oHpen=(HPEN)::SelectObject(hdc,hpen);//把新的画笔填充到DC
::MoveToEx(hdc,m_sPoint.x,m_sPoint.y,NULL);
::LineTo(hdc,m_ePoint.x,m_ePoint.y);
::SelectObject(hdc,oHpen);
::DeleteObject(hpen);
::ReleaseDC(m_hWnd,hdc);

MFC常见的类:

CCmdTarget:是MFC类库中消息(消息分为:标准消息(只有由CWnd类派生来的类才可以接受到此类消息)、命令消息(CCmdTarget的派生类都可以接收到此类消息)、通知消息)映射体系的一个基类,是MFC处理命令消息的基础、核心。消息映射把命令或消息引导给用户为之编写的响应函数。

CWnd:窗口,   它是大多数“看得见的东西”的父类(Windows里几乎所有看得见的东西都是一个窗口,大窗口里有许多小窗口),比如视图CView、框架窗口CFrameWnd、工具条CToolBar、对话框CDialog、按钮CButton,etc;一个例外是菜单(CMenu)不是从窗口派生的。该类很大,一开始也不必学,知道就行了。 

CDocument文档,负责内存数据与磁盘的交互。最重要的是OnOpenDocument(读入),OnSaveDocument(写盘),Serialize(读写) 

CView视图,负责内存数据与用户的交互。包括数据的显示、用户操作的响应(如菜单的选取、鼠标的响应)。最重要的是OnDraw(重画窗口),通常用CWnd::Invalidate()来启动它。另外,它通过消息映射表处理菜单、工具条、快捷键和其他用户消息。你自己的许多功能都要加在里面,你打交道最多的就是它。 

CDC设备文本。无论是显示器还是打印机,都是画图给用户看。这图就抽象为CDC。CDC与其他GDI(图形设备接口)一起,完成文字和图形、图像的显示工作。把CDC想象成一张纸,每个窗口都有一个CDC相联系,负责画窗口。CDC有个常用子类CClientDC(窗口客户区),画图通常通过CClientDC完成。 

CDialog对话框 

CWinApp应用程序类。似于C中的main函数,是程序执行的入口和管理者,负责程序建立、消灭,主窗口和文档模板的建立。最常用函数InitInstance():初始化。 

CGdiObject及子类,用于向设备文本画图。它们都需要在使用前选进DC。 

CPen笔,画线 

CBrush刷子,填充 

CFont字体,控制文字输出的字体 

CBitmap位图 

CPalette调色板 

CRgn区域,指定一块区域可以用于做特殊处理。 

CFile文件。最重要的不外是Open(打开),Read(读入),Write(写) 

CString字符串。封装了C中的字符数组,非常实用。 

CPoint点,就是(x, y)对 

CRect矩形,就是(left, top, right, bottom) 

CSize大小,就是(cx, cy)对(宽、高) 

转:https://blog.csdn.net/weiyong1999/article/details/8676893

Windows使用与设备无关 的图形设备环境(DC: Device Context) 进行显示。MFC基础类库定义了设备环境对象类----CDC类。

CDC与CGdiObject的关系

说到CDC类就不能不提一下GdiObject---图形对象类。 在Windows应用程序中,设备环境与图形对象共同工作,协同完成绘图显示工作。就像画家绘画一样,设备环境好比是画家的画布,图形对象好比是画家的画笔。用画笔在画布上绘画,不同的画笔将画出不同的画来。选择合适的图形对象和绘图对象,才能按照要求完成绘图任务。

有关CDC类的继承

父类:从 CObject 直接继承而来。继承了CObject类的各种特性,如动态创建等等。

子类:CClientDC-------代表操作窗口的DC ,是比较常用的一个子类

CMetaFileDC ------响应Meta File的DC ,Meta File是一些GDI消息。

CPaintDC-------响应WM_PAINT消息的DC。

CWindowDC ------代表整个屏幕的DC

CDC类的数据成员

数据成员只有两个:

HDC m_hDC : CDC对象使用的输出设备上下文

HDC m_hAttribDC : CDC对象使用的属性设备上下文

二者在CDC对象创建时指向相同的设备上下文。

猜你喜欢

转载自blog.csdn.net/hanxiaoyong_/article/details/81152535