ImageVerifierCode 换一换
格式:DOCX , 页数:15 ,大小:24.48KB ,
资源ID:14956573      下载积分:5 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-14956573.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(VC++课程设计.docx)为本站会员(b****1)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

VC++课程设计.docx

1、VC+课程设计Vc+简单的画图软件的制作1.工程的新建 打开 Microsoft Visual C+ 6.0 点击 File New 在 Projects 中选择 MFC AppWizard (exe) ; 在 Project name 中输入工程的名字 Graphic,在 Location 中选 择工程存放的路径。填完后点击 OK 按钮。(如图 1)填完后点击 OK 按钮,弹出对话 框(如图 2)。在弹出来的对话框中我们可以选择生成三种不同类型的应用程序:单 文档、多文档、对话框。 单文档程序如记事本,在一个应用程序中只能对一个文档进行操作,降低了编 程的复杂度并减少了运行程序时所需的资源。

2、对某些小型应用(比如文本编辑器或 小型图像编辑器)可以采用这种类型的窗口应用程序。 多文档程序如 PhotoShop,在一个应用程序中可以同时对多个文档进行操作; 对话框程序如 QQ,应用程序的界面是对话框形式的。现对话框版本的程序更小一 些。除了节省资源外,对话框版本的应用程序的加载速度也更快些。基于对话框的 应用程序比完成相同功能的基于窗口的应用程序更简单有效。 这里我们选第一个:单文档。 选择完后点击 Next,设置默认,最后点击 Finish 完成工程的创建。1.1添加消息响应函数 系统为我们生成了一个程序的框架,但是这个框架完成不了什么具体的功能。 为了使程序程序完成我们想要做的事,

3、我们要向这个框架中加入一些代码。 VC+ 程序的运行并不像 C 语言是按照顺序运行下来的。每当我们完成一个事件,系统就 会发出特定的消息,程序就会跳到相应的消息响应函数中执行里面的代码。单击菜 单中的 View-Class Wizard(或按快捷键 Ctrl+W) ,将会弹出 MFC Class Wizard 对话框。在 Class Name 中选择 CView,在 Messages 中选择 WM_LBUTTONDBLCLK,点 击右边的 Add Function 按键。这样我们就为程序添加了鼠标左键双击的消息响应 函数, 函数名为 OnLButtonDblClk(UINT nFlags, C

4、Point point)。 我们点击 Edit Code 按键就可以进入消息响应函数中。 我们在消息响应函数中添加如下代码: AfxMessageBox(“Hello Word!”); 运行程序! 当我们在客户区中双击鼠标左键时, 我们可以看到效果(如图 5) 我们在完成双击鼠标左键这个事件后,Windows 便 。 会发出 WM_LBUTTONDBLCLK 这条消息。我们的程序收到这个消息后,就会跳转到鼠 标左键双击的消息响应函数内,执行里面的代码。 同样的,我们可以添加其他的 消 息 响 应 函 数 , 如 鼠 标 左 键 按 下 , 抬 起 , 鼠 标 移 动 等 (WM_LBUTTON

5、UP 、 WM_LBUTTONDOWN、WM_MOUSEMOVE 等)。我们程序就是在这样的消息响应机制下运行 的。1.2资源视图管理器 在 ResoureView 里,我们可以编辑对话框、菜单、工具条、快捷键等资源。 点 开 Menu,可以看到一个 ID 为 IDR_MAINFRAME 的菜单。ID 是一个标识,实际上是一 个 无 符 号 整 型 常 量 , 每 一 个 资 源 在 程 序 中 都 有 一 个 唯 一 的 ID 号 。 双 击 IDR_MAINFRAME, 在右边的视图中双击帮助右边的虚线框, 弹出菜单属性, Caption 在 中输入“画图” ,并将其关闭。双击画图菜单下面

6、出现虚线框,在 caption 中输入 “画线”后将其关闭。双击画线,在弹出的菜单属性中 ID栏的 ID_MENUITEM32775 改成 ID_MENUITEM_LINE。同样方法在建一个“画圆”菜单项。注意:每个资源对应 一个 ID 号,ID 号的命名全部用大写字母,且要符合匈牙利命名法。我们为新的菜 单项起名, 如果我们选择了 Pop-up, 生成的菜单就还有下级子菜单; 如果没有选择, 菜单就没有下级菜单。我们同样可以在 Class Wizard 中为我们生成的菜单添加响 应。 在 Class Wizard 中的 Object IDs 中选中菜单的 ID 号,Messages 中选择

