VS2010_MFC编程入门之五十一(图形图像:GDI对象之画刷CBrush)-软件开发-鸡啄米
- 格式:pdf
- 大小:640.62 KB
- 文档页数:4
CBrush是封装了Windows图形设备接口(GDI)中画刷的MFC类,用于构造CBrush对象,然后传给需要画刷的CDC成员函数。
具体画刷可以由实线、阴影线或指定模式的位图线构成。
可参阅CBitmap, CDC相关说明请看下面的代码:CDC *pDc=new CClientDC(this);CBrush brush;brush.CreateSolidBrush(RGB(0,255,0));CBrush *pOldBrush = pDc->SelectObject(&brush);pDc->Rectangle(50,50,200,200);pDc->SelectObject(pOldBrush);deletepDc;比较困惑的是pDc->SelectObject(&brush);将刷子选入dc中,返回了一个CBrush类型的指针pOldBrush,为什么在画完矩形之后,还要有pDc->SelectObject(pOldBrush);这么一条语句呢?怎么还要把pOldBrush指针也选入dc中呢?书上解释说是恢复原来的画刷,晕~我这画刷也没改变啊,恢复个什么呢?.................CBrush *pOldBrush = pDc->SelectObject(&brush);将brush自己定义的brush画刷选入dc中,此时dc就可以使用我们自己定义的brush画刷进行作业。
同时pDc->SelectObject(&brush)方法返回一个指针,该指针实际上是未引入brush之前dc中的缺省指针,这里我们将这个缺省指针返回了,并将之赋值为CBrush类型的,也就是pOldBrush指针就是这个缺省指针。
在我们作业完成后,不能将dc中的brush消除掉,如果我们使用delete方法直接删除掉brush 对象的话,也就是说brush对象没有了但dc中仍保留了原先brush对象的句柄,这是不正确的,也是容易出问题的,因此我们要将dc中的brush的句柄给消除掉,怎么消除掉呢?我们知道句柄实际上应该是个指针,我们只需要将dc中原先的brush指针替换掉就好了,就好比,只有一个位置,我要进来,你必须离开。
1.创建画笔当用户创建一个用于绘图的设备环境对象时,系统自动将一个像素单位宽度的实黑线的画笔作为默认画笔。
如果用户欲使用其他性质的画笔,首先就要创建该画笔。
创建画笔可以采用两种方法。
一种方法是通过调用画笔Cpen类的一个带参构造函数来构造一个Cpen类画笔对象。
Cpen Pen(int nPenStyle,int nWidth,COLORREF rgbColor)其中第一个参数用于指定画笔样式;第二个参数用于指定画笔宽度;第三个参数用于指定画笔颜色。
画笔的样式说明参考表3.3;画笔的颜色可以通过Windows提供的GRB宏来设置,其使用格式为:RGB(nRed,nGreen,nBlue)参数nRed、nGreen、nBlue分别表示红、绿、蓝分量值,数值范围为0~255。
如RGB(0,0,0)表示黑色;RGB(255,0,0)表示红色。
表3.4列出了常用颜色的RGB值。
表3.3 画笔的样式说明表3.4常用颜色的RGB值下面的代码创建了一个蓝色实线画笔:CPen Pen(PS_SOLID,1,RGB(0,0,255));创建画笔的另一个方法是首先声明一个CPen对象,然后调用CPen类的成员函数CreatePen()创建特定的画笔。
CPen Pen;Pen.CretePen(int nPenStyle,int nWidth,COLORREF rgbColor);如下代码同样创建一个蓝色实线画笔:CPen PenNew;PenNew.CreatePen(PS_SOLID,1,RGB(0,0,255));当需要多次改变画笔的属性时,多采用这种方法。
●2.选择创建的画笔到设备环境中创建画笔后,必须调用成员函数CDC::SelectObject()将创建的画笔选入设备环境对象中。
如果选择成功,函数SelectObject()将返回原来画笔对象的指针。
一般情况下,在选择新的画笔时应该保存原来的画笔对象,以备恢复。
C#.net地图控件开发(五)GDI+图形图像编程基础3.画刷和画刷类型Brush类型是一个抽象类,所以它不能被实例化,也就是不能直接应用,但是我们可以利用它的派生类,如:HatchBrush、SolidBrush、T extureBrush、LinearGradientBrush和PathGradientBrush等。
画刷类型一般在System.Drawing命名空间中,如果应用HatchBrush和GradientBrush画刷,需要在程序中引入System.Drawing.Drawing2D命名空间。
1. SolidBrush(单色画刷)它是一种一般的画刷,通常只用一种颜色去填充GDI+图形,例如:protected override void OnPaint(PaintEventArgs e){Graphics g = e.Graphics;SolidBrush sdBrush1 = new SolidBrush(Color.Red);SolidBrush sdBrush2 = new SolidBrush(Color.Green);SolidBrush sdBrush3 = new SolidBrush(Color.Blue);g.FillEllipse(sdBrush2, 20, 40, 60, 70);Rectangle rect = new Rectangle(0, 0, 200, 100);g.FillPie(sdBrush3, 0, 0, 200, 40, 0.0f, 30.0f );PointF point1 = new PointF(50.0f, 250.0f);PointF point2 = new PointF(100.0f, 25.0f);PointF point3 = new PointF(150.0f, 40.0f);PointF point4 = new PointF(250.0f, 50.0f);PointF point5 = new PointF(300.0f, 100.0f);PointF[] curvePoints = {point1, point2, point3, point4,point5 };g.FillPolygon(sdBrush1, curvePoints);}2. HatchBrush(阴影画刷)HatchBrush类位于System.Drawing.Drawing2D命名空间中。
MFC画图程序步骤MFC(Microsoft Foundation Class)是一种用于开辟Windows应用程序的C++类库。
在MFC中,我们可以使用GDI(Graphics Device Interface)来创建和操作图形。
下面是使用MFC创建一个简单的画图程序的步骤。
步骤1:创建一个新的MFC项目首先,打开Visual Studio并选择创建一个新的项目。
在项目类型中,选择Visual C++ -> MFC,然后选择MFC应用程序类型。
输入项目名称并选择保存的位置。
在应用程序类型中,选择“单文档”或者“多文档”视图,具体根据你的需求而定。
点击“确定”按钮创建项目。
步骤2:设计用户界面在MFC应用程序中,用户界面是通过对话框资源来设计的。
在资源视图中,双击IDD_DIALOG(或者其他对话框资源)以打开对话框编辑器。
在对话框编辑器中,你可以添加按钮、文本框、菜单等控件来设计你的用户界面。
在画图程序中,你可以添加一个画布控件来显示绘制的图形。
步骤3:添加绘图功能在MFC中,你可以使用GDI来进行绘图操作。
打开你的对话框类的头文件(例如,CMyDialog.h),添加以下头文件引用:#include <afxwin.h>#include <afxext.h>#include <afxdisp.h>在对话框类的源文件(例如,CMyDialog.cpp)中,添加以下代码来处理绘图操作:```void CMyDialog::OnPaint(){CPaintDC dc(this); // 用于绘制的设备上下文// 在这里进行绘图操作dc.Rectangle(100, 100, 200, 200); // 绘制一个矩形dc.Ellipse(300, 100, 400, 200); // 绘制一个椭圆}```步骤4:处理绘图事件在对话框类的消息映射中添加对绘图事件的处理。
利用 MFC 的 Picture 控件显示和处理图像在《OpenCV 教程-基础篇》的 2.8 节中,所创建的 MFC 图像显示是直接放在对话框面板的左上 角的,感觉不大美观;《MFC 中快速应用 OpenCV》 则是介绍用 SDI(单文档界面)来显示图 像,《A step-by-step guide to the use of Microsoft Visual C++ and the Intel OpenCV library》 使用 VS2005 来进行图像和视频的读取和处理,但是其图像和视频的显示界面不是在对话框里面 的,而是新建一个窗口来做。
所以下面我们就来看看怎么在对话框里使用 Picture 控件来显示和 处理图像。
[编辑]创建 MFC首先创建一个 MFC 对话框应用程序(Dialog-based Application)如下:在 VS2005 和 2008 里,我们可以用一个 Solution 来组合几个 Project (每个 Project 基本上 只包含一个 Program),当我们要构建一个多 Program 的应用时(例如一个客户端程序加一个 服务器应用程序),利用 Solution 可以将这些 Projects 组合起来、并且共享文件和函数库。
通常需要为 Solution 创建一个主路径,其中包含了所有 Projects 的路径。
不过在这篇文章里, 我们只构建一个简单的 Project,所以在创建 MFC 的 New Project 对话框里,不用勾选“Create directory for solution”这个选项。
点击 OK -- Next 进入下一步,在这里我们创建一个 Dialog-based Application,大部分选项按默 认设置就行,不过最下面的“Use Unicode libraries”最好去掉。
如果勾选了这个选项,程序代码 就会使用 16bit 的 Unicode 字符集来编码,但是很多函数虽然使用 char* (ASCII stings) 类型字 符,而将字符串从 Unicode 转换到 ASCII 是非常麻烦的。
C++ GDI+ 画刷、矩阵、基本绘图函数、文字、图像主要画刷单色画刷SolidBrushSolidBrush(const Color& color );网格画刷HatchBrushHatchBrush( HatchStyle hatchStyle, const Color& foreColor, const Color& backColor);foreColor和backColor用来指定阴影线颜色和填充的背景颜色,背景色可以不指定。
hatchStyle用来指定阴影线的样式。
预定义样式:HatchStyleHorizontal (水平线)HatchStyleVertical(垂直线)HatchStyleForwardDiagonal(上斜线)HatchStyleBackwardDiagonal(下斜线)HatchStyleCross(十字线)HatchStyleDiagonalCross (交叉线)HatchStyle30Percent(30%填充)HatchStyleSolidDiamond (实心菱形)直线渐变LinearGradientBrushLinearGradientBrush( Point & point1, Point & point2, Color & color1, Color & color2);LinearGradientBrush( Rect & rect, Color & color1, Color & color2, REAL angle, BOOL isAngleScalable ); LinearGradientBrush( Rect & rect, Color & color1, Color & color2, LinearGradientMode mode);point1和point2分别用来指定矩形区域的左上角和右下角点坐标。
GDI编程GDI编程一、GDI相关概念1、 GDI(Graphics Device Interface):图形设备接口,是一个应用程序与输出设备之间的中介。
它提供了一套函数库,这些函数在不同的输出设备上输出图形和文字。
一方面,GDI向应用程序提供一个与设备无关的编程环境,另一方面,它又以设备相关的格式和具体的设备打交道。
2、DC (Device Context):设备描述表(设备上下文),是一种Windows数据结构,包括了如线的宽度和颜色、刷子的样式和颜色、字体、剪裁区域等信息。
用于表达显示器、打印机等设备。
DC的主要作用是进行绘图和输出文字,如绘制线条、形状和文本等,具体如dc.MoveTo(),dc.LineTo(),dc.Ellipse(),dc.FillRect(),dc.FillSolidRect(),dc.TextOut()等。
Win32下与HDC相关的函数有:GetDC(), BeginPaint()/EndPaint(),GetWindowDC()等对应的MFC版本的类有:CDC, CPaintDC, CClientDC, CWindowDC等3、GDI对象:DC定义了一组GDI对象,包括画笔,画刷,字体,位图,调色板,剪裁区域,路径层(Path)。
他们有Win32和MFC两套实现版本,其对应关系如下:4、DC与GDI对象之间的关系:GDI对象是通过DC发生作用的,要使用这些GDI对象,可以使用Win32函数SelectObject来将其选入DC中,如::SelectObject(hdc, hPen);5、利用DC和GDI对象绘图的完整步骤为:(1). 获取或者创建一个DC(2). 获取或者创建一个GDI对象(Pen, Brush等)(3). 使用dc.SelectObject函数把GDI对象选入DC(4). 使用DC进行绘图或文字输出(5). 恢复DC原来的GDI对象并删除刚新创建的GDI对象,如pen.DeleteObject()(6). 释放或删除设备描述表DC其中,(1)和(6),(2)和(5)是成对出现的。