VC++ 课件 第06章 绘图、字体和位图
VC6.0简单绘图说明
第二章VC6.0简单绘图说明许多学编程的都是从C 语言开始入门的,而目前的现状是:有些学校以Turbo C 为环境讲C 语言,只是Turbo C 的环境实在太老了,复制粘贴都很不方便。
有些学校直接拿VC 来讲C 语言,因为VC 的编辑和调试环境都很优秀,并且VC 有适合教学的免费版本。
可惜在VC 下只能做一些文字性的练习题,想画条直线画个圆都很难,还要注册窗口类、建消息循环等等,初学者会受严重打击的。
初学编程想要绘图就得用TC,很是无奈。
还有计算机图形学,这门课程的重点是绘图算法,而不是Windows 编程。
所以,许多老师不得不用TC 教学,因为Windows 绘图太复杂了,会偏离教学的重点。
新的图形学的书有不少是用的OpenGL,可是门槛依然很高。
要给初学者一个简单的学习平台,就要VC的开发平台和TC的简单的绘图功能,于是就有了这个EasyX 库,我们需要在VC下下载安装EasyX库,下载地址:http:///。
下面是VC下简单绘图函数的基本说明。
1.系统支持操作系统版本:Windows 2000 及以上系统。
编译环境版本:Visual C++ 6.0 / 2008(x86 & x64) / 2010(x86 & x64)。
2.安装请先将下载的压缩包解压缩,然后执行Setup.hta,并跟随提示安装。
安装程序会检测已经安装的VC 版本,并根据选择将对应的.h 和.lib 文件安装至VC 的include 和lib 文件夹内。
安装程序不会修改注册表或者本机的任何文件。
如果需要手动安装,请根据下面的文件列表说明将安装包里的相关文件分别复制到VC 对应的include 和lib 文件夹内,或者将include 和lib 文件夹放到任意位置,然后修改VC 中的Lib 和Include 的引用路径。
3.卸载由于安装程序并不改写注册表,因此在“添加删除程序”中不会看到EasyX 的卸载项。
VC绘图简易教程_6_共7页
实际中有许多类似的图案,如果一一单独绘制,太麻烦。
于是,我们需要一个公用的绘制过程,就是函数。
例如,我们需要画5个三角形,位于不同的位置。
我们可以将绘制单个三角形的过程写成函数,函数内是一个独立的程序段,这个绘制过程很简单。
然后,在需要绘制的时候,调用这个函数即可。
可以通过参数来解决细微差异(图案的坐标、颜色等),例如:#include <graphics.h>#include <conio.h>// 在坐标(x,y) 处,用颜色c 绘制三角形void sanjiaoxing(int x, int y, int c){// 设置画线颜色setcolor(c);// 画三角形的三条边line(x, y, x+50, y);line(x, y, x, y+50);line(x+50, y, x, y+50);}void main(){initgraph(640, 480); // 初始化图形窗口sanjiaoxing(100, 100, RED);sanjiaoxing(120, 160, BLUE);sanjiaoxing(140, 220, GREEN);sanjiaoxing(160, 120, BLUE);sanjiaoxing(160, 160, GREEN);sanjiaoxing(220, 140, GREEN);getch(); // 按任意键继续closegraph(); // 关闭图形窗口}再结合循环等控制条件,就能绘制更复杂漂亮的图案了。
试试运行下面程序,理解一下函数的用处:#include <graphics.h>#include <conio.h>void sanjiaoxing(int x, int y, int color){// 设置画线颜色setcolor(color);// 画三角形的三条边line(x, y, x+10, y);line(x, y, x, y+10);line(x+10, y, x, y+10);}void main(){initgraph(640, 480); // 初始化图形窗口for(int x=0; x<640; x+=10)for(int y=0; y<480; y+= 10)sanjiaoxing(x, y, RGB(x*255/640, y*255/480, 0));getch(); // 按任意键继续closegraph(); // 关闭图形窗口}本节作业:1. 绘制Windows 自带游戏“扫雷”的初始界面。
Visual C++6.0 绘图基础
OnDraw()函数:
void CTestView::OnDraw(CDC* pDC) { CTestDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here } •pDC定义为CDC类的指针。 •pDoc通过GetDocument()函数得到了指向文档类 CTestDoc的指针。 •ASSERT_VALID(pDoc)函数使pDoc指针有效。 •使用pDC指针,可以对CDC类的成员函数进行操作。 •OnDraw()函数是由系统框架直接调用的,每当窗口重绘 时就会自动执行。
在选择GDI对象进行绘图时,需要遵循以下步骤:
绘图开始前,创建一个GDI对象,并选入当前设备上
下文,同时保存原GDI对象指针。
使用新GDI对象绘图。 绘图结束后,使用已保存的原GDI对象指针将设备上 下文恢复原状。
2.3.2 映射模式
把图形显示在屏幕坐标系中的过程称为映射 根据映射模式的不同可以分为 逻辑坐标
!按钮
点击工具条上的 “!”按钮,就可以直接编译、运行程 序 尽管未编写一句代码,但Test程序已经形成一个可执 行程序框架
2.3 MFC基本绘图函数
在Windows平台上,应用程序的图形设备接口
(Graphics Device Interface,GDI)被抽象化为设备
上下文CDC类(Device Content,DC)。在微软基类库
第二章
本章学习目标
开发工具的选择 MFC上机操作步骤 MFC基本绘图函数 绘制像素点函数 路径层函数 获取像素点颜色函数 绘制Bezier曲线函数 绘制直线段函数 位图操作函数 绘制矩形函数 图形文本函数 绘制椭圆函数 双缓冲机制 绘制椭圆弧函数 设备上下文的调用和释 绘制扇形函数 放 绘制多边形函数 MFC绘制图形的几种方 法
C程序设计教程课件PPT课件
哈希查找
通过哈希函数将元素的关键字转 换为数组的索引,然后在对应位 置进行查找。时间复杂度为O(1)。
THANKS
感谢观看
选择排序
每次从未排序序列中选出最小 (或最大)元素,放到已排序
序列的末尾。时间复杂度为 O(n^2)。
插入排序
将未排序元素插入到已排序序 列中的适当位置,以达到排序 的目的。时间复杂度为O(n^2)。
常见排序算法实现原理及性能比较
快速排序
采用分治策略,通过一趟排序将待排序序列分割成独立的两部分,其中一部分的所有元素都比另一部分的 所有元素小,然后再对这两部分继续进行排序。时间复杂度为O(nlogn)。
示例1
使用fprintf()和fscanf()函数实现 文件的读写操作。
示例2
使用fgetc()和fputc()函数实现文 件的字符读写操作。
示例3
使用fgets()和fputs()函数实现文 件的字符串读写操作。
示例4
使用fread()和fwrite()函数实现 文件的数据块读写操作。
数据存储格式选择(如:文本、二进制)
01
文本格式
02
二进制格式
03
选择依据
将数据以字符形式存储,便于查看和编 辑,但占用空间较大。
将数据以二进制形式存储,占用空间较 小,读写效率高,但不便于直接查看和 编辑。
根据实际需求选择数据存储格式,如需 要频繁读写大量数据且对存储空间有要 求时,可以选择二进制格式;如需要方 便查看和编辑数据时,可以选择文本格 式。
算法概念及评价标准
算法概念
为解决特定问题而规定的一系列操作步骤,具有有穷性、确定性、可行性、输 入和输出五个基本特性。
评价标准
Visual Basic程序设计教程电子课件——程序设计基础
2.1.2 如何学习Visual Basic
2.编程实验对能力提高最重要
学习Visual Basic与学习下棋有很多相似,值得类比、 借鉴。
学下棋必须先学各棋子的移动规则,但记住了“马走日、 象走田”并不意味着你就会下棋了,必须要勤于对奕并潜 心钻研。学习Visual Basic必须先了解Visual Basic语 言的基本规则,而更重要的是在实际应用中逐步提高编程 能力。
有懂不懂的问题。有此认识,才能避免进入许多初 学者都易于陷入的误区,从而使我们的学习获得事 半功倍的效果。
时常有学生为没有用心去记因此没有记住这些 规则而苦恼,经常有学生用一句“一点都不懂”来 表达此时的心情,是非常有害的,使得学习 Visual Basic迟பைடு நூலகம்才得以入门,从而耽误了宝贵 的学习时间。
4
2.1.1 计算机高级语言与语言处理系 统
再譬如,可以在一行上写上这样的两条语句“x=5: y=x*7.3”,但决不允许写成“x=5, y=x*7.3”,因为 Visual Basic的规则是一行上的多条语句之间必须用冒号 间隔。
(2) 语言处理系统开发者必须根据这套规则去设计、 制作语言处理系统,对于用户严格按照相应语言的规定编 写的程序,该系统应能够处理它并最终生成该程序的可执 行文件。
关于Visual Basic语言我们只能了解并熟记,我们只 能遵守规则而不能去创造规则,我们学习的意义在于用高 级语言编写程序去解决实际问题。
5
2.1.2 如何学习Visual Basic
1.语言规则要熟记 学习Visual Basic首先要做到熟记Visual
Basic语言的规则。 对于规则,只有记得住与记不住的问题,而没
若计算圆柱体的体积并存入变量v,声明v为Single 类型,半径和圆周率也采用Single类型,则结果v具有6位 有效数字;如果要求计算结果具有更高的精确度,可以考 虑采用Double类型声明v与相关变量。
VC++6.0绘制位图
1.1.1.1.绘制位图绘制位图之前需要加载位图。
加载位图有两种方式,从资源中加载位图,以及从外部图片文件中加载位图。
1.1.1.1.1.从资源中加载位图1.1.1.1.1.1.定义位图资源位图资源可以直接使用VC6.0在资源视图中创建或编辑位图资源,也可以在导入外部位图图片作为位图资源。
资源视图中定义位图资源界面如下所示。
定义位图资源1.1.1.1.1.2.加载位图使用MFC提供的CBitmap类可以方便的加载位图资源。
//从资源中加载位图CBitmap bmp;bmp.LoadBitmap(IDB_BITMAP1);//获取位图信息BITMAP bitmap;memset(&bitmap,0,sizeof(bitmap));bmp.GetBitmap(&bitmap);使用CBitmap类的GetBitmap方法获取位图信息,包括宽度和高度以及颜色深度等。
使用BITMAP结构体来描述位图信息。
typedef struct tagBITMAP{LONG bmType;//类型LONG bmWidth;//宽度,像素LONG bmHeight;//高度,像素LONG bmWidthBytes;//位图的每行占用多少字节。
位图是一行行存储的。
WORD bmPlanes;//位面数WORD bmBitsPixel;//颜色深度,每像素使用多少二进制位表示LPVOID bmBits;//指向像素颜色数据存储区域的指针。
}BITMAP1.1.1.1.2.从外部图片文件加载位图此方式比使用位图资源灵活,程序编译之后还可以随时替换成不同的位图文件。
使用全局函数LoadImage可以完成此功能。
//从图片文件加载位图。
HBITMAP hbmp;Hbmp=(HBITMAP)LoadImage(NULL,"bitmap.bmp",IMAGE_BITMAP,0,0,LR_LOADTRANSPARENT|LR_LOADFROMFILE);//将位图句柄转化为CBitmap指针。
VC使用教程PPT课件
第2页/共24页
什么是控制台程序?
• 一个最简单的控制台程序如下:
/* helloworld.c */ #include<stdio.h>
/* 包含使用标准输入 输出的头文件 */
➢双击桌面上的vc++6.0图标 ➢鼠标左键单击Windows操作系统的“开始” →“程序” →“Microsoft Visual Studio 6.0” →“Microsoft Visual C++ 6.0”
第5页/共24页
新建
File → New (Ctrl+N)
第6页/共24页
创建一个新的项目文件
第21页/共24页
关闭文件和工作区
选择菜单“File\Close WorkSpace”,关闭当前 的工作区和所有打开的文件。
第22页/共24页
23
第23页/共24页
感谢您的观看!
第24页/共24页
c程序开发过程打开vc60双击桌面上的vc60图标鼠标左键单击windows操作系统的开始程序microsoftvisualstudio60microsoftvisual60新建filenewctrln创建一个新的项目文件新建工程命名修改工程存放路径创建一个空工程生成一个空工程vc60的编辑窗口自动生成的文件和文件夹工程管理结构workspaceprojectproject我们一般把自定义数据类型函数等的定义和声明放置在头文件中
.c
工程唯一的main函数
.c 把相应的实现细节放置在(*.c)文件中
Projec/共24页
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
// 结果为(125, 75, 150, 95)
// 结果为(0, 0, 350, 200)
6.2 简单图形的绘制
6.2.1 创建画笔
创建一个修饰画笔,可以使用CPen类的CreatePen函数,其原型如下: BOOL CreatePen( int nPenStyle, int nWidth, COLORREF crColor ); 其中,参数nPenStyle、nWidth、crColor分别用来指定画笔的风格、宽度和颜色。 BOOL CreatePenIndirect( LPLOGPEN lpLogPen ); 此函数用由LOGPEN结构指针指定的相关参数创建画笔,LOGPEN结构如下: typedef struct tagLOGPEN { /* lgpn */ UINT lopnStyle; // 画笔风格,同上 POINT lopnWidth;// POINT结构的y不起作用,而用x表示画笔宽度 COLORREF lopnColor; // 画笔颜色 } LOGPEN; 值得注意的是: n 当 修 饰 画 笔 的 宽 度 大 于 1 个 像 素 时 , 画 笔 的 风 格 只 能 取 PS_NULL 、 PS_SOLID 或 PS_INSIDEFRAME,定义为其他风格不会起作用。 n 画笔的创建工作也可在画笔的构造函数中进行,它具有下列原型: CPen( int nPenStyle, int nWidth, COLORREF crColor );
6.1 概述
6.1.5 简单数据类CPoint、CSize和CRect
1. CPoint、CSize和CRect类的构造函数 CPoint类带参数的常用构造函数原型如下: CPoint( int initX, int initY ); CPoint( POINT initPt ); CSize类带参数的常用构造函数原型如下: CSize( int initCX, int initCY ); CSize( SIZE initSize ); CRect类带参数的常用构造函数原型如下: CRect( int l, int t, int r, int b ); CRect( const RECT& srcRect ); CRect( LPCRECT lpSrcRect ); CRect( POINT point, SIZE size ); CRect( POINT topLeft, POINT bottomRight ); 2. CPoint、CSize和CRect的基本运算符操作 (1) “+”操作 若向CPoint对象加上一个CSize对象,则返回CPoint对象。 若向CRect对象加上一个CPoint对象或CSize对象,则返回CRect对象。 若向CRect对象加上一个CSize对象,则将一个RECT(或CRect)值偏移(移动)CSize大小,
6.1 概述
void CMyView::OnDraw( CDC* pDC ) { CPen newPen( PS_SOLID, 2, RGB(0,0,0) ) ) pDC->SelectObject( &newPen ); pDC->MoveTo(...); pDC->LineTo(...); pDC->SelectStockObject( BLACK_PEN ); // newPen被分离出来 } 函数SelectStockObject可选用的库存GDI对象类型可以是下列值之一: BLACK_BRUSH 黑色画刷 DKGRAY_BRUSH 深灰色画刷 GRAY_BRUSH 灰色画刷 HOLLOW_BRUSH 中空画刷 LTGRAY_BRUSH 浅灰色画刷 NULL_BRUSH 空画刷 WHITE_BRUSH 白色画刷 BLACK_PEN 黑色画笔 NULL_PEN 空画笔 WHITE_PEN 白色画笔 DEVICE_DEFAULT_FONT 设备默认字体 SYSTEM_FONT 系统字体
第6章 绘图、字体和位图
6.1 6.2 6.3 6.4 概述 简单图形的绘制 字体与文字处理 位图、图标与光标
6.1 概述
6.1.1 设备环境类
(1) (2) CPaintDC CPaintDC类的构造函数会自动调用BeginPaint,而它的析构函数则会自动调用EndPaint。 CClientDC 和CWindowDC CWindowDC和CClientDC构造函数分别调用GetWindowDC和GetDC,但它们的析构函数 都是调用ReleaseDC函数。 CMetaFileDC CMetaFileDC封装了在一个Windows图元文件中绘图的方法。
6.1 概述
其中,lpRect1和lpRect2用来指定操作的两个矩形。例如: CRect rectOne(125, 0, 150, 200); CRect rectTwo( 0, 75, 350, 95); CRect rectInter; rectInter.IntersectRect(rectOne, rectTwo); ASSERT(rectInter == CRect(125, 75, 150, 95)); rectInter.UnionRect (rectOne, rectTwo); ASSERT(rectInter == CRect(0, 0, 350, 200));
6.1 概述
在MM_ISOTROPIC映射模式下,纵横比总是1:1,换句话说,无论比例因子如何变化,圆总 是圆的;但在MM_ANISOTROPIC映射模式下,x和y的比例因子可以独立地变化,即圆可以 被拉扁成椭圆形状。 将一个椭圆绘制在视窗中央,且当视图的大小发生改变时,椭圆的形状也会随之改变: void CMyView::OnDraw(CDC* pDC) { CRect rectClient; GetClientRect(rectClient); // 获得当前窗口的客户区大小 pDC->SetMapMode(MM_ANISOTROPIC);// 设置MM_ANISOTROPIC映射模式 pDC->SetWindowExt(1000,1000); // 设置窗口范围 pDC->SetViewportExt(rectClient.right,-rectClient.bottom);// 设置视口范围 pDC->SetViewportOrg(rectClient.right/2,rectClient.bottom/2);// 设置视口原点 pDC->Ellipse(CRect(-500,-500,500,500)); }
6.1 概述
(2) “-”操作 若从CPoint对象减去一个CSize对象,则返回一个CPoint对象。 若从CPoint对象减去一个CPoint对象,则返回一个CSize对象。 若从CRect对象减去一个CPoint对象或CSize对象,则返回一个CRect对象。 3. CRect类的常用操作 由于一个CRect类对象包含用于定义矩形的左上角和右下角点的成员变量,因此在传递 LPRECT、LPCRECT或RECT结构作为参数的任何地方,都可以使用CRect对象来代替。 成员函数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 ); 成员函数IntersectRect和UnionRect分别用来将两个矩形进行相交和合并,当结果为空时 返回FALSE,否则返回TRUE。它们的原型如下: BOOL IntersectRect( LPCRECT lpRect1, LPCRECT lpRect2 ); BOOL UnionRect( LPCRECT lpRect1, LPCRECT lpRect2 );
6.1 概述
6.1.4 颜色和颜色对话框
在MFC中,CDC使用的是RGB颜色空间。其中,COLORREF是用来表示RGB颜色的一个32位 的数据类型,它可以用下列的十六进制表示一个RGB值: 0x00bbggrr 在具体操作RGB颜色时,还可使用下列的宏操作: GetBValue 获得32位RGB颜色值中的蓝色分量 GetGValue 获得32位RGB颜色值中的绿色分量 GetRValue 获得32位RGB颜色值中的红色分量 RGB 将指定的R、G、B分量值转换成一个32位的RGB颜色值。 MFC的CColorDialog类为我们应用程序提供了颜色选择通用对话框,它具有下列的构造函数: CColorDialog( COLORREF clrInit = 0, DWORD dwFlags = 0, CWnd* pParentWnd = NULL ); 我们可以在CColorDialog提供的颜色列表中选择一种颜色或定制一种颜色。当该对话框“OK” 退出(即DoModal返回 IDOK)时,还可以调用下列成员获得相应的颜色。 COLORREF GetColor( ) const; // 返回用户选择的颜色。 void SetCurrentColor( COLORREF clr ); // 强制使用clr作为当前选择的颜色 static COLORREF * GetSavedCustomColors( );// 返回用户自己定义颜色 例如,下面的代码片断: CColorDialog dlg; if (dlg. DoModal() != IDOK) return; COLORREF myColor = dlg.GeColor();
6.1.3 图形设备接口
1. 使用GDI对象 在选择GDI对象进行绘图时,往往遵循着下列的步骤: (1) 在堆栈中定义一个GDI对象(如CPen、CBrush对象),然后用相应的函数(如CreatePen、 CreateSolidBrush)创建此GDI对象。