MFC:绘图基础

2.1 Windows GDI

用设备描述表(DC)来绘制图形,不同的绘画程序拥有不同的设备描述表(DC)

//获取设备信息,屏幕的宽和高
CClientDC dc(this);
int cx=dc.GetDeviceCaps(HORZRES);
int cy=dc.GetDeviceCaps(VERTRES);
 
//获取设备信息,分辨率
CClientDC dc(this);
int nPlanes=dc.GetDeviceCaps(PLANES);
int nBPP=dc.GetDeviceCaps(BITSPIXEL);
int nColors=1<<(nPlanes*nBPP);
 
 
//GetDeviceCaps参数
HORZRES    以像素点数目表示的显示平面宽度
VERTRES    以像素点数目表示的显示平面高度
HORZSIZE    以毫米表示的显示平面宽度
VERTSIZE    以毫米表示的显示平面高度
LOGPIXELSX    水平方向上每逻辑英寸内像素点的数目
LOGPIXELSY    竖直方向上每逻辑英寸内像素点的数目
NUMCOLORS    返回静态颜色数目
BITSPIXEL    每个像素点的位的数目
PLANES    位平面的数目
RASTERCAPS    设备特性标志位
TECHNOLOGY    设备类型标志位

2.2 MFC设备描述表类

MFC绘图设备类有CDC基类,

                   派生出CPaintDC子类,用于在窗口客户区画图(仅限于OnPaint())

                              CWindowDC子类,用于在窗口客户区画图(除了OnPaint())

                              CClientDC子类

                              CMetaFileDC子类

 

2.2.1.CDC基类

//普通函数内
CDC* pDC=GetDC();  //CWnd::GetWindowDC
//Do Some drawing
ReleaseDC(pDC);
//OnPaint消息内
PAINTSTRUCT ps;
CDC* pDC=BeginPaint(&ps);
//Do Some Drawing
EndPaint(&ps);

2.2.2.CPaintDC子类

//在MFC的消息映射OnPaint()之中,一定要调用CPaintDC
//否则OnPaint消息会一直不断重复调用刷新,其中的原理在于MFC调用WinSDK之中隐藏掉了BeginPaint()和//EndPaint()两个函数
 
CPaintDC dc(this);
 
CPaintDC *pDC=new CPaintDC(this);
delete pDC;

2.2.3.CClientDC子类

void CMainWindow::OnLButtonDown(UINT nFlags,CPoint point){
    
    CRect rect;
    GetClientRect(&rect);
 
    CClientDC dc(this);
    dc.MoveTo(rect.left,rect.top);
    dc.LineTo(rect.right,rect.bottom);
    dc.MoveTo(rect.right,rect.top);
    dc.LineTo(rect.left,rect.bottom);
 
    dc.Ellipse(0,0,100,100);
 
}

2.2.4.CWindowDC子类

绘制非客户区使用,借助OnNcPaint捕获WM_NCPAINT消息(不需要调用BeginPaint和EndPaint)

2.2.5.CMetaFileDC子类

2.3 设备描述表属性

设备描述表(DC)拥有文本颜色 背景颜色 背景模式  映射模式 绘图模式 当前位置 当前画笔 当前笔刷 当前字体等多种属性

可以用SelectObject()将画笔(Pen) 画刷(Brush) 字体(Font) 位图(Bitmap) 调色板(Palette) 区域(Region)属性添加进设备描述表

2.4 绘图模式

GDI将像素点输出到逻辑显示平面上时,它不只是简单地将输出像素点颜色.相反它通过一系列布尔运算将输出像素点的颜色和输出目标位置上像素点的颜色合在一起.它所使用的逻辑关系由设备描述表当前的绘图模式确定

2.5 映射模式

2.5.1 可编程映射模式

MM_ISOTROPIC和MM_ANISOTROPIC映射模式与其他映射模式不同,即是用户决定从逻辑坐标值转换为设备坐标值的方式

2.5.2 坐标转换

调用CDC::LPtoDP()可将逻辑坐标值转换为设备坐标值

调用CDC::DPtoLP()可将设备坐标值转换为逻辑坐标值

2.5.3 移动原点

调用CDC::SetWindowOrg()移动窗口的原点

调用CDC::SetViewportOrg()移动视口的原点

原文地址:https://www.cnblogs.com/k5bg/p/11137906.html