7、COMMOND,然后点击 Add Function。这样,我们就为新建的菜单添加了点击的响应, 我们同样可以点击 Edit Code 编辑消息响应函数。1.3设备环境 CDC 是设备环境类的基类直接由 CObject 派生。是 GDI 的关键元素,它代表了 物理设备。每一个 C+设备环境对象都有相对应 Windows 设备环境,并通过一个 32 位类型的 HDC 句柄来标识。CDC 类的虚拟性使我们可以很容易的做到编写同时适用 于多种设备的代码。 使用 CDC 类可以使我们的作图不用关心设备的问题。CClientDC 和 CWindowDC 是显示设备环境类,都是由 CDC 派生而来,区别在于

8、 CClientDC 是窗 口的客户区不包括边框、 标题栏和菜单栏, (0, 指客户区域的左上角。 0) CWindowDC 的(0,0)指整个屏幕的左上角,这意味着我们可以在显示器的任意地方绘图,包 括窗口边框、标题栏和菜单栏等等。CWindowDC 一般应用在框架窗口,而不是视图 窗口。 CDC 对象被创建后一定要在合适的时候将它删除掉,如果忘记了删除设备环 境对象则会造成内存丢失。 在每次绘图前,我们要获取设备环境,我们可以使用 CDC* GetDC ( ) 函数来获 取设备环境。在绘图完成后,使用 void ReleaseDC(CDC* pDC ) 函数释放设备环境。2.简易画图板的制

9、作 2.1 设计目的 设计一个单文档类型的 MFC AppWizard (exe)工程,工程取名为:Graphic。此 程序将实现简单的绘图功能,包括点、直线、矩形、椭圆、扇形和连续线的绘制。 并且能实现绘图的控制,包括线宽、线型和颜色的设置,图形的保存和打开以及笔 刷的使用。 2.2 总体设计 首先,新建一个单文档类型的 MFC AppWizard (exe)工程,工程取名为:Graphic。 为此程序添加一个子菜单,菜单名称为“绘图” ,并为其添加六个菜单项,分别用 来控制不同图形的绘制。当用户选择其中的一个菜单项后,程序将按照当前的选择 进行相应图形的绘制。添加的六个菜单项的 ID 及名

10、称如表 1 所示。然后分别为这 六个菜单项添加命令响应, 本程序让视类(CGraphicView)对这些菜单命令进行响应, 在程序运行以后,当用户单击某个菜单项时,应该把用户的选择保存起来,以 便随后的绘图操作使用。 因此在 CGraphicView 类中添加一个私有变量 m_nDrawType; 用来保存用户的选择,该变量的定义如下所述: private: UINT m_nDrawType; 接着,在视类的构造函数中将此变量初始化为 0,程序代码如下: CGraphicView:CGraphicView() / TODO: add construction code here m_nDraw

11、Type=0; 利用 switch/case 语句,来分别完成相应图形的绘制。当用户选择【绘图】菜单 下的不同子菜单项时,将变量 m_nDrawType 设置为不同的值。程序代码如下: void CGraphicView:OnDot() / TODO: Add your command handler code here m_nDrawType=1; void CGraphicView:OnLine() / TODO: Add your command handler code here m_nDrawType=2; void CGraphicView:OnRectangle() / TODO

12、: Add your command handler code here m_nDrawType=3; void CGraphicView:OnEllipse() / TODO: Add your command handler code here m_nDrawType=4; void CGraphicView:OnShanxing() / TODO: Add your command handler code here m_nDrawType=5; void CGraphicView:OnLianxuxian() / TODO: Add your command handler code

