基于VC++MFC程序设计简易画图板32 (4)
- 格式:doc
- 大小:338.50 KB
- 文档页数:73
//??????">
实验1 Visual C++图形程序设计一、实验目的Visual C++是在Microsoft C的基础上发展而来的,随着计算机软、硬件技术的快速发展,如今Visual C++已成为集编辑、编译、运行、调试于一体功能强大的集成编程环境。
本章以Visual C++ 6.0为对象,主要介绍Visual C++集成编成环境的使用、图形设备接口和常用图形程序设计、鼠标编程以及菜单设计等基础,目的是通过对Visual C++的学习,掌握Visual C++图形程序设计的方法,为计算机图形学原理部分的算法实现提供程序工具和方法。
二、实验任务1.学习Visual C++图形程序设计的方法;2.掌握Visual C++集成编成环境的使用、图形设备接口和常用图形程序设计、鼠标编程、橡皮筋交互技术、画刷与画笔以及菜单设计等;三、基础知识和实验步骤3.1 Visual C++ 6.0应用程序开发方法介绍Visual C++ 6.0集成开发环境,以一个简单的实例介绍利用Visual C++应用程序工程建立方法和程序设计框架。
3.1.1 Visual C++的集成开发环境从开始菜单中启动Visual C++ 6.0,进入开发集成环境。
打开一个项目后,可以看到Visual C++ 6.0的开发环境由标题栏、工具栏、工作区窗口、源代码编辑窗口、输出窗口和状态栏组成,见图3.1所示。
标题栏用于显示应用程序名和所打开的文件名,标题栏的颜色可以表明对应窗口是否被激活。
菜单栏包括文件、编辑、显示、插入、工程、编译、工具、窗口和帮助九项主菜单,包含了从源代码的编辑、界面设计、程序调试和编译运行在内的所有功能。
工具栏列出了常用的菜单命令功能和对象方法。
工具栏的下面是两个窗口,一个是工作区窗口,用于列出工程中的各种对象,一个是源代码编辑窗口,用于各个对象的程序设计。
输出窗口显示项目建立过程中所产生的各种信息。
屏幕底端是状态栏,它给出当前操作或所选择命令的提示信息。
MFC中的CDC 绘图绘图一般在视图类的(屏幕/打印机)绘图消息响应函数OnDraw中进行,例如:void CTestView::OnDraw(CDC* /*pDC*/) {CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);if (!pDoc)return;// TODO: 在此处为本机数据添加绘制代码}每次需要重绘窗口时(程序启动/窗口大小改变/全部或部分窗口重现/程序员调用RedrawWindow或UpdateWindow),应用程序框架都会调用该CWnd的消息响应成员函数(的覆盖)来绘制窗口客户区。
在Windows中,绘图一般在视图窗口的客户区进行,使用的是MFC的设备上下文(DC = Device-Context)类CDC中各种绘图函数。
在绘图前,必须先得到客户区大小和DC、设置绘图颜色,然后再根据文档数据或用户操作来绘制图形。
1 几何对象的结构和类为了使用绘图函数,应该先了解绘图所用到的几种表示几何对象的结构和类。
这些结构和类分别定义在头文件windef.h和afxwin.h中。
1.点1)点结构POINT点数据结构POINT用来表示一点的x、y坐标:typedef struct tagPOINT {LONG x;LONG y;} POINT;2)点类CPoint点类CPoint为一个没有基类的独立类,封装了POINT结构,有成员变量x和y,其构造函数有5种:CPoint( );CPoint( int initX, int initY );CPoint( POINT initPt );CPoint( SIZE initSize );CPoint( LPARAM dwPoint ); // 低字设为x、高字设为yCPoint类还定义了4个平移和设置函数:void Offset(int xOffset, int yOffset);void Offset(POINT point);void Offset(SIZE size);void SetPoint(int X, int Y);CPoint类还重载了+、-、+=、-=、==、!=等运算符来支持CPoint对象和CPoint、POINT、SIZE对象之间的运算。
第三章 MFC 应用程序概述第3章 MFC 应用程序概述Microsoft Windows 是微软公司推出的一个应用于微机上的具有图形用户界面的多任务和多窗口的操作系统。
Windows 应用程序也称为窗口应用程序,所有的窗口应用程序都有着相同的窗口风格和菜单结构,用户界面友好,方便用户操作。
本章从剖析窗口应用程序的基本结构入手,继而介绍使用MFC 类库开发的应用程序框架结构,并介绍窗口应用程序运行的核心机制-消息映射。
学习了本章,你将对MFC 应用程序框架结构和运行机制有个整体的了解,为后面进入窗口应用程序开发打下良好的基础。
3.1 窗口应用程序概述窗口应用程序的开发一般采用可视化的面向对象的开发,可选择的窗口应用程序开发语言有Visual C++、Visual Basic 、Visual Java 、Dephi 等等。
无论采用哪一种开发语言,首先要了解窗口应用程序的基本机制。
3.1.1 窗口编程基础窗口应用程序运行于Windows 操作系统,Windows操作系统是一个多任务操作系统,因此窗口应用程序的组成,支持技术,基本运行机制等与DOS 应用程序有着本质的区别。
在学习开发窗口应用程序之前,先要对窗口应用程序有一个概念上的了解。
1. 窗口窗口是应用程序与用户进行交互的界面,应用程序通过窗口传递信息给用户,同样用户通过窗口输入数据,发布命令给应用程序。
Windows 界面包含了丰富的标准用户界面元素,包括窗口、图标、菜单、滚动条、对话框、控件和消息框等。
用户使用这些界面元素可以方便的与应用程序进行交互,一个典型的窗口外观如图3-1所示。
垂直滚动条 控制菜单栏 标题栏 菜单栏关闭按钮 最小化按钮 最大化按钮客户区VC++6简明教程图3-1 Windows应用程序窗口组成在Windows编程中,各种窗口、菜单、按钮、对话框及程序模块等Windows的规范部件是按“对象”来组织的。
为了提高开发窗口应用程序的效率,微软公司为用户提供了大量能创建上述标准元素的API函数和C++类,并且以Windows API函数库和C++类库的形式提供给用户,以充分满足构成应用程序操作界面的需要。
VS2010/MFC编程入门教程之目录第一部分:VS2010/MFC开发环境VS2010/MFC编程入门之前言VS2010/MFC编程入门之一(VS2010与MSDN安装过程图解)第二部分:VS2010-MFC应用程序框架VS2010/MFC编程入门之二(利用MFC向导生成单文档应用程序框架)VS2010/MFC编程入门之三(VS2010应用程序工程中文件的组成结构)VS2010/MFC编程入门之四(MFC应用程序框架分析)VS2010/MFC编程入门之五(MFC消息映射机制概述)第三部分:对话框VS2010/MFC编程入门之六(对话框:创建对话框模板和修改对话框属性)VS2010/MFC编程入门之七(对话框:为对话框添加控件)VS2010/MFC编程入门之八(对话框:创建对话框类和添加控件变量)VS2010/MFC编程入门之九(对话框:为控件添加消息处理函数)VS2010/MFC编程入门之十(对话框:设置对话框控件的Tab顺序)VS2010/MFC编程入门之十一(对话框:模态对话框及其弹出过程)VS2010/MFC编程入门之十二(对话框:非模态对话框的创建及显示)VS2010/MFC编程入门之十三(对话框:属性页对话框及相关类的介绍)VS2010/MFC编程入门之十四(对话框:向导对话框的创建及显示)VS2010/MFC编程入门之十五(对话框:一般属性页对话框的创建及显示)VS2010/MFC编程入门之十六(对话框:消息对话框)VS2010/MFC编程入门之十七(对话框:文件对话框)VS2010/MFC编程入门之十八(对话框:字体对话框)VS2010/MFC编程入门之十九(对话框:颜色对话框)第四部分:常用控件VS2010/MFC编程入门之二十(常用控件:静态文本框)VS2010/MFC编程入门之二十一(常用控件:编辑框Edit Control)VS2010/MFC编程入门之二十二(常用控件:按钮控件Button、Radio Button和Check Box)VS2010/MFC编程入门之二十三(常用控件:按钮控件的编程实例)VS2010/MFC编程入门之二十四(常用控件:列表框控件ListBox)VS2010/MFC编程入门之二十五(常用控件:组合框控件Combo Box)VS2010/MFC编程入门之二十六(常用控件:滚动条控件Scroll Bar)VS2010/MFC编程入门之二十七(常用控件:图片控件Picture Control)VS2010/MFC编程入门之二十八(常用控件:列表视图控件List Control 上)VS2010/MFC编程入门之二十九(常用控件:列表视图控件List Control 下)VS2010/MFC编程入门之三十(常用控件:树形控件Tree Control 上)VS2010/MFC编程入门之三十一(常用控件:树形控件Tree Control 下)VS2010/MFC编程入门之三十二(常用控件:标签控件Tab Control 上)VS2010/MFC编程入门之三十三(常用控件:标签控件Tab Control 下)第五部分:菜单、工具栏与状态栏VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)VS2010/MFC编程入门之三十五(菜单:菜单及CMenu类的使用)VS2010/MFC编程入门之三十六(工具栏:工具栏资源及CToolBar类)VS2010/MFC编程入门之三十七(工具栏:工具栏的创建、停靠与使用)VS2010/MFC编程入门之三十八(状态栏的使用详解)第六部分:文档、视图和框架VS2010/MFC编程入门之三十九(文档、视图和框架:概述)VS2010/MFC编程入门之四十(文档、视图和框架:各对象之间的关系)VS2010/MFC编程入门之四十一(文档、视图和框架:分割窗口)第七部分:MFC常用类VS2010/MFC编程入门之四十二(MFC常用类:CString类)VS2010/MFC编程入门之四十三(MFC常用类:CTime类和CTimeSpan类)VS2010/MFC编程入门之四十四(MFC常用类:定时器Timer)VS2010/MFC编程入门之四十五(MFC常用类:CFile文件操作类)VS2010/MFC编程入门之四十六(MFC常用类:MFC异常处理)第八部分:字体和文本输出VS2010/MFC编程入门之四十七(字体和文本输出:CFont字体类)VS2010/MFC编程入门之四十八(字体和文本输出:文本输出)第九部分:图形图像VS2010/MFC编程入门之四十九(图形图像:CDC类及其屏幕绘图函数)VS2010/MFC编程入门之五十(图形图像:GDI对象之画笔CPen)VS2010/MFC编程入门之五十一(图形图像:GDI对象之画刷CBrush)第十部分:Ribbon界面开发VS2010/MFC编程入门之五十二(Ribbon界面开发:创建Ribbon样式的应用程序框架)VS2010/MFC编程入门之五十三(Ribbon界面开发:为Ribbon Bar添加控件)VS2010/MFC编程入门之五十四(Ribbon界面开发:使用更多控件并为控件添加消息处理函数)VS2010/MFC编程入门之前言鸡啄米的C++编程入门系列给大家讲了C++的编程入门知识,大家对C++语言在语法和设计思想上应该有了一定的了解了。
第二章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++是微软公司开发的一个集成开发环境,换句话说,就是使用c++的一个开发平台.VC++是Windows平台上的C++编程环境,学习VC要了解很多Windows平台的特性,并且还要掌握MFC、ATL、COM等的知识,难度比较大。
Windows下编程需要了解Windows的消息机制以及回调(callback)函数的原理;MFC是Win32API的包装类,需要理解文档视图类的结构,窗口类的结构,消息流向等等;COM是代码共享的二进制标准,需要掌握其基本原理等等。
VC是一个主流的开发平台,VC++不是一门语言,可以把C++看作为一种“工业标准”,而VC++则是某种操作系统平台下的“厂商标准”,而“厂商标准”是在遵循“工业标准”的前提下扩展而来的。
VC++是在Windows平台下开发VC++应用程序,VC++应用程序的开发主要有两种模式,一种是WIN API方式,另一种则是MFC方式,传统的WIN API开发方式比较繁琐,而MFC则是对WIN API再次封装,所以MFC 相对于WIN API开发更具备效率优势,但为了对WINDOWS开发有一个较为全面细致的认识,笔者在这里还是以讲解WIN API的相关内容为主线。
首先VC是一个软件(IDE集成开发环境)(编译、编辑、调试)WindowsSDK(软件开发工具)VC的灵魂:MFC(微软基础类库)ATL(ActiveX模板类库)其他的SDK,如OpenGL,DirectX,ActiveMoive,DrawDib(WinG)VC需要掌握的东西:1、养成一种严谨的软件开发习惯,熟悉软件工程的基本原则。
2、C语言基础3、C++最基本内容:类、继承性、封装性、多态性的概念4、如何用向导建立一个程序框架5、设计菜单6、设计工具条7、设计和使用对话框,熟悉最常用的对话框控件:按钮、静态文本、编辑框等8、知道怎样新建类、成员函数、成员变量、消息处理函数。
9、了解最常用的Windows消息:如WM_PAINT(重绘窗口),鼠标按下、弹起、移动,初始化对话框等。
VB开简易的画图板功能:VB开简易的画图板,使其具有画图板的各块功能VB 界面如下:图二Option ExplicitDim i, drawact As IntegerDim canline, canpen, canrubber, canenlarge, canellipse, canrectangle, canflood, canget, canbrush As Boolean Dim x0, y0, xnow, ynow, radius0, radius As Single Dim Filename As StringPrivate Sub Form_Load()' 初始化图片框的大小和AutoRedraw属性和窗体的标题Picture3.Width = Picture1.WidthPicture3.Height = Picture1.HeightPicture1.AutoRedraw = TruePicture3.AutoRedraw = TruePicture1.Picture = LoadPicture()Filename = "Untitled"Form1.Caption = FilenameEnd SubPrivate Sub Label2_Click(Index As Integer)' 选择某项操作时,将其下凹看上去像是被按下去的 For i = 0 To Label2.Count - 1Label2(i).BorderStyle = 0NextLabel2(Index).BorderStyle = 1drawact = IndexEnd SubPrivate Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)' 当鼠标按下时,对于选择不同的工具执行不同的操作 Select Case drawact' 橡皮Case 0canrubber = TruePicture1.CurrentX = X: Picture1.CurrentY = YPicture1.DrawMode = 13Picture1.DrawWidth = 7' 直线Case 1canline = Truex0 = X: y0 = Yxnow = X: ynow = YPicture1.DrawMode = 7Picture1.DrawWidth = 1' 矩形Case 2canrectangle = Truex0 = X: y0 = Yxnow = X: ynow = YPicture1.DrawMode = 7Picture1.DrawWidth = 2' 椭圆Case 3canellipse = Truex0 = X: y0 = Yxnow = X: ynow = YPicture1.DrawMode = 7Picture1.DrawWidth = 1' 铅笔Case 4canpen = TruePicture1.CurrentX = X: Picture1.CurrentY = YPicture1.DrawMode = 13' 刷子Case 5canbrush = TruePicture1.CurrentX = X: Picture1.CurrentY = YPicture1.DrawMode = 13Picture1.DrawWidth = 5' 油漆桶Case 6Picture1.BackColor = Label1.BackColor' 放大镜Case 7canenlarge = Truex0 = X: y0 = Yxnow = X: ynow = YPicture1.DrawMode = 7Picture1.DrawWidth = 1End SelectEnd SubPrivate Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)' 在标签中显示当前鼠标在画板中的位置Label3.Caption = "X: " + CStr(X) + Chr(13) + Chr(10) + "Y: " + CStr(Y)' 当鼠标移动时,对于选择不同的工具执行不同的操作 Select Case drawact' 橡皮Case 0If canrubber ThenPicture1.Line -(X, Y), vbWhiteEnd If' 直线Case 1If canline ThenPicture1.Line (x0, y0)-(xnow, ynow), Not (Picture1.ForeColor)Picture1.Line (x0, y0)-(X, Y), Not (Picture1.ForeColor)xnow = X: ynow = YEnd If' 矩形Case 2If canrectangle ThenPicture1.Line (x0, y0)-(xnow, ynow), Not (Picture1.ForeColor), BPicture1.Line (x0, y0)-(X, Y), Not (Picture1.ForeColor), Bxnow = X: ynow = YEnd If' 椭圆Case 3radius0 = Sqr((xnow - x0) ^ 2 + (ynow - y0) ^ 2)radius = Sqr((X - x0) ^ 2 + (Y - y0) ^ 2)If canellipse ThenPicture1.Circle (x0, y0), radius0, Not (Picture1.ForeColor)Picture1.Circle (x0, y0), radius, Not (Picture1.ForeColor)xnow = X: ynow = YEnd If' 铅笔Case 4If canpen ThenPicture1.Line -(X, Y), Picture1.ForeColorEnd If' 刷子Case 5If canbrush ThenPicture1.Line -(X, Y), Picture1.ForeColorEnd If' 油漆桶Case 6' do nothing' 放大镜Case 7If canenlarge ThenPicture1.Line (x0, y0)-(xnow, ynow), Not (Picture1.ForeColor), BPicture1.Line (x0, y0)-(X, Y), Not (Picture1.ForeColor), Bxnow = X: ynow = YEnd IfEnd SelectEnd SubPrivate Sub Picture1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)' 当鼠标放开时,对于选择不同的工具执行不同的操作 Select Case drawactCase 1canline = FalsePicture1.Line (x0, y0)-(xnow, ynow)Picture1.DrawMode = 13Picture1.Line (x0, y0)-(xnow, ynow), Picture1.ForeColorCase 2canrectangle = FalsePicture1.Line (x0, y0)-(xnow, ynow), Not (Picture1.ForeColor), BPicture1.DrawMode = 13Picture1.Line (x0, y0)-(xnow, ynow), Picture1.ForeColor, BCase 3canellipse = FalsePicture1.Circle (x0, y0), radius, Not (Picture1.ForeColor)Picture1.DrawMode = 13Picture1.Circle (x0, y0), radius, Picture1.ForeColorCase 4canpen = FalseCase 5canbrush = FalseCase 7canenlarge = FalsePicture1.Line (x0, y0)-(xnow, ynow), Not (Picture1.ForeColor), BIf (xnow - x0) * (ynow - y0) <> 0 ThenPicture3.PaintPicture Picture1.Image, 0, 0, Picture3.Width, Picture3.Height, x0, y0, (xnow - x0), (ynow - y0)Picture1.PaintPicture Picture3.Image, 0, 0End IfEnd SelectEnd SubPrivate Sub Picture2_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)' 通过point方法拾取颜色,并设定为前景色Picture1.ForeColor = Picture2.Point(X, Y)Label1.BackColor = Picture2.Point(X, Y)End SubPrivate Sub MNew_Click(Index As Integer)' 新建一个图画Picture1.Picture = LoadPicture()Filename = "Untitled"Form1.Caption = FilenameEnd SubPrivate Sub MSave_Click()' 设置过滤器CommonDialog1.Filter = "bmp文件|*.bmp|所有文件|*.*"' 设置缺省过滤器CommonDialog1.FilterIndex = 2If Filename = "Untitled" Then'如果文件尚未命名,则显示保存对话框CommonDialog1.ShowSaveFilename = CommonDialog1.FilenameIf Filename <> "" ThenSavePicture Picture1.Image, FilenameEnd IfElse'否则直接保存SavePicture Picture1.Image, FilenameEnd IfForm1.Caption = FilenameEnd SubPrivate Sub MExit_Click(Index As Integer)' 退出程序EndEnd Sub1.电脑上必须要先Microsoft Visual Studio(也就是VB软件)2.用VB软件设置窗口如上(图二)3.各个Command对应的VB代码如下:运行VB时,需要先打开SolidWorks一个新零件窗口,然后运行VB,点击界面按钮即可运行结果:完美实现对应功能。
MFC(Microsoft Foundation Class)是一组用于开发Windows桌面应用程序的C++类库。
在MFC中,您可以使用贝塞尔曲线来创建平滑曲线或路径。
贝塞尔曲线是一种数学曲线,通常用于绘制平滑的曲线或路径,其中包括四个控制点:起点、终点以及两个控制点。
以下是在MFC中使用贝塞尔曲线的基本步骤:1. **包含MFC头文件**:首先,在您的MFC应用程序中包含必要的头文件。
通常,您需要包含`afxwin.h`和`afxext.h`等头文件。
2. **创建CPoint对象**:为了定义贝塞尔曲线,您需要创建四个`CPoint`对象来表示起点、终点以及两个控制点。
```cppCPoint startPoint(x1, y1); // 起点坐标CPoint endPoint(x2, y2); // 终点坐标CPoint controlPoint1(x3, y3); // 控制点1坐标CPoint controlPoint2(x4, y4); // 控制点2坐标```3. **使用CDC对象绘制贝塞尔曲线**:MFC中的CDC(Device Context)对象用于绘制图形。
您可以使用CDC对象的`PolyBezier`方法来绘制贝塞尔曲线。
```cppCDC* pDC = GetDC(); // 获取设备上下文对象pDC->PolyBezier(startPoint, controlPoint1, controlPoint2, endPoint);ReleaseDC(pDC); // 释放设备上下文对象```上述代码使用`PolyBezier`方法绘制了一个贝塞尔曲线,其中`startPoint`是起点,`endPoint`是终点,`controlPoint1`和`controlPoint2`是控制点。
4. **刷新窗口**:如果在视图或对话框中进行绘制,通常需要在绘制之后调用`Invalidate`或`InvalidateRect`来请求重绘窗口,以使绘制的曲线可见。
VC入门教程vc入门教程一走进 Visual C++1 理解VC工程2 MFC编程特点3使用Wizard二 MFC 程序结构分析1 WINDOWS程序工作原理2 建立应用程序3 程序结构剖析3(1 类CMYAPP3(2 类CMAINFRAME3(3类CMyView与CMyDoc三深入MFC类库1 处理用户输入1(1 定义对话框资源1(2 定义对话框类2 有关屏幕输出2(1 设备上下文工作原理2(2 实例绘图原理剖析2(3 绘图操作实现2(4 有关屏幕映射方式3 文件处理3(1 对象持续化简述3(2 实例分析3(3 与文件处理关系密切的类CFile4 DAO技术4(1 DAO与ODBC4(2 使用MFC实现DAO技术5 打印5.1打印和显示5.2打印分页5.3 打印工作的开始和结束5.4 打印程序实例四、VC程序调试1(1 调试环境的建立1(2调试的一般过程1(3 如何设置断点1(4 控制程序的运行1(5 查看工具的使用2 高级调试技术2.1 TRACE 宏的利用2.2 ASSERT宏的利用2.3 ASSERT_VALID宏的利用以及类的AssertValid()成员函的重载2.4对象的DUMP函数的利用3 内存漏洞的检查五 Visual C++ 与多媒体1 对声音的处理1(1媒体控制接口1(2波形混音器2 多媒体文件I/O3多媒体图形图像技术;4图像合成;5 FLC动画;6热点;一走进 Visual C++Visual C++作为一个功能非常强大的可视化应用程序开发工具,是计算机界公认的最优秀的应用开发工具之一。
Microsoft的基本类库MFC使得开发Windows应用程序比以往任何时候都要容易。
本光盘教学软件的目的就是为了让你学会在Visual C++环境下,利用微软的基本类库MFC开发出功能强大的Windows应用程序。
在本章节的内容当中,我们将向您介绍使用VC开发软件需要用到的一些基本概念,使用MFC进行编程的基本特点,以及VISUAL C++集成开发环境提供的一系列编程辅助工具--WIZARD的使用方法。
VC++MFC类库基础(55讲全)视频保存在播⾳员⽹盘中内容简介:本部分是您成为VC++软件⼯程师必备的阶段,如果您没有任何基础,学习C++能快速让您进⼊编程领域,建议配合书籍《C++⼊门经典》关键词:VC++、VS2008、MFC、Office Fluent UI、CAD系统、结构化存储、⾃定义窗⼝、消息映射机制、多线程、CxImage库、Lua脚本引擎、MDI、对话框、软件设计、光栅图、⽮量图等。
本培训将实现的CAD系统介绍:本培训视频中要带领学员实现的CAD系统是⼀个简单的基于2D图形的CAD系统,拥有以下基本功能: 基本的⼏何图形(点、线、矩形、圆、位图等)绘制的功能;具有基本图像处理能⼒(依托CxImage库); 拥有基于脚本编程语⾔Lua脚本的命令输⼊环境;⾃定义格式的CAD⽮量图形⽂件;具有简单2D⽮量动画功能; 具有⾼可扩展性可作为较复杂的CAD系统的基本框架,学员可以以此为基础开发⼀些较实⽤的CAD 系统。
培训的主要⽬标:学员通过本次培训后,可以达到熟练使⽤VS2008环境及使⽤MFC进⾏编程的基本能⼒。
同时学员将具备建⽴较复杂软件开发框架的能⼒和基础。
课程学习完毕后学员还将具备基本的软件分析、设计、实现能⼒,并能够独⽴承担⼀些基于MFC的应⽤程序开发实现的任务;学员将牢固的掌握MFC窗⼝类、绘图类、集合类、调试类等的设计、使⽤⽅法;同时掌握使⽤VS2008调试程序、跟踪程序错误的技能;掌握使⽤VS2008性能分析⼯具分析分析软件性能瓶颈的⽅法;具备使⽤VS2008 MFC从事软件开发⼯作的能⼒。
达到⼀般公司VC++软件开发⼈员的基本能⼒要求。
本培训的主要任务:本次培训将通过带领学员⾃⼰动⼿实现⼀个简单的CAD系统(TinyCAD)的⽅式,达到上述的培训⽬标。
培训过程中学员将跟随讲师⼀步步实现⼀个基于MFC 及最新Office Fluent UI界⾯开发库的简单CAD系统(TinyCAD)。
首页 »软件开发 » VS2010/MFC编程入门之四十九(图形图像:CDC类及其屏幕绘图函数)VS2010/MFC编程入门之四十九(图形图像:CDC类及其屏幕绘图函数)分类标签: 编程入门VS2010VC++MFC上一节中鸡啄米讲了文本输出的知识,本节的主要内容是CDC类及其屏幕绘图函数。
CDC类简介CDC类是一个设备上下文类。
CDC类提供了用来处理显示器或打印机等设备上下文的成员函数,还有处理与窗口客户区关联的显示上下文的成员函数。
使用CDC的成员函数可以进行所有的绘图操作,包括处理绘图工具、GDI对象的选择、颜色和调色板的处理、获取和设置绘图属性、映射、窗口范围、坐标转换、剪切以及绘制直线、简单图形、椭圆和多边形等,另外它还为文本输出、处理字体、使用打印机跳转和滚动等提供了成员函数。
如上所述,CDC类几乎封装了所有的Windows GDI函数,另外,MFC中还有几个由CDC类派生的子类,包括CWindowDC、CPaintDC、CClientDC、CMetaFileDC,它们用来进行一些特定的绘图操作。
一般我们在使用完CDC对象后要记得删除它,否则会有内存泄露。
很多情况下我们可以调用CWnd::GetDC()函数来获取设备上下文指针,即CDC指针,这个时候记得用完后调用CWnd::ReleaseDC()函数释放设备上下文。
CDC类的屏幕绘图成员函数CDC类有很多成员函数,鸡啄米在这里只大概讲下比较常用的绘图函数,包括绘制点、直线、矩形、椭圆、多边形、文本以及位图等的成员函数。
COLORREF SetPixel(int x,int y,COLORREF crColor);COLORREF SetPixel(POINT point,COLORREF crColor);上面两个成员函数用来将指定坐标点的像素设置为指定的颜色,这样就实现了画点功能。
参数x为点的逻辑x坐标;参数y为点的逻辑y坐标;参数crColor为要为点设置的颜色;参数point指定点的逻辑x坐标和逻辑y坐标,可以为其传入POINT结构体变量或者CPoint对象。
如果你希望能够在自己的程序中表现出新意,那么你一定不会仅仅满足于MFC提供那些标准控件。
这时,我们就必须自己另外多做些工作了。
就改变控件外观这一点来说,主要是利用控件的自绘功能(Owner Draw)实现的。
本篇将和各位一起定义一个XP风格的CXPButton 按钮类,目的不在于介绍CXPButton类的使用技巧,而在于向各位阐述实现自绘按钮的方法。
当然如果你觉得CXPButton有用的话,也可以把它的源文件保存下来,直接加入到自己的项目中。
本篇要点:一、准备工作二、实现原理及难点三、按钮类的使用四、小结与提示五、附录一、准备工作在开始编码之前,首先应该确定好,更准确的说应该是设计好按钮在各种状态下的外观。
按钮控件的几中基本状态包括:Normal状态,就是按钮一开始显示时的样子。
Over状态,鼠标指针移动到按钮上面时按钮显示的样子。
Down状态,按下按钮时显示的样子。
Focus状态,按钮按下后松开的样子,例如标准按钮按下松开之后会看到按钮内部有一个虚线框。
Disable状态,当然就是按钮被设置成无效的时候的样子啦。
我参考了一下WindowsXP中普通按钮的实际样子,设计出XP按钮各种状态的外观,如下图所示:至于Down状态主要是在Over状态的基础上将文字往右下的方向稍微平移,以实现下压的效果。
二、实现原理及难点下面我们开始类的创建,在Workspace的ClassV iew页中右击列表树的根结点,选择New Class…在弹出窗口中进行派生类的定义,如下图所示,注意,你需要填写的只有Name和Base class 两项,其余的选项保持默认值就可以了。
按OK按钮退出之后,我们可以在ClassView里面看到新创建的类的名字。
接下来我们可以为CXPButton类添加各种成员变量。
因为自绘控件说穿了就是画图,所以在成员变量中可以看到各种与画图有关的数据类型,一般来说成员变量会在类的构造函数中初始化,在类的析构函数中销毁。
mfc笔记画线步骤一:在CMFC0420View中添加三个变量:CPoint m_ptOrigin;//起始点坐标bool m_bDragging; // 拖拽标记HCURSOR m_hCross;// 光标句柄步骤二:在CMFC0420View构造函数中初始化变量CMFC0420View::CMFC0420View(){// TODO: 在此处添加构造代码m_hCross = AfxGetApp()->LoadStandardCursor(IDC_CROSS);//获取十字光标句柄m_bDragging = false;//初始化拖拽标记}步骤三:在CMFC0420View类向导中添加消息OnLButtonDown,并进行设置(这个函数添加了以后就是CMFC0420View的成员函数了)void CMFC0420View::OnLButtonDown(UINT nFlags, CPoint point){// TODO: 在此添加消息处理程序代码和/或调用默认值SetCapture(); //捕捉鼠标::SetCursor(m_hCross); //设置十字光标m_ptOrigin =point;m_bDragging = TRUE; //设置拖拽标记//CView::OnLButtonDown(nFlags, point);}步骤四:在CMFC0420View类向导中添加消息OnMouseMove,并进行设置void CMFC0420View::OnMouseMove(UINT nFlags, CPoint point){// TODO: 在此添加消息处理程序代码和/或调用默认值if (m_bDragging){CClientDC dc(this);dc.MoveTo(m_ptOrigin);dc.LineTo(point); //绘制线段m_ptOrigin =point; //新的起始点}//CView::OnMouseMove(nFlags, point);}步骤四:在CMFC0420View类向导中添加消息,OnLButtonUp并进行设置void CMFC0420View::OnLButtonUp(UINT nFlags, CPoint point) {// TODO: 在此添加消息处理程序代码和/或调用默认值if(m_bDragging){m_bDragging = false; //清除拖拽标记ReleaseCapture(); //释放鼠标,还原鼠标形状}//CView::OnLButtonUp(nFlags, point);}步骤五:添加CCurve类,并进行如下定义和初始化#include<afxtempl.h>class CCurve{public:CCurve();virtual ~CCurve();void AddPoint(POINT pt){m_ptArray.Add(pt);}void Draw(CDC* pDC);protected:CArray<POINT, CONST POINT&>m_ptArray;};CCurve::CCurve(){m_ptArray.SetSize(0, 128);}CCurve::~CCurve(){}void CCurve::Draw(CDC* pDC){if (pDC){POINT *pDate = m_ptArray.GetData();int nDate = m_ptArray.GetSize();if (nDate<1)return;pDC->MoveTo(pDate[0]);for (int i = 1; i<nDate; i++){pDC->LineTo(pDate[i]);}//for}//if}步骤六:在CMFC0420Doc中添加成员变量和成员函数(加粗及下划线部分)class CMFC0420Doc : public CDocument{protected: // 仅从序列化创建CMFC0420Doc();DECLARE_DYNCREATE(CMFC0420Doc)// 特性public:CArray<CCurve*, CCurve*>m_CurveArray;// 操作public:void ADDCurve(CCurve *pCurve){m_CurveArray.Add(pCurve);void Draw(CDC*pDC);}void Draw(CDC* pDC);。
Visual C++/MFC初学教程目录+-- 第一章VC入门|------ 1.1 如何学好VC|------ 1.2 理解Windows消息机制|------ 1.3 利用Visual C++/MFC开发Windows程序的优势|------ 1.4 利用MFC进行开发的通用方法介绍|------ 1.5 MFC中常用类,宏,函数介绍+-- 第二章图形输出|------ 2.1 和GUI有关的各种对象|------ 2.2 在窗口中输出文字|------ 2.3 使用点,刷子,笔进行绘图|------ 2.4 在窗口中绘制设备相关位图,图标,设备无关位图|------ 2.5 使用各种映射方式|------ 2.6 多边形和剪贴区域+-- 第三章文档视结构|------ 3.1 文档视图框架窗口间的关系和消息传送规律|------ 3.2 接收用户输入|------ 3.3 使用菜单|------ 3.4 文档,视,框架之间相互作用|------ 3.5 利用序列化进行文件读写|------ 3.6 MFC中所提供的各种视类介绍+-- 第四章窗口控件|------ 4.1 Button|------ 4.2 Static Box|------ 4.3 Edit Box|------ 4.4 Scroll Bar|------ 4.5 List Box/Check List Box|------ 4.6 Combo Box/Combo Box Ex|------ 4.7 Tree Ctrl|------ 4.8 List Ctrl|------ 4.9 Tab Ctrl|------ 4.A Tool Bar|------ 4.B Status Bar|------ 4.C Dialog Bar|------ 4.D 利用AppWizard创建并使用ToolBar StatusBar Dialog Bar |------ 4.E General Window|------ 4.F 关于WM_NOTIFY的使用方法+-- 第五章对话框|------ 5.1 使用资源编辑器编辑对话框|------ 5.2 创建有模式对话框|------ 5.3 创建无模式对话框|------ 5.4 在对话框中进行消息映射|------ 5.5 在对话框中进行数据交换和数据检查|------ 5.6 使用属性对话框|------ 5.7 使用通用对话框|------ 5.8 建立以对话框为基础的应用|------ 5.9 使用对话框作为子窗口+-- 第六章网络通信开发|------ 6.1 WinSock介绍|------ 6.2 利用WinSock进行无连接的通信+------ 6.3 利用WinSock建立有连接的通信1.1 如何学好VC这个问题很多朋友都问过我,当然流汗是必须的,但同时如果按照某种思路进行有计划的学习就会起到更好的效果。
#include #include #include #pragma comment(lib, "winmm.lib") #include
//???????????????????????????????????????// HANDLE hConsole;
/*全局变量*********************************************************/ //Music #define MMM "e:\\\\Music\\\\" #define MP3 ".mp3" //结构体中分量数组 #define MAXTITL 20 #define MAXAUTL 20 #define MAXCATE 20 #define MAXTIME 20 #define MAXHOUS 20 #define MAXID 20 #define MAXDAY 20 #define MAXMUSI 20 #define MAX 20 //各分量长度中的最大值 //文件名 #define FILENAME "e:\\bookinformation.txt" //全部图书信息 #define FILEBOOKIN "e:\\bookin.txt" //入库图书信息 #define FILEBOOKOUT "e:\\bookout.txt" //出库图书信息
//子函数声明 void music1( char *); //打开关联音乐 void closemusic1( char *); //关闭关联音乐
int Return(); //返回上一菜单 int insert_record( char *fileName, void *newRecord, int recordLength );//存盘 /*录入图书信息******************************************************/ int inputId( char *stringId); //ID录入 int inputTitle( char *stringTitle ); //书名录入 int inputAuthor( char *stringAuthor ); //作者录入 int inputCate( char *stringCate ); //书籍类型录入 int inputTime( char *stringTime ); //出版社录入 int inputHouse( char *stringHOUS ); //出版时间录入 int findRecord_bk_Id( char *fileName, char *bk_title, struct book *bk ); //以Id为关键字在[bookinformation]文件中查找是否已存在相关信息
/*修改图书信息****************************************************/ void edit_record(); //修改(主) int updata_record( char *fileName, char *newRecord, int recordNo, int recordLength ); //修改(子):将修改过的信息写入文件 int T_Edit( char *stringTitle ); //输入要修改信息的的书的名字,并在文件中查找是否已存在该书的相关信息
int edit_Title( char *searcTitle, char *alter, int RecNo ); //修改书名 int edit_Author( char *searcTitle, char *alter, int RecNo ); //修改作者 int edit_Cate( char *searcTitle, char *alter, int RecNo ); //修改分类 int edit_House( char *searcTitle, char *alter, int RecNo ); //修改出版社 int edit_Time( char *searcTitle, char *alter, int RecNo ); //修改出版日期
/*删除图书信息***************************************************/ void dele_main();//删除的主函数 int T_Dele( char *stringTitle ); //输入要删除信息的的书的名字,并在文件中查找是否已存在该书的相关信息 int delete_record( char *fileName, int recordNo, int recordLength ); //删除的子函数,将要删除的信息删除掉
/*查询图书信息*******************************************************/ //查询主函数 void search_main();
void searchBook(); //以 书 名 为关键字查询 void searchAuthor(); //以 作 者 为关键字查询 void searchCate(); //以 类 型 为关键字查询 void searchHouse(); //以 出版社 为关键字查询 void searchId(); //以 I D 为关键字查询
int getid( char *fileName, char *bk_id, struct book *bk ); //查询 I D 是否在文件中是否已经存在 int gettitle( char *fileName, char *bk_title, struct book *bk ); //查询 书 名 是否在文件中是否已经存在 int getauthor( char *fileName, char *bk_author, struct book *bk, int booknumber ); //查询 作 者 是否在文件中是否已经存在 int getcategorie( char *fileName, char *bk_categorie, struct book *bk ); //查询 类 型 是否在文件中是否已经存在 int gethouse( char *fileName, char *bk_house, struct book *bk ); //查询 出版社 是否在文件中是否已经存在 /*流水账************************************************************/ //流水账主函数 void water_main();
void bookIn(); //书籍入库 void bookOut(); //书籍出库
int inputDay( char *stringDay); //日期录入 //流水查询主函数 void search_watermain();
int search_wId(); //以 I D 为关键字查询 int search_wDay(); //以 日期 为关键字查询
int findRecord_w_Id( char *fileName, char *w_id, struct water *w ); //以Id为关键字在[出入库]文件中查找是否已存在相关信息 int findRecord_w_Day( char *fileName, char *w_Day, struct water *w ); //以Day为关键字在[出入库]文件中查找是否已存在相关信息
/*录入结构体*********************************************/ struct book { //图书信息 char id[MAXID]; char title[MAXTITL]; char author[MAXAUTL]; char categorie[MAXCATE]; char time[MAXTIME]; int stock; char house[MAXHOUS]; char music[MAXMUSI]; };
struct water { //流水账 char day[MAXDAY]; char Id[MAXID]; char titleEnter[MAXTITL]; int InOut; //入(出)库量 };
//定位 void gotoxy(int x, int y) { COORD coord; coord.X = x; coord.Y = y; SetConsoleCursorPosition(hConsole, coord); }
//111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 //111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
//ID录入 int inputId( char *stringId ) { int iFlag = 0;
while( 1 ){ if( *stringId == 'q' ){ iFlag = 999; break; } else if( strlen( stringId ) > 0 && strlen( stringId ) <= MAXID ){ iFlag = 1; break; } else break; } return( iFlag ); }
//书名录入 int inputTitle( char *stringTitle ) { int iFlag = 0;
while( 1 ){ if( *stringTitle == 'q' ){