绘图必看
1.全国大学1000多门20000多课时课程在线看 (必收藏)
http://www.365xueyuan.com/index-htm-m-bbs-cateid-73.html
2. 数十G的photoshop教程在线看或下载
http://www.365xueyuan.com/thread-htm-fid-87.html
3.数十G ,word,excel办公软件教程在线看或下载
http://www.365xueyuan.com/
第4讲 绘图
Windows是一个图形操作系统, Windows是一个图形操作系统,其所有的图形 是一个图形操作系统 可视效果都是通过绘制操作而完成的。 绘制操作而完成的 可视效果都是通过绘制操作而完成的。 图形显示的实质就是利用Windows提供的图形 图形显示的实质就是利用Windows提供的图形 Windows提供的 设备接口将图形绘制在显示器上 将图形绘制在显示器 设备接口将图形绘制在显示器上。大多数应用 程序都需要在客户区绘制一些图形, 程序都需要在客户区绘制一些图形,如绘制文 几何图形、位图和光标等。 本、几何图形、位图和光标等。
GDI简介 简介
Windows提供了一个抽象的图形界面接口, Windows提供了一个抽象的图形界面接口,称为 提供了一个抽象的图形界面接口 图形设备接口( 图形设备接口(Graphics Device Interface) , ) GDI。 或简称GDI 或简称GDI。 它负责管理用户绘图操作时功能的转换。用户 它负责管理用户绘图操作时功能的转换。 通过调用GDI函数与设备打交道,GDI通过不同 GDI函数与设备打交道 通过调用GDI函数与设备打交道,GDI通过不同 设备提供的驱动程序将绘图语句转换为对应的 绘图指令,避免了直接对硬件进行操作,从而 绘图指令,避免了直接对硬件进行操作, 实现设备无关性 设备无关性。 实现设备无关性。
Windows绘图过程和设备无关性的实现: 绘图过程和设备无关性的实现: 绘图过程和设备无关性的实现
应用程序首先向设备环境提出输出的请求, 应用程序首先向设备环境提出输出的请求 , 设 备环境接收绘图器请求(表现为GDI函数调用),并 函数调用) 备环境接收绘图器请求(表现为 函数调用 将它们传给相应的设备驱动程序, 将它们传给相应的设备驱动程序 , 完成特定硬件的 输出。 输出。
为了支持GDI绘图,MFC提供了两个类: 为了支持GDI绘图,MFC提供了两个类: GDI绘图 提供了两个类
设备环境类(上下文类) 设备环境类(上下文类):用于设置绘图属性和 绘制图形。 绘制图形。 绘图对象类:封装了各种GDI绘图对象,包括: GDI绘图对象 绘图对象类:封装了各种GDI绘图对象,包括: 画笔、刷子、字体、位图、调色板和区域。 画笔、刷子、字体、位图、调色板和区域。
设备环境
为了实现设备无关性, 为了实现设备无关性,应用程序的输出不直 接面向显示器等物理设备, 接面向显示器等物理设备,而是面向一个称 设备环境DC 之为设备环境DC(Device Context)的虚拟逻 之为设备环境DC(Device Context)的虚拟逻 辑设备。 辑设备。 设备环境也称设备描述表或设备上下文,它 设备环境也称设备描述表或设备上下文, 设备描述表 是由Windows管理的一个数据结构, Windows管理的一个数据结构 是由Windows管理的一个数据结构,它保存 了程序向设备输出时所需要的信息,应用程 了程序向设备输出时所需要的信息, 序利用它定义图形对象及其属性, 序利用它定义图形对象及其属性,并实现应 用程序、 用程序、设备驱动程序和输出设备之间绘图 命令的转换。 命令的转换。
设备环境
不同设备有不同的设备环境, Windows中 不同设备有不同的设备环境,在Windows中 不使用DC无法进行输出。在使用任何GDI DC无法进行输出 GDI绘 不使用DC无法进行输出。在使用任何GDI绘 图函数之前,必须建立一个设备环境。 图函数之前,必须建立一个设备环境。
MFC提供了不同类型的DC类 MFC提供了不同类型的DC类,每一个类的构造函数 提供了不同类型的DC 自动调用获取DC API函数 DC的 函数, 自动调用获取DC的API函数,析构函数自动调用释 放DC的API函数。因此,在程序中通过声明一个MFC DC的API函数。因此,在程序中通过声明一个MFC 函数 设备环境类的对象就自动获取了一个DC DC, 设备环境类的对象就自动获取了一个DC,而当该对 象被销毁时就自动释放了获取的DC DC。 象被销毁时就自动释放了获取的DC。MFC AppWizard应用程序向导创建的OnDraw()函数自动 应用程序向导创建的OnDraw() AppWizard应用程序向导创建的OnDraw()函数自动 支持所获取的DC DC。 支持所获取的DC。 MFC的DC类包括CDC、CPaintDC、CClientDC、 MFC的DC类包括CDC、CPaintDC、CClientDC、 类包括CDC CWindowDC和CMetaFileDC等 其中CDC类是MFC CDC类是MFC设备 CWindowDC和CMetaFileDC等,其中CDC类是MFC设备 环境类的基类,其它的MFC设备环境类都是CDC MFC设备环境类都是CDC的派 环境类的基类,其它的MFC设备环境类都是CDC的派 生类。 生类。
MFC设备环境类: MFC设备环境类: 设备环境类 CDC类既作为其它MFC设备环境类的基类 类既作为其它MFC设备环境类的基类, CDC类既作为其它MFC设备环境类的基类,又可以作为 一个一般的设备环境类使用。 一个一般的设备环境类使用。利用它可以访问设备属 性和设置绘图属性。CDC类对GDI的所有绘图函数进行 类对GDI 性和设置绘图属性。CDC类对GDI的所有绘图函数进行 了封装。 了封装。 CClientDC类代表了客户区设备环境 类代表了客户区 设备环境。 CClientDC 类代表了 客户区 设备环境 。 当在客户区实 时绘图时,需要利用CClientDC CClientDC类定义一个客户区设 时绘图时 , 需要利用 CClientDC 类定义一个客户区设 备环境。 备环境。 CPaintDC类用于响应WM_PAINT消息以支持重画 类用于响应WM_PAINT消息以支持重画。 CPaintDC类用于响应WM_PAINT消息以支持重画。客户 OnPaint()完成 区的重绘由函数OnPaint()完成。 区的重绘由函数 OnPaint() 完成 。 客户区重绘也可使 Invalidate()函数来完成 函数来完成。 用Invalidate()函数来完成。 bErase=TRUE TRUE) void Invalidate(BOOL bErase=TRUE) bErase为TURE,背景被擦除。 如果 bErase为TURE,背景被擦除。
绘图对象类
CGdiObject是绘图对象类的基类, CGdiObject是绘图对象类的基类,但该类不 是绘图对象类的基类 能为应用程序直接使用,要使用GDI对象, GDI对象 能为应用程序直接使用,要使用GDI对象,必 须使用它的派生类:画笔、画刷、字体、 须使用它的派生类:画笔、画刷、字体、位 图、调色板、区域等。( CPen、CBrush、 调色板、区域等。 CPen、CBrush、 CFont、CBitmap、CPalette和CRgn) CFont、CBitmap、CPalette和CRgn)
在默认状态下, 在默认状态下,当用户创建一个设备环境并在其 中绘图时,系统使用设备环境缺省 缺省的绘图工具及 中绘图时,系统使用设备环境缺省的绘图工具及 其属性。如果要使用不同风格和颜色的绘图工具 其属性。 进行绘图,用户必须重新为设备环境设置自定义 进行绘图,用户必须重新为设备环境设置自定义 画笔和画刷等绘图工具 等绘图工具。 的画笔和画刷等绘图工具。 画笔和画刷是Windows 中两种最重要的绘图工具 画笔和画刷是 Windows中两种最重要的绘图工具 , Windows 中两种最重要的绘图工具, 画笔用于绘制对象的边框以及直线和曲线,画刷 画笔用于绘制对象的边框以及直线和曲线, 用于绘制对象的边框以及直线和曲线 用指定的颜色和图案来填充绘图区域。 用指定的颜色和图案来填充绘图区域。
颜色的设置
Windows用COLORREF类型的数据存放颜色 类型的数据存放颜色, Windows用COLORREF类型的数据存放颜色,它是一 32位整数 任何一种颜色都是由红、 位整数。 个 32 位整数 。 任何一种颜色都是由红 、 绿 、 蓝三 种基本颜色组成,COLORREF类型数据的第 类型数据的第1 种基本颜色组成,COLORREF类型数据的第1位字节 存放红色强度值, 红色强度值 个字节存放绿色强度值, 绿色强度值 存放红色强度值,第2个字节存放绿色强度值,第 蓝色强度值 个字节存放蓝色 强度值, 高位字节为0 3 个字节存放 蓝色 强度值 , 高位字节为 0 , 每一种 颜色分量的取值范围为0 255。 颜色分量的取值范围为0到255。 直接设置COLORREF数据不太方便,Windows提供了 COLORREF数据不太方便 直接设置COLORREF数据不太方便,Windows提供了 RGB宏用于设置颜色,将其中的红、绿、蓝分量值 宏用于设置颜色,将其中的红、 转换为COLORREF类型的颜色数据: COLORREF类型的颜色数据 转换为COLORREF类型的颜色数据: RGB(cRed, cGreen, cBlue) 其中参数cRed cGreen和cBlue分别表示红 cRed、 分别表示红、 其中参数cRed、cGreen和cBlue分别表示红、 蓝分量值(范围0 255) 绿、蓝分量值(范围0到255)。
RGB宏的使用: 宏的使用: 宏的使用 很多涉及到颜色的GDI 函数都需要使用COLORREF GDI函数都需要使用 很多涉及到颜色的 GDI 函数都需要使用 COLORREF 类型的参数,如设置背景色的成员函数 CDC::SetBkColor() , 设 置 文 本 颜 色 的 成 员 函 数 CDC::SetTextColor()。例如: 。例如: COLORREF rgbBkClr=RGB(192,192,192); // 定义灰色 pDC->SetBkCorlor(rgbBkClr); // 背景色为灰色 pDC->SetTextColor(RGB(0,0,255)); // 文本颜色为蓝色
标准彩色的RGB值 值 标准彩色的
颜色 浅红 浅绿 浅蓝 浅黄 浅青 紫色 白色 RGB分量值 RGB分量值 255, 255,0,0 0,255,0 255, 0,0,255 255,255, 255,255,0 0,255,255 255, 255, 255,0,255 255,255, 255,255,255 颜色 深红 深绿 深蓝 深黄 深青 灰色 黑色 RGB分量值 RGB分量值 128, 128,0,0 0,128,0 128, 0,0,128 128,128, 128,128,0 0,128,128 128, 192,192, 192,192,192 0,0,0
选择一个GDI对象: 对象: 选择一个 对象 要使用创建的对象, 要使用创建的对象 , 首先应将它选入到设备上下 调用CDC::SelectObject() 可以 选择 用户已定制好 可以选择 选择用户已定制好 文 。 调用 的画笔、画刷、字体和位图等不同类型的GDI对象 不同类型的GDI对象。 的画笔、画刷、字体和位图等不同类型的GDI对象。 CPen* SelectObject(CPen* pPen); CBrush* SelectObject(CBrush* pBrush); CFont* SelectObject(CFont* pFont); CBitmap* SelectObject(CBitmap* pBitmap); 函数参数是一个指向用户已定制好的GDI对象的指 函数参数是一个指向用户已定制好的GDI对象的指 GDI 选择操作成功函数将返回以前GDI对象的指针 以前GDI对象的指针, 针,选择操作成功函数将返回以前GDI对象的指针,否 则返回NULL NULL。 则返回NULL。
使用画笔
默认画笔为一个像素单位宽度、 默认画笔为一个像素单位宽度、风格为实黑线 BLACK_PEN)的画笔。 (BLACK_PEN)的画笔。 如果要在设备环境使用自己的画笔绘图, 如果要在设备环境使用自己的画笔绘图,首先 需要创建一个指定风格的画笔,然后将创建的画笔 需要创建一个指定风格的画笔,然后将创建的画笔 选入设备环境,最后, 选入设备环境,最后,在使用该画笔绘图结束后需 要释放该画笔。 要释放该画笔。 1. 创建画笔 创建画笔最简单的方法是调用CPen类的一个带 创建画笔最简单的方法是调用CPen类的一个带 CPen 参数的构造函数来构造一个CPen类画笔对象,以下 参数的构造函数来构造一个CPen类画笔对象, CPen类画笔对象 代码创建了一个红色虚线画笔: 代码创建了一个红色虚线画笔: RGB(255 255, )); CPen NewPen (PS_DASH, 1, RGB(255, 0, 0));
创建画笔的第二种方法是首先构造一个没有初始 化 的 CPen 类 画 笔 对 象 , 然 后 调 用 成 员 函 数 CPen::CreatePen()创建定制的画笔工具: 创建定制的画笔工具: 创建定制的画笔工具 CPen NewPen; //定义一个画笔 //定义一个画笔 NewPen.CreatePen(PS_DASH, 1,RGB(255,0,0)); 255, )); (PS_DASH, ,RGB(255 函数CreatePen()的参数类型与带参数的CPen 类构 的参数类型与带参数的CPen 函数 的参数类型与带参数的 CPen类构 造函数完全一样。 造函数完全一样。当画笔对象的声明与创建不在同一个 地方时(如需要多次改变画笔)只有采用这种方法。 地方时(如需要多次改变画笔)只有采用这种方法。
画笔样式 线宽
CPen::CreatePen(int CPen::CreatePen(int nPenStyle,int nWidth, :: DWORD crClor)
线的颜色
画 笔
样
式
说
明
画
笔
样
式
说
明
PS_SOLID PS_DOT PS_DASH PS_DASHDOT
实线 点线 虚线 点划线
PS_DASHDOTDOT PS_NULL PS_INSIDEFRAME
双点划线 空的边框 边框实线
2. 选择创建的画笔 创 建 画 笔 后 必 须 调 用 成 员 函 数 CDC:: SelectObject()将创建的画笔选入当前设备环 将创建的画笔选入当前设备环 如果选择成功,函数SelectObject()将返 境 。 如果选择成功 , 函数 将返 以前画笔对象的指针 画笔对象的指针。 回以前画笔对象的指针。选择新的画笔时应该 保存以前的画笔对象,如下代码所示: 保存以前的画笔对象,如下代码所示: CPen* pOldPen; CPen NewPen;
NewPen.CreatePen(PS_DASH,1,RGB(255,0,0));
pOldPen=pDC->SelectObject(&NewPen);
3. 还原画笔
创建和选择画笔工具后, 创建和选择画笔工具后,应用程序就可以使用 该画笔绘图。当绘图完成后, 该画笔绘图 。 当绘图完成后 , 应该通过调用成员函 数 CDC::SelectObject()恢复设备环境以前的画笔 恢复设备环境以前的画笔 工 具 , 并 通 过 调 用 成 员 函 数 CGdiObject::DeleteObject()释放GDI对象所占的内 释放GDI 释放GDI对象所占的内 存资源,如下代码所示: 存资源,如下代码所示: dc.SelectObject(pOldPen); // 恢复设备环境 中原来的画笔 恢复设备环境DC中原来的画笔 NewPen.DeleteObject(); // 删除底层的 删除底层的GDI对象 对象
使用画刷
当创建一个设备环境时, 当创建一个设备环境时 , 该设备环境自动提供了 一个填充色为白色(WHITE_BRUSH)的缺省画刷。 一个填充色为白色(WHITE_BRUSH)的缺省画刷。 与画笔一样,也可以利用MFC画刷类CBrush创建 MFC画刷类 与画笔一样 , 也可以利用 MFC 画刷类 创建 自己的画刷,用于填充图形的绘制。 自己的画刷,用于填充图形的绘制。 画刷有三种基本类型:纯色画刷、阴影画刷和 画刷有三种基本类型 : 纯色画刷 、 阴影画刷 和 图 案画刷, CBrush类提供了多个不同重载形式的构 案画刷 , CBrush 类提供了多个不同重载形式的构 造函数。以下创建三种不同类型的画刷: 造函数。以下创建三种不同类型的画刷: brush1(RGB(255 255, )); CBrush brush1(RGB(255,0,0)); // 创建纯色画刷 CBrush brush2 RGB(0 255, )); brush2(HS_DIAGCROSS, RGB(0,255,0));
// 创建阴影画刷 // 创建图案画刷
brush3(&bmp); CBrush brush3(&bmp);
创建画刷也可以先构造一个没有初始化的CBrush类画刷 创建画刷也可以先构造一个没有初始化的CBrush类画刷 也可以先构造一个没有初始化的CBrush 对象,然后调用CBrush CBrush类的初始化成员函数创建定制的 对象,然后调用CBrush类的初始化成员函数创建定制的 画刷工具。CBrush类提供的常用创建函数有 类提供的常用创建函数有: 画刷工具。CBrush类提供的常用创建函数有:
BOOL CreateSolidBrush(COLOREF crColor) 用指定的颜色创建一个纯色画刷; 用指定的颜色创建一个纯色画刷; 纯色画刷 CreatePatternBrush() 用位图创建一个图案画刷; 用位图创建一个图案画刷;其参数为指向对象的指针 图案画刷 CreateHatchBrush(int nIndex,COLORREF crColor) 用指定的阴影样式(nIndex)和颜色创建一个阴影画刷; 和颜色创建一个阴影画刷; 用指定的阴影样式 和颜色创建一个阴影画刷 CBrush BrushNew; BrushNew.CreateHatchBrush(HS_CROSS,RGB(255, 0, 0)); //创建了一个填充色为红色、 //创建了一个填充色为红色、图案为水平和垂直相交阴影线的画刷 创建了一个填充色为红色
阴影样式(nIndex) 阴影样式
说
明
HS_BDIAGONAL HS_FDIAGONAL HS_DIAGCROSS HS_CROSS HS_HORIZONTAL HS_VERTICAL
从左下角到右上角的45° 从左下角到右上角的45°阴影线 45 从左上角到右下角的45° 从左上角到右下角的45°阴影线 45 十字交叉的45°阴影线 十字交叉的45° 45 水平和垂直交叉的阴影线 水平阴影线 垂直阴影线
使用GDI堆对象 使用GDI堆对象 GDI
Windows预定义了一些简单风格的GDI对象,用户使 预定义了一些简单风格的GDI对象, 预定义了一些简单风格的GDI对象 用这些GDI对象时,无需自己创建它们, GDI对象时 用这些GDI对象时,无需自己创建它们,可以直接将 它们选入当前的设备环境,这些GDI对象称作为堆 GDI对象称作为 它们选入当前的设备环境,这些GDI对象称作为堆 Stock)对象(也叫库存对象) 堆对象包括堆画笔 堆画笔、 (Stock)对象(也叫库存对象)。堆对象包括堆画笔、 堆画刷和堆字体等 堆画刷和堆字体等。 通过调用成员函数CDC::SelectStockObject()可以 通过调用成员函数CDC::SelectStockObject()可以 选择一个堆对象绘图工具。 选择一个堆对象绘图工具。
pPenOld=(CPen*) dc.SelectStockObject(NULL_PEN); // 使用堆画笔对象 库存画笔对象) 使用堆画笔对象(库存画笔对象 库存画笔对象) pBrhOld=(CBrush*) dc.SelectStockObject (LTGRAY_BRUSH); // 使用堆画刷对象
堆画笔、 堆画笔、画刷的样式及说明
样 式 说 明 样 式 说 明
BLACK_PEN NULL_PEN WHITE_BRUSH GRAY_BRUSH LTGRAY_BRUSH
黑色画笔 空画笔 白色画刷 灰色画刷
浅灰色画刷
WHITE_PEN BLACK_BRUSH NULL_BRUSH DKGRAY_BRUSH HOLLOW_BRUSH
白色画笔 黑色画刷 空画刷
深灰色画刷
虚画刷
绘制基本图形
生成设备环境、 生成设备环境 、 设置绘图属性和选择绘图工具 就可以开始绘制不同形状的几何图形, 后 , 就可以开始绘制不同形状的几何图形 , Windows中可以绘制的基本几何图形包括点 中可以绘制的基本几何图形包括点、 Windows 中可以绘制的基本几何图形包括点 、 直线、曲线、矩形、椭圆、 扇形、 直线 、 曲线、 矩形 、椭圆、 弧、 扇形 、弦形和 多边形等。 多边形等。 GDI为提供了绘制基本图形的 成员函数 GDI 为提供了绘制基本图形的成员函数 , 这些 为提供了绘制基本图形的 成员函数, 函数封装在MFC CDC类中 MFC的 类中。 函数封装在MFC的CDC类中。 绘图函数使用的坐标都是逻辑坐标。 绘图函数使用的坐标都是逻辑坐标。
函 MoveTo LineTo
数
功 用指定的颜色在指定的坐标处画一个点
能
SetPixel
移动当前位置到指定的坐标,函数返回以前位置的坐标。 移动当前位置到指定的坐标,函数返回以前位置的坐标。 从当前位置到指定位置画一条直线 从当前位置开始,根据函数参数绘制多条折线。 从当前位置开始,根据函数参数绘制多条折线。 根据两个端点和两个控制点绘制贝济埃(Bezier)曲线。 根据两个端点和两个控制点绘制贝济埃(Bezier)曲线。 根据指定的左上角和右下角坐标绘制一个矩形 绘制一个圆角矩形。 绘制一个圆角矩形。 根据指定的矩形绘制一个内切椭圆 根据指定的矩形绘制内切椭圆上的一段弧边 该函数功能与Arc函数相似 该函数功能与Arc函数相似 Arc 绘制扇形 绘制弦形,弦形是一条椭圆弧和其对应的弦所组成的封闭图形。 绘制弦形,弦形是一条椭圆弧和其对应的弦所组成的封闭图形。 根据两个或两个以上顶点绘制一个多边形 在指定位置画一个图标,如果成功函数返回非0 否则返回0 在指定位置画一个图标,如果成功函数返回非0,否则返回0。
Polyline PolyBezier Rectangle RoundRect Ellipse Arc ArcTo Pie Chord Polygon DrawIcon
绘制文本
图形方式进行文本的输出是Windows操作系统一个 以图形方式进行文本的输出是Windows操作系统一个 特性, 特性 , 文本输出实际上是按照指定的字体样式将文 本中的每个字符绘制出来。 本中的每个字符绘制出来。 Windows图形设备接口 GDI Windows 图形设备接口GDI 提供了很多有关文本输出 图形设备接口 GDI提供了很多有关文本输出 的函数,MFC的CDC类对这些GDI文本输出函数进行了 类对这些GDI 的函数,MFC的CDC类对这些GDI文本输出函数进行了 封装。 封装。 编程时最常用的文本输出函数是TextOut()函数,该 函数, 编程时最常用的文本输出函数是 函数 函数只能输出单行文本。 函数只能输出单行文本 。 要绘制多行文本可以调用 DrawText()函数。 函数。 函数
在缺省情况下绘制文本时,字体颜色是黑色, 在缺省情况下绘制文本时,字体颜色是黑色, 背景颜色是白色,背景模式为不透明模式。 背景颜色是白色,背景模式为不透明模式。可以通 过调用CDC类成员函数重新设置字体颜色、 CDC类成员函数重新设置字体颜色 过调用CDC类成员函数重新设置字体颜色、背景颜色 和文本对齐方式等文本属性。 和文本对齐方式等文本属性。
SetTextColor() GetTextColor SetBkColor() GetBkColor() SetBkMode() GetBkMode() SetTextAlign() GetTextAlign() 设置显示文本的颜色 获得当前文本的颜色 设置显示文本的背景颜色 获得当前文本的背景颜色 设置文本的背景模式 获得当前文本的背景模式 设置显示文本的对齐方式 获得当前文本的对齐方式
例:对话框中绘图(Draw1) 对话框中绘图( )
建立基于对话框的应用程序 中添加一个Bitmap(new或 在ResourceView中添加一个 中添加一个 ( 或 import)。 )。 ()函数中添加绘图操作代码 在OnPaint()函数中添加绘图操作代码。 ()函数中添加绘图操作代码。
()函数中添加如下代码 在OnPaint()函数中添加如下代码: ()函数中添加如下代码: COLORREF rgbBkClr=RGB(192,192,192); // 灰色 CClientDC dc(this); dc.SetBkColor(rgbBkClr); dc.SetTextColor(RGB(0,0,255)); dc.TextOut(0,0,"Hello world");
//CPen NewPen (PS_DASH, 1, RGB(255, 0, 0)); CPen NewPen; //定义一个画笔 定义一个画笔
NewPen.CreatePen(PS_DASH, 3,RGB(255,255,0));
dc.SelectObject(&NewPen); dc.MoveTo(30,60); dc.LineTo(50,100);
CBrush brush1(RGB(255,0,0)); // 创建纯色画刷
CBrush brush2(HS_DIAGCROSS, RGB(0,255,0));
// 创建阴影画刷
CBitmap bmp; CBrush BrushNew;
BrushNew.CreateHatchBrush(HS_CROSS, RGB(255, 0, 0)); // 创建阴影画刷
bmp.LoadBitmap(IDB_BITMAP1); CBrush brush3(&bmp); // 创建图案画刷 //dc.SelectObject(&brush1);
dc.SelectObject(&brush3); dc.Rectangle(100,100,300,300); dc.SelectObject(&brush2); dc.Ellipse(300,300,200,200); dc.SelectObject(&BrushNew); dc.RoundRect(100,20,250,90,30,30);
例:对话框中绘图(Draw2) 对话框中绘图( )
CPen *PenOld,PenNew; int PenStyle[]={PS_SOLID,PS_DOT,PS_DASH}; char *strStyle[]={"实线 点线 虚线 实线","点线 虚线"}; 实线 点线","虚线 char *strWidth[]={"1","2","3"}; char *strColor[]={"红","绿","蓝"}; 红 绿 蓝 char *p; int x,y,t,width=1;
COLORREF rgbPenClr[]={RGB(255,0,0),RGB(0,255,0),RGB(0,0,255)}; COLORREF PenColor=RGB(0,0,0);
CClientDC dc(this); dc.TextOut(60,10,"用不同样式的画笔绘图 用不同样式的画笔绘图"); 用不同样式的画笔绘图 dc.TextOut(260,10,"用不同宽度的画笔绘图 用不同宽度的画笔绘图"); 用不同宽度的画笔绘图 dc.TextOut(460,10,"用不同颜色的画笔绘图 用不同颜色的画笔绘图"); 用不同颜色的画笔绘图
for(int i=0;i<3;i++) { for(int j=0;j<3;j++) {x=2*i+1; if(i==0) {y=j; t=1;p=strStyle[ j ];} else if(i==1) {y=0;t=26;width=j+1;p=strWidth[ j ];} else {y=j;t=46;PenColor=rgbPenClr[j];p=strColor[ j ];} PenNew.CreatePen(PenStyle[y],width,PenColor); PenOld=dc.SelectObject(&PenNew); dc.TextOut(10*t,35+52*j,p); dc.Rectangle(100*x,40+50*j,100*(x+1),60+50*j); dc.SelectObject(PenOld);//还原画笔 还原画笔 PenNew.DeleteObject();//释放画笔 释放画笔 } } }
j=0
j=1
j=2 i=1 i=2
i=0
1