13、here m_nDrawType=6; 2.3 点、直线、矩形、椭圆的绘制 对于直线、矩形和椭圆,在绘制时都可有两点来确定其图形。当鼠标左击时得 到一个点,当鼠标左键松开时得到另外一个点。为视类 CGraphicView 分别捕获鼠 标左键按下和弹起这两个消息。另外当鼠标左键按下时,需要将鼠标当前按下点保 存, 因此我们为 CGraphicView 再增加一个 CPoint 类型的私有成员变量: m_ptOrigin, 在视类的构造函数中将此变量初始化为 0。在鼠标按下消息响应函数中,保存该点, 代码如下: void CGraphicView:OnLButtonDown(UINT nFlags

14、, CPoint point) / TODO: Add your message handler code here and/or call default m_ptOrigin=point; 在鼠标左键弹起消息响应函数中实现绘图,代码如下: void CGraphicView:OnLButtonUp(UINT nFlags, CPoint point) /保存鼠标按下得到点,也是绘制一个点 CView:OnLButtonDown(nFlags, point);/ TODO: Add your message handler code here and/or call default /创建并

15、获得设备描述 CClientDC dc(this); switch (m_nDrawType) case 1: dc.SetPixel(point,RGB(255,0,0)); /*绘制点*/ break; case 2: dc.MoveTo(m_ptOrigin);/*调用 MoveTo 函数移动到原点*/ dc.LineTo(point);/*调用 LineTo 函数绘制到终点。*/ break; case 3: break; case 4: break; CView:OnLButtonUp(nFlags, point); 在上述程序中,设置一个点,用到的函数是 SetPixel,这也是

16、CDC 类的一个成 员方法, 该函数的生命形式如下: COLORREF SetPixel (POINT point, COLORREF ;该函数是在指定的点设置一个像素。其中第一个参数(point)是指定的 crColor) 点,第二个参数(crColor)是指定的颜色。在程序中设定的颜色在系统颜色表中可 能不存在,但系统会选择一种和这个颜色最接近的颜色。RGB 是一个宏,它有三个 参数, 分别代表红、 蓝三种颜色的值。 绿、 这三个参数 BYTE 类型, 取值范围为 0255。 RGB(0,0,0)是黑色,RGB(255,255,255)是白色,将这三个分量设置成为 0255 之间的任意值,

