CPaintDC 针对OnPaint()函数进行, OnPaint()首先构造一个CPaintDC()对象,再调用OnPreoareDC(),再来调用OnDraw()进行绘图。 void CMyView::OnPaint() {
CPaintDC dc(this); OnPrepareDC(&dc); dc.TextOut(0,0,"Hi!"); OnDraw(&dc); } CPaintDC类自动调用BeginPaint(),析构自动调用EndPaint(). 2.CClientDC CClientDC()只能在窗口的客户区(不包括边框、标题栏、菜单栏、状态栏)中进行绘图。 (0,0)通常指的是客户区的左上角。 为了便于绘图,往往先调用CWnd::GetClientRect()来获取窗口客户区大小。 CClientDC()构造函数调用GetDC(),析构函数调用ReleaseDC(). 3.CWindowDC CWindowDC()允许在屏幕的任意位置进行绘图,点(0,0)指整个屏幕的左上角。 在使用CWindowDC绘图时,通常先调用CWnd::GetWindowRect()来获取窗口在屏幕坐标系的 外框坐标,然后再调用CWnd::ScreenToClient()进行坐标转换。 CWindowDC dc(this); CRect rectWindow; GetWindowRect(rectWindow); ScreenToClient(rectWindow); 4.CMetaFileDC CMetaFileDC封装了在一个Windows图元文件中绘图的方法。使用步骤如下: 1)构造一个CMetaFileDC()对象,并调用Create()函数; 2)向此对象发送所需要的CDC绘图命令,如:MoveTo()、LineTo() 3)调用成员函数Close()关闭设备环境,并返回HMETAFILE句柄。 4)使用CDC::PlayEnhMetaFile()来播放图元文件或者调用CopyMetaFile等函数对图元文件 进行其他处理。 构造CDC对象,以为Window限制了环境设备的数目,最好是在堆栈中构造对象: void CMyView::MyFunction() {
... CRect rect; CClientDC dc(this); dc.GetClipBox(rect); ... } GetDeviceCaps():获取显示参数,物理宽高(毫米)、逻辑宽高(像素)、分辨率等。 设备坐标:指显示设备或者打印设备坐标系下的坐标,单位像素。对于窗口视图而言,设备坐标的原点在客户区的左上角。 逻辑坐标:在各种映射模式下的坐标。缺省时,逻辑坐标和设备坐标是一致的。 物理坐标:由程序员自己定义的坐标。精度更准确。 MM_TEXT映射模式:X向右递增,Y向下递增;调用CDC的SetViewportOrg()和SetWindowOrg()函数来改变该模式下的坐标原点位置。 void CMyView::OnDraw(CDC* pDC) {
pDC->SetMapMode(MM_TEXT); pDC->SetWindowOrg(CPoint(100, 100)); pDC->Rectangle(CRect(100, 100, 300, 300)); } "固定比例"映射模式:X向右递增,Y向下递减;实际的比例因子不同。 "可变比例"映射模式:MM_ISOTROPIC和MM_ANISOTROPIC,允许改变比例因子和坐标原点。当用户改变了窗口尺寸时,绘制的图形大小也会发生相应的变化。 在MM_ISOTROPIC映射模式下,纵横比总是1:1,无论比例因子如何变化圆总是圆 |