MFC绘图,基于mfc的绘图程序

  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(异或)是常用的。

MFC绘图,基于mfc的绘图程序