资源描述
映射模式
含义
MM_TEXT
每个逻辑单位等于一个设备像素,x向右为正,y向下为正
MM_HIENGLISH
每个逻辑单位为0.001英寸,x向右为正,y向上为正
MM_LOENGLISH
每个逻辑单位为0.01英寸,x向右为正,y向上为正
MM_HIMETRIC
每个逻辑单位为0.01毫米,x向右为正,y向上为正
MM_LOMETRIC
每个逻辑单位为0.1毫米,x向右为正,y向上为正
MM_TWIPS
每个逻辑单位为一个点1/20(一个点是1/72英寸),x向右为正,y向上为正
MM_ANISOTROPIC
x和y可变比例
MM_ISOTROPIC
x和y等比例
CDC::SetMapMode(int nMapMode)来设置相应的映射模式。
例如,若将映射模式设置为MM_LOMETRIC,那么不管在什么设备中调用上述语句,都将显示出20毫米×20毫米的方块。
需要说明的是,在MM_ISOTROPIC模式下,纵横比总是1:1,换句话说,无论比例因子如何变化,圆是圆的;但在MM_ANISOTROPIC映射模式下,x和y的比例因子可以独立地变化,即圆可以被拉扁成椭圆形状。
PDC->Rectangle(CRect(0,0,200,200)); 在某设备环境中绘制出一个高为200个像素,宽为200个像素的方块。
在映射模式MM_ANISOTROPIC和MM_ISOTROPIC中,常常可以调用CDC::SetWindowExt(设置窗口大小)和CDE::SetViewportExt(设置视口大小)函数来设置所需要的比例因子。
x比例因子=视口x大小/窗口x的大小
y比例因子=视口y大小/窗口y的大小
CPoint(点)、CSize(大小)和CRect(矩形)是对Windows的POINT、SIZE和RECT结构的封装,因此它们可以直接使用各自结构的数据成员,如下所示:
typedef struct tagPOINT{
LONG x;
//点的x坐标
LONG y;
//点的y坐标
}
POINT;
typedef struct tagSIZE {
int cx;;
//水平大小
int cy;
//垂直大小
}
SIZE;
typedef struct tagRECT{
LONG left;
//矩形左上角点的x坐标
LONG top;
//矩形左上角点的y坐标
LONG right;
//矩形右下角点的x坐标
LONG bottom;
//矩形右下角点的y坐标
}
RECT;
1. CPoint、CSize和CRect的构造函数
CPoint类带参数的常用构造函数原型如下:
CPoint(int initX,int initY);
CPoint(POINT initSize);
其中,initX和initY分别用来指定CPoint的成员的x和y的值。initSize用来指定一个POINT结构或CPoint对象来初始化CPoint的成员。
CSize类带参数的常用构造函数原型如下:
CSize(int initCX,int initCY);
CSize(SIZE initSize);
其中,initCX和initCY用来分别设置CSize的cx和cy成员。initSize用来指定一个SIZE结构或CSize对象来初始化CSize的成员。
CRect类带参数的常用构造函数原型如下:
CRect(int l,int t,int r,int b);
CRect(LPCRECT lpSrcRect);
CRect(POINT point,SIZE size);
CRect(POINT topleft,POINT bottomRight);
其中,l、t、r和b分别用来指定CRect的left、top、right和bottom成员的值。srcRect和lpSrcRect分别用一个RECT结构或指针来初始化CRect的成员。point用来指定矩形的左上角位置。size用来指定矩形的长度和宽度。topLeft和bottomRight分别用来指定左上角和右下角的位置。
2. CRect类的常用操作
一个CRect类对象包含用于定义矩形的左上角和右下角点的成员变量,因此,在传递LPRECT、LPCRECT或RECT结构作为参数的任何地点,都可以使用CRect对象来代替。
需要说明的是,当构造一个CRect时,要使它符合规范。也就是说,使其left小于right,top小于bottom。例如,若左上角为(20,20),而右下角为(10,10),那么定义的这个矩形就不符合规范。对于一个不符合规范的矩形,CRect的许多成员函数都不会有正确的结果。基于此种原因,常使用CRect::NormalizeRect函数使一个不符合规范的矩形合乎规范。
CRect类的操作函数有很多,这里只介绍矩形的扩大、缩小以及两个矩形的“并”和“交”操作,更多的常用操作如表6.3所示。
表6.3 CRect类常用的成员函数
成员函数
功能说明
int Width() const;
返回矩形的宽度
int Height() const;
返回矩形的高度
CSize Size() const;
返回矩形的大小,CSize中的cx和cy成员分别表示矩形的宽度和高度
CPoint & TopLeft();
返回矩形左下角的点坐标
CPoint & BottomRight();
返回矩形右下角的点坐标
CPoint CenterPoint() const;
返回CRect的中点坐标
BOOL IsRectEmpty() const;
如果矩形的宽度或高度是0或负值,则返回TRUE
BOOL IsRectNull() const;
如果矩形的上、左、下和右边的值都等于0,则返回TRUE
BOOL PtInRect(POINT point) const;
如果点point位于矩形中(包括点在矩形的边上),则返回TRUE
void SetRect(int x1,int y1,int x2,int y2);
将矩形的各边设为指定的值,左上角点为(x1,y1),右下角点为(x2,y2)
void SetRectEmpty();
将矩形的所有坐标设置为零
void NormalizeRect();
使矩形合乎规范
void OffsetRect(int x,int y);
移动矩形,水平和垂直移动量分别由x,y或point,size的两个成员来指定
void OffsetRect(POINT point);
void OffsetRect(SIZE size);
成员函数InflateRect和DeflateRect用来扩大和缩小一个矩形。由于它们的操作是相互的,也就是说,若指定InflateRect函数的参数为负值,那么操作的结果是缩小矩形,因此,下面只给出InflateRect的原型:
void InflateRect(int x,int y);
void InflateRect(SIZE size);
void InflateRect(LPCRECT lpRect);
void InflateRect(int l,int t,int r,int b);
其中,x指定扩大CRect左、右边的数值,y指定扩大CRect上、下的数值。size中的cx成员指定扩大左、右边的数值,cy成员指定扩大上、下的数值。lpRect的各个成员用来指定扩大每一边的数值。l、t、r和b分别用来指定扩大CRect左、上、右和下边的数值。
GetRValue
//获得32位RGB颜色值中的红色分量
GetGValue
//获得32位RGB颜色值中的绿色分量
GetBValue
//获得32位RGB颜色值中的蓝色分量
RGB
//将指定的R、G、B分量值转换成一个32位的RGB颜色值
例子:
1 用MFC AppWizard(exe)创建一个基于对话框应用程序Ex_DlgDraw。
2 将对话框标题设为“在对话框及控件中绘图”,删除“取消”按纽和“TODO:…”静态文本控件,将“确定”按纽示题改为“退出”。
3 在对话框右侧靠上部位添加一个静态文本控件IDC_DRAW,在其“样式”属性中,选中“凹陷”选项。
4 为CEx_DlgDrawDlg类手动添加下列成员函数DoDrawCtrl。
void DoDrawCtrl()
{
CWnd *pWnd=GetDlgItem(IDC_DRAW);
CDC* pDC=pWnd->GetDC();
CRect rcClient;
pWnd->GetClientRect(rcClient);//获取控件客户区大小
UpdateWindow();//告诉对话框,控件已更新过
CBrush brush(HS_CROSS,RGB(0,0,255));
CBrush *oldBrush=pDC->SelectObject(&brush);
pDC->Rectangle(rcClient);
pDC->SelectObject(oldBrush);
}
5 在CEx_DlgDrawDlg::OnPaint函数中添加下列代码。
void CEx_DlgDrawDlg::OnPaint()
{
if (IsIconic())
{…}
else
{
CDialog::OnPaint();
UpdateWindow();//告诉系统对话框已更新过
CDC* pDC=GetDC();
CRect rcClient;
GetClientRect(rcClient); //获取对话框客户区大小
CRect rcDraw;
rcDraw.SetRect(10,10,rcClient.right-120,rcClient.bottom-10);
CBrush brush(HS_FDIAGONAL,RGB(0,255,0));
CBrush *oldBrush=pDC->SelectObject(&brush);
pDC->Rectangle(rcDraw);
pDC->SelectObject(oldBrush);
DoDrawCtrl();//调用在控件中绘图的自定义函数
}
}
6 编译并运行。
展开阅读全文