17、从而得到各种不同的颜色。这里的 RGB(255,0,0)是红色。 绘制直线时,首先调用 MoveTo 函数移动到原点,然后调用 LineTo 函数绘制到 终点。 绘 制 矩 形 时 使 用 Rectangle 函 数 , 该 函 数 声 明 形 式 为 : BOOL Rectangle (LPCRECT lpRect) ; 该函数有一个指向 Crect 对象的参数,后者可以利用两个点来构造。需要注意的是 而上述代码中传递的却是 Crect 对象, 但运 该函数需要的是指向 Crect 对象的指针, dc.Rectangle(CRect(m_ptOrigin,point); dc.Ellipse

18、(CRect(m_ptOrigin,point);行编译时也能成功通过,运行时也不会报错,这是为什么呢?我们知道 C 系列的语 言都是强类型语言,如果类型不匹配的话,需要进行强制类型转换。但这里为什么 没有进行这样的强制类型转换程序也可以通过呢?实际上,Crect 类提供了这样一 个成员函数:重载 LPCRECT 操作符,其作用是将 Crect 转换为 LPCRECT 类型。 因此,当在程序中给 Rectangle 函数的参数赋值时,如果它发现该参数是一个 Crect 对象,它就会隐式地调用 LPCRECT 操作符,将 Crect 类型的对象转换为 LPRECT 类型。因此,在给函数传递参数时

19、,如果我们看到的传递的数值类型和所需要的类 型不匹配,但编译和运行都正确的情况时,就要想想这其中的缘由了。当然,有的 情况下可能是这些类型之间本来就可以互相转换,例如 short 类型和 int 类型。但是 参数是对象类的话,就要考虑了,它选择的对象的构造方法进行的隐式转换,还是 有其他重载的操作符。 当用户选择椭圆菜单项时,调用 Ellipes 函数绘制一个椭圆。 2.4连续线和扇形的绘制 Windows 系统为我们提供了一个画图程序,在该程序中,利用画笔可以绘制连 续的线条,下面我们设计绘制连续线和扇形。 为了绘制连续的线条,首先要得到线条的起点,这在前面已经实现。然后需要 捕获鼠标移动过

20、程中的每一个点,这可以通过捕获鼠标移动消息 (WM_MOUSEMOVE)来实现。在此消息响应函数中,在依次捕获的各个点之间 绘制一条条非常短的线段,从而就可以绘制出一条连续的线条。 遵照这一思路,我们开始增加程序的功能。首先为视类增加鼠标移动消息 (WM_MOUSEMOVE)的响应函数(OnMouseMove) 。这样,只要鼠标在应用程 序窗口中移动时都会进入到这个消息响应函数中。但这并不是我们所期望的,我们 希望在鼠标左键按下后开始绘图。因此,我们需要有一个变量来表示鼠标左键是否 按下这一状态,然后在鼠标移动消息响应函数中对这一变量进行判断。当此变量为 真,即鼠标左键已经按下去,我们开始绘图

21、。于是,为视类添加一个 BOOL 型的私 有变量 m_bDraw,当鼠标左键按下去时,此变量为真;当鼠标左键弹起时,此变量 为假,这时,我们就不再绘制线条了。该变量在视类头文件中的定义代码如下: Private: BOOL m_bDraw; 接下来在视类的构造函数中,将此变量初始化为 FALSE。 m_bdraw=FALSE; 当鼠标左键按下去时,在视类的 OnLButtonDown 函数中将此变量初始化为 TRUE。 m_bdraw=TRUE; 当鼠标左键弹起时,在视类的 OnLButton 函数中将此变量初始化为假。 m_bdraw=FALSE; 然后在 OnMouseMove 函数中首先

22、对 m_bdraw 变量进行判断,如果其值为真, 说明鼠标左键已经按下去了,这时就可开始进行画线操作。还有一点需要注意,因 为每绘制一条线段后,下次应该从这条线段的终点开始继续绘制。因此,绘制完当 前线段后,应该修改线段的起点,将当前线段的终点作为下一条线段的起点,程序 代码如下: void CGraphicView:OnMouseMove(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default /创建并获得设备描述 CClientDC dc(this); /创建宽度为

23、1 的实线红色画笔 CPen pen (PS_SOLID, 1, RGB(255,0,0)); /把创建的画笔选入设备描述 CPen *pOldpen=dc.SelectObject(&pen); if(m_bDraw=true) dc.MoveTo(m_ptOrigin); dc.LineTo(point); /修改线段的起点 m_ptOrigin=point; /恢复设备描述 dc.SelectObject(pOldpen); CView:OnMouseMove(nFlags, point); 如果在上面绘制连续线条的程序中,保持每段小直线的起点不变,即以鼠标左 键按下时的起点为起点不变,

24、分别绘制到鼠标移动点的直线,这时就会出现扇形的 效果。也就是去掉上述代码 OnMouseMove 函数中修改线段起点的代码。程序代码 如下:void CGraphicView:OnMouseMove(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default /创建并获得设备描述 CClientDC dc(this); /创建宽度为 1 的实线红色画笔 CPen pen (PS_SOLID, 1, RGB(255,0,0)); /把创建的画笔选入设备描述 CPen *pOld

25、pen=dc.SelectObject(&pen); if(m_bDraw=true) dc.MoveTo(m_ptOrigin); dc.LineTo(point); /恢复设备描述 dc.SelectObject(pOldpen); CView:OnMouseMove(nFlags, point); 2.5画刷 再为此程序添加一个子菜单,菜单名称为“画刷” ,并为其添加三个菜单项, 分别用来控制不同的画刷。 MFC 提供了一个 CBrush 类,可以用来创建画刷对象。画刷通常用来填充一块 区域。 简单画刷、位图画刷、透明画刷,程序代码如下: void CDrawView:OnLButton

26、Up(UINT nFlags, CPoint point) /创建一个红色画刷 CBrush brush(RGB(255,0,0); /创建并获得设备描述表 CClientDC dc(this); /利用红色画刷填充鼠标拖曳过程中形成的矩形区域dc.FillRect(CRect(m_ptOrigin,point),&brush); /创建位图对象 CBitmap bitmap; /加载位图资源 bitmap.LoadBitmap(IDB_BITMAP1); /创建位图画刷 CBrush brush(&bitmap); /创建并获得设备描述表 CClientDC dc(this); /利用红色画

27、刷填充鼠标拖曳过程中形成的矩形区域 dc.FillRect(CRect(m_ptOrigin,point),&brush); /创建并获得设备描述表 CClientDC dc(this); /创建一个空画刷 CBrush /将空画刷选入设备描述表 CBrush *pOldBrush = dc.SelectObject(pBrush); /绘制一个矩形 dc.Rectangle(CRect(m_ptOrigin,point); /恢复先前的画刷 dc.SelectObject(pOldBrush); m_bDraw = FALSE; CView:OnLButtonUp(nFlags, point

28、); 在简单画刷程序中,首先创建一个红色画刷;接着创建设备描述表对象;然后 调用设备描述表对象的成员函数 FillRect,利用指定的画刷填充一块指定的矩形区 域,而鼠标拖动过程中的起点和终点就决定了需要填充的矩形区域,因此,代码中 通过 CRect 类利用鼠标拖动的起点和终点构造了这快矩形区域。CRect 类提供了多 个构造函数,这里使用的是下面这种构造函数,即通过指定矩形区域的左上角和右 下角这两个点来构造一块矩形区域。 CRect(POINT topLeft,POINT bottomRight) ; 代码中的 CDC 类的成员函数 FillRect,该函数的功能是用指定的画刷填充一个 *

29、pBrushCBrush:FromHandle(HBRUSH)GetStockObject(NULL_BRUSH);矩形。该函数将填充全部的矩形,包括上左边界,但不填充右底边界。FillRect 函 数的声明如下: void FillRect (LPCRECT lpRect,CBrush* pBrush) ; 该函数有两个参数,lpRect 是指向一个 RECT 结构体或 CRect 对象的指针,该 结构体或对象中包含了要填充的矩形的逻辑坐标。 pBrush 是指向用于填充矩形的画 刷对象的指针。 在位图画刷程序中,CBrush 类有下面这样一种构造函数。 CBrush (CBitmap* p

30、Bitmap) ; 该构造函数要求一个 CBitmap 类型的指针,CBitmap 类是位图类,于是我们就 会这样想:利用这个构造函数是否就可以创建一个位图画刷呢?事实确实如此。创 建 CBitmap 对象时,仅调用其构造函数并不能得到一个有用的位图对象,还需要调 用一个初始化函数来初始化这个位图对象。CBitmap 类提供了多个初始化函数,例 如,LoadBitmap、CreateBitmap、BitmapIndirect 等。这里用 LoadBitmap 函数来加载 一副位图,该函数的声明如下: BOOL LoadBitmap (LPCTSTR lpszResourceName) ; BO

31、OL LoadBitmap (UINT nIDResource) ; 其中第二种声明需要一个资源 ID 作为参数。首先给程序增加一个位图资源。 为一个工程创建资源有多种实现方法,其中一种方法可以利用【Insert】菜单下的 【Resource】命令,在弹出的对话框中选择 Bitmap 资源类型,单击【New】按钮, 即可创建一个默认名称为 IDB_BITMAP1 的位图资源,并在 VC+集成开发环境右 边的代码编辑区中打开位图编辑器。可以利用编辑器右边的调色板和绘图工具来编 辑位图资源,还可以通过拉伸位图编辑器中网格周围的蓝色方点来调整位图的大 小。 在透明画刷程序中,我们利用 GetStoc

32、kObject 这个函数来获取一个黑色或白色 的画刷句柄。 这个函数是否能够获得一个透明画刷句柄呢?从 MSND 提供的帮助信 息中,可以看到该函数的参数取值之一可以是 NULL_BRUSH,以获取一个空画刷。 那么,这个空画刷是否就是我们所需要的透明画刷呢?结论是正确的。 但这时存在一个问题,我们获取的是句柄,而在进行绘制操作时需要的是一个 画刷对象。如何从画刷句柄转换为画刷对象呢?CBrush 类提供了一个 FromHandle 函数来实现这样的功能。该函数的声明如下: Static CDC* PASCAL FromHandle(HDC hDC) ;5.部分源代码void CMyPaintView:OnLButtonDown(UINT nFlags, CPoint point) this-SetCapture(); /捕获鼠标 HCURSOR cross=LoadCursor(NULL , IDC_CROSS); SetCursor(cross); m_bDrawing=true; /开始画图 m_ptPrev=point; m

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2