MFC绘图,基于mfc的绘图程序
出发地:http://blog..net/leolee82/article/details/6992590
下面我们来了解一下MFC中与绘图相关的一些结构和类。
第一步要点
(1)点结构点数据结构点用于表示一个点的x和y坐标:
typedef结构标记点{
长x;
长y;
}点;
(2)点类CPoint
point类CPINT是一个没有基类的独立类,封装了POINT结构,有成员变量X和y。
有五种构造函数:
c point();
CPoint( int initX,int initY);
c POINT(POINT initPt);
c point(SIZE initSize);
c point(LPARAM dw point);//低位字设置为X,高位字设置为y。
CPoint类还定义了四个翻译和设置函数:
void Offset(int xOffset,int yOffset);
空偏移(点点);
空隙偏移(尺寸大小);
void设定点(int X,int Y);
CPoint类也重载,-,=,-=,==,=和其他运算符来支持CPoint对象与CPoint、Point和SIZE对象之间的运算。
2.大小
(1)尺寸结构尺寸
尺寸结构尺寸用来表示一个矩形的宽度cx和高度cy:
typedef结构标记大小{
长CX;
长cy;
}大小
(2)尺寸等级CSize
Size类CSize也是一个没有基类的独立类,封装了SIZE结构,有成员变量cx和cy。
还有五个构造函数:
CSize();
CSize( int initCX,int initCY);
CSize(SIZE initSize);
CSize(POINT initPt);
CSize(DWORD dwSize);//低位字设置为cx,高位字设置为cy
CSizet类也重载,-,=,-=,==,=和其他运算符来支持CSize对象和CSize、POINT、Size、RECT对象之间的运算。
3.矩形
(1)长方形结构的RECT
RECTangle rect结构定义了矩形左上角和右下角的坐标:
typedef struct tagRECT {
长左;
长款上衣;
长右;
长底;
} RECT;
(2)矩形裂缝
矩形CRect类也是一个没有基类的独立类,封装了Rect结构,有成员变量left,top,right,bottom。
有六种构造函数:
CRect();
CRect( int l,int t,int r,int b);
Rect建筑公司;
CRect(LPC rect lpSrcRect);
CRect(点点,大小尺寸);
CRect(点左上方,点右下方);
CRect类重载了=,-,=,-=,==,=、、=、=等运算符支持CRECT对象与CRECT、POINT、SIZE、Rect对象之间的运算。
转换器lprect和lprect也被定义为自动将CRect对象转换为矩形结构和类指针LPRECT和LPRECT。
判断一个点是否在矩形内有时需要判断一个点(比如鼠标位置)是否在矩形区域内,可以通过调用CRect类的PtInRect函数来完成:
布尔函数(点-点)常数;
当点位于矩形区域内时,此函数返回true。请注意,这个矩形区域不包括矩形的右边界和底边。
然后是关于设备描述表的获取和发布,上一篇文章已经提到了,这里就不提了。
只说一个关于“安全DC句柄”概念的特殊点
你也可以使用CDC类的成员函数:
HDC GetSafeHdc();
以获得对应于CD的窗口(例如客户区)的安全DC句柄,该句柄在窗口持续时间内有效。
比如可以先定义类变量HDC m _ hDC,然后在适当的地方给它赋值m _ hDC=GetDC()-GetSafeHdc();然后就可以放心使用了。
因为这个指针不能简单的保存在类的数据成员中,所以要借助GetSafeHdc成员函数将其转换成windows句柄(唯一可以持久化的GDI标记)。
比如可以使用CDC类的成员函数。
BOOL Attach(HDC HDC);//成功返回非0
用DC句柄连接CDC对象。
4.设置绘图颜色
(1)颜色
Windows中的颜色一般用4个字节,一个名为colorref: (windef)的变量类型来表示。h)在Win32 API中被定义来表示颜色索引值。
typedef DWORD COLORREF//0x00bbggrr
还有一个微距RGB: (wingdi。h)由红、绿、蓝三原色组成。
#定义RGB(r,g,b)((COLORREF)(((BYTE)(r)((WORD)((BYTE)(g))8))(((DWORD)(BYTE)(b))16))
其中R、G、B为字节变量,取值范围为0-255。功能描述是:
COLORREF RGB(
字节繁殖,//红色成分
BYTE bGreen,//绿色分量
字节bBlue //蓝色分量
);
例如:
COLORREF红色、灰色;
红色=RGB(255,0,0);
灰色=RGB(128,128,128);
在API中,一个宏Get?被定义为通过COLORREF变量获得每个颜色分量。值:(wingdi.h)
#定义GetRValue(rgb) (LOBYTE(rgb))
# define GetGValue(RGB)(LOBYTE((WORD)(RGB))8))
# define getb value(RGB)(LOBYTE((RGB)16))
(2)点颜色(像素)
在Windows中,像素的颜色由SetPixel直接设置,set pixel是设备上下文类CDC的成员函数。
这个函数的原型是:
COLORREF SetPixel( int x,int y,COLORREF Cr color);
COLORREF SetPixel( POINT point,COLORREF Cr color);
x和y是像素的横坐标和纵坐标,crColor是像素的颜色值。
例如:
pDC- SetPixel(10,10,RGB(0,255,0));
此外,还可以使用CDC的会员功能。
COLORREF GetPixel( int x,int y)const;
COLORREF get pixel(POINT POINT)const;
获取指定点(x,y)或点的颜色。
例如:
COLORREF列;
col=pDC- GetPixel(10,10);
(3)线条颜色(钢笔)
在Windows中,线形图必须用钢笔绘制,所以线条的颜色由钢笔颜色决定。
在MFC中,笔的属性和功能由CPen类提供(CPen是CGDIObject的派生类)。
创建和使用钢笔的步骤如下:
#1创建一个笔对象:
创建pen CPen对象有两种方法:
CPen( int nPenStyle,int nWidth,COLORREF Cr color);
其中包括:
Nstyle是钢笔的样式,其值为PS _ solid、PS _ dash、PS _ dot、PS _ dash dot、PSdash dot。
注意:1号~ 4号钢笔样式仅在钢笔宽度=0或1时有效,钢笔宽度=1时始终为实心。
BOOL CreatePen( int nPenStyle,int nWidth,COLORREF Cr color);
#2选择笔对象进入设备上下文:
为了使用我们创建的pen对象,我们必须首先将其选择到设备上下文中,这可以通过调用设备上下文类CDC的成员函数SelectObject来完成:
CPen * select object(CPen * pPen);返回值是一个指向原始pen对象的指针(通常它会被保存以备下次重新加载)。
例如pold pen=pDC-select object(pen);
另外,在Windows中有一些预定义的笔对象,可以通过CDC的另一个成员函数SelectStockObject选择到DC中。
函数原型为:虚拟cgdiobject * selectstockobject(intnindex);
预定义的钢笔对象有BLACK_PEN(黑色钢笔)、WHITE_PEN(白色钢笔)和NULL_PEN(空白钢笔/无色钢笔)。
例如PDC-SelectStockObject(black _ pen);
#3使用设备上下文绘制线图:
线条绘制和表面绘制的线条使用当前设备上下文中的pen对象。
有直线、折线、矩形、(椭圆)圆(弧)等。在线性图形中,请参见。
#4从设备上下文中释放笔对象:
为了删除一个用过的笔对象,必须在删除它之前将其从设备上下文中释放。
释放的方法是加载其他pen对象(通常是重新加载原来的pen对象)。例如
pDC-select object(pold pen);
#5删除笔对象:
为了删除笔对象,必须将其从设备上下文中释放。有几种方法可以删除:
调用Pen CDC的成员函数DeleteObject删除当前的pen内容(但是pen对象并没有被删除,以后可以使用成员函数CreatePen继续在pen对象中创建新的pen内容)。
诸如
钢笔。delete object();
使用删除操作符delete来完全删除pen对象,如删除pen;
自动删除:如果pen对象是一个局部变量,当它离开自己的作用域时,会被系统自动删除。
(4)面色(刷牙)
在Windows中,人脸贴图必须用画笔填充,所以肤色是由画笔的颜色决定的。
MFC中的brush类是CBrush(也是CGDIObject的派生类),创建和使用画笔的步骤与钢笔类似。
有四个构造函数:
CB rush();//创建brush的空对象
CB rush(COLORREF Cr color);//创建颜色为crColor的实心画笔
CBrush( int nIndex,COLORREF Cr color);//创建一个条纹(阴影)画笔,其样式由nIndex指定,颜色为crColor,其中nIndex可以采用阴影样式的值:
符号数常量样式
HS _水平0水平线
HS _垂直1垂直线
HS _对角线2正斜杠
HS _对角3反斜杠
HS_CROSS 4十字准线(正网格)
HS_DIAGCROSS 5斜十字准线(斜网格)
CB rush(cbit map * pbit map);//创建位图为pBitmap的图案画笔。
例如PDC-fillrect (rect,new brush (RGB (r,g,b)));
与构造函数相对应,有几个成员函数可以创建不同类型的画笔:
BOOL create solid brush(COLORREF Cr color);
BOOL CreateHatchBrush( int nIndex,COLORREF Cr color);
BOOL CreatePatternBrush(cbit map * pbit map);
BOOL CreateDIBPatternBrush(hglobalhpackeddib,UINT nu sage);
BOOL CreateDIBPatternBrush(const void * lpPackedDIB,UINT nu sage);
BOOL CreateBrushIndirect(const log brush * lpLogBrush);
BOOL CreateSysColorBrush(int nIndex);
预定义的笔刷对象有BLACK_BRUSH、DKGRAY_BRUSH、GRAY_BRUSH、HOLLOW_BRUSH、LTGRAY_BRUSH、NULL_BRUSH和WHITE_BRUSH。
默认画笔是空画笔。
就像钢笔一样,您可以使用函数SelectObject或SelectStockObject选择一个自定义画笔或预定义的画笔到DC,这可以在绘制表面地图时使用。
(5)文本颜色
可以使用CDC类的成员函数SetTextColor和SetBkColor分别设置输出文本的前景色和背景色:
(默认前景色为黑色,背景色为空白)
COLORREF GetTextColor()const;
虚拟COLORREF SetTextColor(COLORREF Cr color);
COLORREF GetBkColor()const;
虚拟COLORREF SetBkColor(COLORREF Cr color);
例如:
pDC- TextOut(10,10,测试文本);
pDC- SetTextColor(RGB(0,128,0));
pDC- TextOut(10,30,测试文本);
pDC- SetBkColor(RGB(0,0,128));
pDC- TextOut(10,50,测试文本);
清理屏幕
Windows不提供特殊的屏幕清洗功能。可以调用CWnd的以下两个函数调用来完成这个函数:
void Invalidate(BOOL bErase=TRUE);void update window();
或者调用CWnd的函数BOOL RedrawWindow(
LPCRECT lpRectUpdate=NULL,
CRgn* prgnUpdate=NULL,
UINT flags=RDW _无效 RDW _立即更新 RDW _擦除
);完成。
5设置绘图属性除了映射模式,还有很多绘图属性可以设置。
如背景、绘制方法、多边形填充方法、圆弧绘制方向、画笔原点等。
# 1.背景
1)背景颜色当背景模式为不透明时,背景颜色决定了线形图的间隙颜色(如虚线的间隙、条纹画笔的间隙、文字的间隙)。
可以使用CDC类的成员函数GetBkColor和SetBkColor来获取和设置当前背景色:
COLORREF GetBkColor()const;//返回当前背景色
虚拟COLORREF SetBkColor(COLORREF Cr color);//返回上一个背景色
//如果有错误,返回0x800000002)
背景图案背景图案影响如何用间隙填充线形图的间隙(如虚线的间隙、条纹画笔的间隙和文字的间隙)。
可以使用CDC类的成员函数GetBkMode和SetBkMode来获取和设置当前的后台模式:
int GetBkMode()const;//返回当前背景模式
int SetBkMode(int nbk mode);//返回上一个背景模式的值背景模式nBkMode value name函数
不透明不透明(默认)间隙用背景色填充。
透明间隙保持原始背景图像不变。
2.绘制模式绘制模式是指前景色的混合模式。
它确定如何将新绘图的钢笔和画笔的颜色(pbCol)与原始绘图的颜色(scCol)相结合,以获得最终的像素颜色(pixel)。
1)设置绘制模式,可以使用CDC类的成员函数setrop 2(ROP=raster operation raster operation)来设置绘制模式:
int setrop 2(int nDrawMode);
nDrawMode的值:绘图模式下nDrawMode的值。
符号常数运算结果
R2 _黑色黑色像素=黑色
R2 _白色白色像素=白色
R2_NOP常量像素=scCol
R2 _非逆像素=~scCol
R2 _文具盒封面像素=pbCol
R2_NOTCOPYPEN反转覆盖像素=~pbCol
R2_MERGEPENNOT颜色反转或pixel=~scCol pbCol
R2_MERGENOTPEN或反转像素=scCol ~pbCol
R2_MASKNOTPEN和反色pixel=scCol ~pbCol
R2_MERGEPEN或pixel=scCol pbCol
R2_NOTMERGEPEN或non-pixel=~(scCol pbCol)
R2 _掩码和像素=scCol pbCol
R2_NOTMASKPEN和非像素=~(scCol pbCol)
R2_XORPEN异或像素=SC列Pb列
R2_NOTXORPEN异或非像素=~ (sc col pbcol)
R2_COPYPEN(覆盖)是默认的绘图模式,R2_XORPEN(异或)是常用的。