dfs_service_青岛理工大学_第1页
dfs_service_青岛理工大学_第2页
dfs_service_青岛理工大学_第3页
dfs_service_青岛理工大学_第4页
dfs_service_青岛理工大学_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、青岛理工大学设计名称: C+面向对象程序设计 设计题目: MFC开发拼图游戏项目设计 学生学号: 201107171 专业班级: 2012级网络工程二班 学生姓名: 熊峰 指导教师: 任凤华 课题工作时间: 2014年6月 目 录目 录I摘 要IIAbstractIII第一章 绪论- -1.1引言- -1.1.1课题背景- -1.1.2课题意义- -1.1.3主要要求- -1.1.4理论依据与工作内容- -第二章 设计方案论述-2.1项目方案论述- -第三章 详细设计- -3.1 详细设计过程(包含关键代码及截图)- -3.1.1 创建初始界面- -3.1.2 位图的读入和显示- -3.1.3

2、 用(Picture)Static控件显示位图- -第四章 设计结果及分析- -4.1 程序测试- -总 结- -致 谢- - 摘 要 拼图游戏是一种有趣好玩的益智游戏,其核心规则是将一张整图分成N小块,随机打乱,让用户拼回原图,根据用户所花费的时间和步数的多少来评价其玩游戏的水平。现在通过已学的MFC Windows应用程序设计知识,开发一个MFC应用程序,该程序提供两种游戏模式:简单和困难。在程序中已经加入几副图片供用户娱乐。此外,它还允许用户自行添加图片。 运用的知识点主要包括对话框和控件的应用、文档串行化和打印技术、Visual C+位图操作以及综合应用各种可视化元素和交互技术。整个项

3、目完成时将得到一个具有把图片随机分割再由用户拼接的游戏程序。当拼图成功,程序将在状态栏给出提示信息和所花费的时间,用户可以选择另外一幅图片重新开始游戏或者选择退出。 第一章 绪论1.1引言1.1.1课题背景随着IT行业的迅猛发展,计算机应用开始由数据、事物处理转向娱乐,这样就为电脑游戏的产生提供一个良好的基础。例如现在有不少的网络游戏,但更多的是单机小游戏。拼图游戏就是其中一种。所谓拼图游戏是指将一张完整的图分成N小块,随机打乱,让用户拼回原图,根据用户所花费的时间和步数的多少来评价其玩游戏的水平的一种游戏。这样一个益智游戏可以放松用户绷紧的神经,锻炼用户的思维能力与逻辑能力。1.1.2课题意

4、义通过开发该拼图游戏,熟练掌握对话框和常用控件的应用,掌握综合应用各种可视化元素和交互技术实现一个典型的Windows 应用程序。希望通过本次开发过程,进一步的掌握调试程序的技能,寻找错误,丰富编程经验,提升编写MFC程序的能力。1.1.3主要要求运行程序后,开始游戏。1.用户可以选择应用程序提供的位图资源或自定义的位图作为游戏使用的图片。2.用户可以选择游戏的难度,若选择“简单”,程序将图片分成9块;若选择“困难”则分成16块。3.单击“重置”菜单项会重新游戏。单击任一图格,图像将随机排列;用户可单击空格周围的图格来改变其位置。4.用户在游戏时可以通过单击“提示”菜单项来查看当前图片的缩略图

5、。5.拼图成功,程序将在状态栏给出提示信息和所花费的时间,用户可以选择另外一幅图片重新开始游戏或者退出程序。1.1.4理论依据与工作内容理论依据:该程序基于对话框程序组成(包括一个菜单栏,状态栏和显示游戏图片的游戏区),主要利用对话框文档上的菜单项来执行各个功能,如:重置、更换位图、自行加载位图。在CPictureDlg类里面添加成员函数和变量来实现各个功能。工作内容:在基于对话框的工程中加入菜单操作、用代码操纵菜单、Windows位图文件的基本结构、Visual C+中对位图资源的操作、Visual C+中对自定义位图文件的操作、设备相关位图(DDB)的概念、用Static 控件显示位图以及

6、用Status Bar显示提示信息和Visual C+随机函数该程序。第二章 设计方案论述2.1.1具体论述1.CMenu* GetSubMenu(int nPos) 若弹出菜单位于指定的位置,则返回CMenu 对象的指针,其中CMenu对象要包含弹出菜单的句柄;否则返回NULL。如果CMenu 对象不存在,那么将创建临时CMenu对象,但返回的CMenu指针不应被存储。nPos指定包含在菜单中的弹出菜单的位置。对于第一个菜单项,开始位置值为0。2.BOOL AppendMenu(UINT nFlags, UINT nIDNewItem=0, LPCTSTR lpszNewItem= NULL

7、) 在末尾添加一项,若nFlags为MF_SEPARATOR表示增加一个分隔条,这样其他两个参数将会被忽略;若nFlag为MF_STRING表示添加一个菜单项。nIDNewItem为该菜单的ID命令值;若nIDNewItem为MF_POPUP表示添加一个弹出菜单项,这时nIDNewItem为另一菜单的句柄HMENU。lpszNewItem为菜单文字说明。3.BOOL InsertMenu(UINT nPosition,UINT nFlags ,UINT nIDNewItem = 0,LPCTSTR lpszNewItem = NULL) 用于在指定位置插入一菜单,变量nPosition指定插入

8、位置。如果nFlags 包含MF_BYPOSITION 则表明插入在nPosition 位置, 如果包含MF_BYCOMMAND表示插入在ID为nPosition的菜单处。4.BOOL ModifyMenu(UINT nPosition, UINT nFlags, UINT nIDNewItem=0 ,LPCTSTR lpszNewItem = NULL) 用于修改某一位置的菜单,如果nFlags包含MF_BYPOSITION,则表明修改nPosition位置的菜单,如果包含MF_BYCOMMAND表示修改ID为nPosition处的菜单。5.BOOL RemoveMenu(UINT nPos

9、ition, UINT nFlags) 用于删除某一位置的菜单。如 果 nFlags 包含MF_BYPOSITION 则表明删除nPosition 位置的菜单, 如果包含MF_BYCOMMAND表示删除ID为nPosition处的菜单。6.BOOL AppendMenu(UINT nFlags, UINT nIDNewItem, const CBitmap* pBmp) 和BOOL InsertMenu(UINT nPosition, UINT nFlags, UINT nIDNewItem, const CBitmap* pBmp)可以添加位图菜单,但这样的菜单在选中时是反色显示,并不美观。

10、7.UINT CheckMenuItem(UINT nIDCheckItem, UINT nCheck) 返回菜单项以前的状态: MF_CHECKED 或MF_UNCHECKED 。如果该菜单项不存在, 那么将返回0xFFFFFFFF。nIDCheckItem指定由nCheck确定的将要选择的菜单项。nCheck指定是否选中菜单项, 并决定菜单中各菜单项的位置。参数nCheck可以是MF_CHECKED或MF_UNCHECKED与MF_BYPOSITION或MF_BYCOM MAND的组合。这些标志可通过使用位与运算进行组合。其中MF_CHECKED与MF_UNCHECKED用来进行状态转换,

11、在菜单项之前放置默认的选中标记。简而言之,调用一系列函数将游戏启动(初始化变量)、选择位图、加载位图、游戏模式选择(位图分割)、小块图片随机排序、静态控件显示位图等一系列操作连接起来。 第三章 详细设计3.1 详细设计过程(包含关键代码及截图)3.1.1 创建初始界面新建一个MFC AppWizard(exe)工程,将其命名为Picture,在第一步选择Dialog based,如图3-1所示,接下来直接点Finish。在菜单栏中点击Insert->Resource->Menu->New,新建菜单项。添加如图的菜单。添加菜单项各个菜单项的ID、Caption如图所示。以上完成

12、后,右击打开对话框的属性(Properties),将对话框的ID号设为IDD_PICTURE_DIALOG,Caption设置为“拼图游戏”,并为Menu属性对应的下拉框选择IDR_MENU1,这样菜单就可以在程序运行时显示在主对话框的顶部了。在对话框的属性中选中Minimize box以实现对话框的最小化,如图。这时运行程序,运行结果如图所示。在ClassView标签中为CPictureDlg类添加两个CMenu类型的成员变量CMenu类为Windows HMENU的封装类。它提花了成员函数以用于创建、跟踪、更新及撤消菜单。另外,视图中是没有菜单的,在框架窗口中才有菜单,所以只有用AfxGe

13、tApp()->m_pMain->GetMenu()才能得到菜单指针。3.1.2 位图的读入和显示在程序中,需要由用户来选择游戏中使用的图片,同时还需要将整幅图片分成不同的小块。因此,采用(Picture)Static控件作为位图的载体,分别显示图片的不同部分。首先,需要读入位图资源。点击菜单栏Insert->Resource->Bitmap->Import,在文件类型中选中必须所有文件位图才能显示出来,在弹出的对话框里面选中所要加的位图,点击Import,完成一副位图添加。添加完成后会弹出对话框。依次添加四个位图文件(ID默认)后,在ResourceView栏的

14、Bitmap中将看到为对话框的“图片”菜单添加五个菜单项所示,ID分别为:ID_PICTURE1,ID_PICTURE2,ID_PICTURE3,ID_PICTURE4,ID_ADVAN。接下来为CPictureDlg类添加一个CBitmap类型的成员变量Bitmap,CBitmap封装了Windows图形设备接口(GDI)中的位图,并且提供了操纵位图的成员函数。为了实现不同位图资源的加载,我们需要为类CPictureDialog添加一个成员函数Void OnRun(UINT nBitmapID,UINT nMenuID)。参数nBitmapID指定位图资源的ID号,nMenuID指定菜单项的

15、ID号。在函数中,我们首先用GetSubMenu得到指向弹出菜单对象的指针,然后用CheckMenuItem方法为nMenuID所指定的菜单项放置选中标记。接下来用CBitmap对象的LoadBitmap方法将nBitmapID所指定的位图载入。相应代码见附录。按 Ctrl + W 快捷键打开类向导如图3-18,依次为对话框中的“图片”菜单中的子菜单项添加消息响应函数,并调用OnRun函数加载位图。四张图片对应菜单的消息响应代码见附录。“自定义图片”菜单项的消息响应代码由于需要打开一个新的位图文件,所以需要先为CPictureDlg类添加一个HBITMAP类型的成员变量hBitmap,用来表示

16、指向位图资源的句柄。其次,还需要添加两个INT型变量Width,Height来表示用户打开图片的大小;BOOL型变量IsLong来表示图片属于长大于宽型还是宽大于长型,BOOL型变量Advan表示该图片是否是自定义型,变量定义代码截图。“自定义图片”菜单项的消息响应代码见附录。在上面的代码中,用LoadImage方法来加载自定义文件中的位图资源,然后用GetObject方法得到其BITMAP对象。3.1.3 用(Picture)Static控件显示位图 在游戏程序中,采用Static Text即静态文本控件来显示位图。静态文本控件的功能比较简单,可显示字符串、图标、位图。先为对话框的“游戏”中

17、的菜单项“简单”和“困难”添加消息响应。另外还需为CPictureDlg类添加BOOL型变量Easy来标识游戏的难度(分为9格或16格),同时添加BOOL型变量IsRnd用来标识图格是否进行了随机位置的初始化对应的简单、困难菜单项的消息响应函数代码见附录。接下来为CPictureDlg对话框添加16个Static控件(可以先设置好一个控件后,再通过复制得到其它的控件),如图3-23所示;并设置它们的属性:ID设为IDC_IMAGE0到IDC_IMAGE15,Tabstop需要选上,Type属性设为Bitmap;另外Styles标签里的Notify也要选上在添加完控件后,还需要添加一个CStat

18、ic类型的数组m_Image16与这16个Static控件相关联,通过这个操作这个数组的下标来控制这16个控件对图像进行分格显示在CPictureDlg类中系统生成的OnInitDialog()函数体内,这个函数是整个对话框程序运行的入口,相当于一个main函数,在这个函数体里,我们也需要为之前声明的变量提供初始值,即将变量初始化,变量没有初始化的后果通常会造成内存泄露,使程序在运行时出现莫名奇妙的错误。设定了Static控件的初始位置之后,就可以将图像拷贝到上面,因此需为CPictureDlg类添加一个成员函数SetImage,如图所示。SetImage函数的代码见附录。在SetImage函

19、数中涉及到一个未定义的BOOL型变量Style3d,需要声明并初始化,声明见图。初始化见图3-29(注:所有变量的初始代均在OnInitDialog()中完成),这个变量的作用是判断用户选择的图片风格是3D风格还是平面风格。这里我们顺便把对话框菜单的“选项”菜单项完善一下。如图所示: 新增各个菜单项的属性分别如图 在类向导中添加消息响应函数,如图类似添加其他几个消息响应函数,各函数代码见附录。在游戏正式开始之前,我们首先要对各图格进行随机排列。为CPictureDlg添加两个成员函数MapRand和Rnd,分别用来作为随机函数和设定随机图格的位置。如图所示。相应函数代码见附录。现在就可以依次为

20、那16个Static控件添加鼠标响应函数了,如图。16个函数代码相似,只给出OnImage0()的代码,具体见附录。单击Static控件时,程序首先判断图格是否进行了随机数初始化,若是,则移动图格,否则的话先进行初始化。此外还需用IsWin()函数判断游戏是否完成,如果完成则设置计时器控制变量Cancount为假。在CPictureDlg里面声明BOOL型变量Cancount和INT型变量count,它们在后面都会用到。如图3-39.在OnAdvan()函数中添加如下代码:count = 0;CanCount = FALSE;IsRnd = FALSE;Advan = TRUE;在OnEasy

21、()、OnHard()中以及OnRnd()函数的中添加:CanCount=FALSE;添加判断游戏是否完成的函数IsWin(),只要所有的Static控件都回到了相应的位置,就可以认为用户己完成了拼图,即游戏完成。函数代码见附录。在CPictureDlg头文件中定义CStatusBarCtrl类型变量m_wndStatusBar。打开类向导,为之前添加的菜单项“开始”(ID_BEGIN),“重置”(ID_REPLAY),“提示”(ID_FORHELP),和“退出”(ID_QUIT)添加消息响应函数。如图3-40。其他几个函数类似添加。至此,程序已经大致完成,运行,选择图片“美少女”,得到如图结

22、果。 第四章 设计结果及分析4.1 程序测试4.1.1 程序测试结果游戏开始单击图片,开始游戏,如图4-1。图4-1游戏开始,如图4-2。图 4-2开始游戏更改模式“困难”。图 4-3困难模式更换图片“山水图”。图4-4 更换图片查看缩略图,如图4-5。图4-5单击帮助,显示缩略图点击“确定”,结果如图4-6。返回游戏。图4-6 返回游戏点击“自定义图片”,结果如图4-7。图 4-7 自定义图片图片默认的是“3D效果”,改为“平面”,结果如图4-8。图 4-8 修改为平面效果测试结束。总 结 通过本次项目设计,我熟练掌握了对话框和常用控件的应用,基本学会了利用各种可视化元素和交互技术实现一个典

23、型的Windows应用程序的思路和方法。另外对MFC中的消息响应机制也进一步的加深了理解,而且通过本程序掌握Visual C+位图操作,例如位图加载、位图显示等。致 谢 在此次项目设计过程中,我遇到了不少的困难,得到了许多人的帮助。首先我要感谢任凤华老师,对于这个项目的给了我一个思路,另外还给予我不少技术上的支持,让我把程序做的更好,再次感谢任凤华老师的帮助。其次,我要感谢帮助我的同学,他们也在我的实验过程中给予了我不少的提醒和讲解。最后衷心的祝福老师身体健康、工作顺利! / pictureDlg.cpp : implementation file/#include "stdafx.

24、h"#include "picture.h"#include "pictureDlg.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialogpublic:CAboutDlg();/ Dialog Data/AFX_DATA(CAboutDlg)enum IDD = IDD_ABOUTBO

25、X ;/AFX_DATA/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CAboutDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); / DDX/DDV support/AFX_VIRTUAL/ Implementationprotected:/AFX_MSG(CAboutDlg)/AFX_MSGDECLARE_MESSAGE_MAP();CAboutDlg:CAboutDlg() : CDialog(CAboutDlg:IDD)/AFX_D

26、ATA_INIT(CAboutDlg)/AFX_DATA_INITvoid CAboutDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CAboutDlg)/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CAboutDlg, CDialog)/AFX_MSG_MAP(CAboutDlg)/ No message handlers/AFX_MSG_MAPEND_MESSAGE_MAP()/ CPictureDlg dialogCPictureDlg:CPictureDlg

27、(CWnd* pParent /*=NULL*/): CDialog(CPictureDlg:IDD, pParent)/AFX_DATA_INIT(CPictureDlg)/ NOTE: the ClassWizard will add member initialization here/AFX_DATA_INIT/ Note that LoadIcon does not require a subsequent DestroyIcon in Win32m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);void CPictureDlg:Do

28、DataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CPictureDlg)/ NOTE: the ClassWizard will add DDX and DDV calls here/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CPictureDlg, CDialog)/AFX_MSG_MAP(CPictureDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_COMMAND(ID_PICTURE1, OnPict

29、ure1)ON_COMMAND(ID_PICTURE2, OnPicture2)ON_COMMAND(ID_PICTURE3, OnPicture3)ON_COMMAND(ID_PICTURE4, OnPicture4)ON_COMMAND(ID_ADVAN, OnAdvan)ON_COMMAND(ID_EASY, OnEasy)ON_COMMAND(ID_HARD, OnHard)ON_COMMAND(ID_3D, On3d)ON_COMMAND(ID_FLAT, OnFlat)ON_BN_CLICKED(IDC_IMAGE0, OnImage0)ON_BN_CLICKED(IDC_IMAG

30、E1, OnImage1)ON_BN_CLICKED(IDC_IMAGE10, OnImage10)ON_BN_CLICKED(IDC_IMAGE11, OnImage11)ON_BN_CLICKED(IDC_IMAGE12, OnImage12)ON_BN_CLICKED(IDC_IMAGE13, OnImage13)ON_BN_CLICKED(IDC_IMAGE14, OnImage14)ON_BN_CLICKED(IDC_IMAGE15, OnImage15)ON_BN_CLICKED(IDC_IMAGE2, OnImage2)ON_BN_CLICKED(IDC_IMAGE3, OnIm

31、age3)ON_BN_CLICKED(IDC_IMAGE4, OnImage4)ON_BN_CLICKED(IDC_IMAGE5, OnImage5)ON_BN_CLICKED(IDC_IMAGE6, OnImage6)ON_BN_CLICKED(IDC_IMAGE7, OnImage7)ON_BN_CLICKED(IDC_IMAGE8, OnImage8)ON_BN_CLICKED(IDC_IMAGE9, OnImage9)ON_COMMAND(ID_BEGIN, OnBegin)ON_COMMAND(ID_REPLAY, OnReplay)ON_COMMAND(ID_FORHELP, On

32、Forhelp)ON_COMMAND(ID_OUT, OnOut)ON_WM_TIMER()ON_COMMAND(IDABOUT, OnAbout)ON_BN_CLICKED(IDC_DLGABOUT, OnDlgabout)ON_BN_CLICKED(IDC_ENDHELP, OnEndhelp)/AFX_MSG_MAPEND_MESSAGE_MAP()/ CPictureDlg message handlersBOOL CPictureDlg:OnInitDialog()CDialog:OnInitDialog();/ Set the icon for this dialog. The f

33、ramework does this automatically/ when the application's main window is not a dialogSetIcon(m_hIcon, TRUE); / Set big iconSetIcon(m_hIcon, FALSE); / Set small iconsrand(unsigned)time(NULL);/ TODO: Add extra initialization hereBitmap.LoadBitmap(IDB_BITMAP1);pKDC = new CDC;pMainMenu = GetMenu(); /

34、获取菜单Style3d = TRUE;Islong = FALSE;Advan = FALSE;Easy = TRUE;SetWindowPos(NULL,0,0,600,600,SWP_NOMOVE); /控制窗口大小SetTimer(10,1000,NULL);m_wndStatusBar.Create(WS_CHILD|WS_VISIBLE|CCS_BOTTOM|CCS_NODIVIDER,CRect(0,0,0,0),this,102);int static strPartDim4 = 160, 260, 350, -1;m_wndStatusBar.SetParts(3,strPar

35、tDim);m_wndStatusBar.SetText(TimeCon,1,0);m_wndStatusBar.SetText("Player",2,0);m_Image0.SubclassDlgItem(IDC_IMAGE0,this);m_Image1.SubclassDlgItem(IDC_IMAGE1,this);m_Image2.SubclassDlgItem(IDC_IMAGE2,this);m_Image3.SubclassDlgItem(IDC_IMAGE3,this);m_Image4.SubclassDlgItem(IDC_IMAGE4,this);m

36、_Image5.SubclassDlgItem(IDC_IMAGE5,this);m_Image6.SubclassDlgItem(IDC_IMAGE6,this);m_Image7.SubclassDlgItem(IDC_IMAGE7,this);m_Image8.SubclassDlgItem(IDC_IMAGE8,this);m_Image9.SubclassDlgItem(IDC_IMAGE9,this);m_Image10.SubclassDlgItem(IDC_IMAGE10,this);m_Image11.SubclassDlgItem(IDC_IMAGE11,this);m_I

37、mage12.SubclassDlgItem(IDC_IMAGE12,this);m_Image13.SubclassDlgItem(IDC_IMAGE13,this);m_Image14.SubclassDlgItem(IDC_IMAGE14,this);m_Image15.SubclassDlgItem(IDC_IMAGE15,this);m_Preview.SubclassDlgItem(IDC_PREVIEW,this);OnBegin();return TRUE; / return TRUE unless you set the focus to a controlvoid CPic

38、tureDlg:OnSysCommand(UINT nID, LPARAM lParam)if (nID & 0xFFF0) = IDM_ABOUTBOX)CAboutDlg dlgAbout;dlgAbout.DoModal();elseCDialog:OnSysCommand(nID, lParam);/ If you add a minimize button to your dialog, you will need the code below/ to draw the icon. For MFC applications using the document/view mo

39、del,/ this is automatically done for you by the framework.void CPictureDlg:OnPaint() if (IsIconic()CPaintDC dc(this); / device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);/ Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSys

40、temMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;/ Draw the icondc.DrawIcon(x, y, m_hIcon);elseCDialog:OnPaint();SetImage();if(pKDC) pKDC->DeleteDC();/ The system calls this to obtain the cursor to display w

41、hile the user drags/ the minimized window.HCURSOR CPictureDlg:OnQueryDragIcon()return (HCURSOR) m_hIcon;void CPictureDlg:OnRun(UINT nBitmapID, UINT nMenuID) pSubMenu = pMainMenu->GetSubMenu(1); pSubMenu->CheckMenuItem(ID_PICTURE1,MF_UNCHECKED); pSubMenu->CheckMenuItem(ID_PICTURE2,MF_UNCHECK

42、ED); pSubMenu->CheckMenuItem(ID_PICTURE3,MF_UNCHECKED); pSubMenu->CheckMenuItem(ID_PICTURE4,MF_UNCHECKED); pSubMenu->CheckMenuItem(ID_ADVAN,MF_UNCHECKED); pSubMenu->CheckMenuItem(nMenuID, MF_CHECKED); count = 0;Islong = FALSE;CanCount = FALSE;IsRnd = FALSE;Advan = FALSE;Bitmap.DeleteObje

43、ct();Bitmap.LoadBitmap(nBitmapID);SetPos();SetImage();IsWin();void CPictureDlg:OnPicture1() / TODO: Add your command handler code hereOnRun(IDB_BITMAP1, ID_PICTURE1);m_wndStatusBar.SetText("美少女",0,0);void CPictureDlg:OnPicture2() / TODO: Add your command handler code hereOnRun(IDB_BITMAP2,

44、 ID_PICTURE2);m_wndStatusBar.SetText("山水图",0,0);void CPictureDlg:OnPicture3() / TODO: Add your command handler code hereOnRun(IDB_BITMAP3, ID_PICTURE3);m_wndStatusBar.SetText("花鸟图",0,0);void CPictureDlg:OnPicture4() / TODO: Add your command handler code hereOnRun(IDB_BITMAP4, ID_

45、PICTURE4);m_wndStatusBar.SetText("冰河时代",0,0);void CPictureDlg:OnAdvan() / TODO: Add your command handler code hereCFileDialog dlg(TRUE, NULL, NULL, NULL, "位图文件(*.bmp)|*.bmp");INT Result = dlg.DoModal();if(Result = IDOK)count = 0; CanCount = FALSE;IsRnd = FALSE; Advan = TRUE;hBitm

46、ap = (HBITMAP):LoadImage(NULL, dlg.GetFileName(), IMAGE_BITMAP,0, 0, LR_LOADFROMFILE);BITMAP bm;:GetObject(hBitmap, sizeof(BITMAP), &bm);if(bm.bmWidth >= bm.bmHeight)hBitmap = (HBITMAP):LoadImage(NULL, dlg.GetFileName(),IMAGE_BITMAP, 350, 280, LR_LOADFROMFILE);Width = 350; Height = 280;Islong

47、 = FALSE;else if(bm.bmWidth < bm.bmHeight)hBitmap = (HBITMAP):LoadImage(NULL,dlg.GetFileName(),IMAGE_BITMAP, 200, 310, LR_LOADFROMFILE);Width = 200; Height = 280;Islong = TRUE;Bitmap.DeleteObject();SetPos();SetImage();IsWin();m_wndStatusBar.SetText(dlg.GetFileTitle(),0,0);else if(Result = IDCANCE

48、L)return;void CPictureDlg:OnEasy() / TODO: Add your command handler code herepSubMenu = pMainMenu->GetSubMenu(0);pSubMenu->CheckMenuItem(ID_HARD, MF_UNCHECKED);pSubMenu->CheckMenuItem(ID_EASY, MF_CHECKED);Easy = TRUE; IsRnd = FALSE;CanCount=FALSE;SetPos();IsWin();m_wndStatusBar.SetText(&quo

49、t;加油!",0,0);void CPictureDlg:OnHard() / TODO: Add your command handler code herepSubMenu = pMainMenu->GetSubMenu(0);pSubMenu->CheckMenuItem(ID_EASY, MF_UNCHECKED);pSubMenu->CheckMenuItem(ID_HARD, MF_CHECKED);Easy = FALSE; IsRnd = FALSE;CanCount=FALSE;SetPos();IsWin();m_wndStatusBar.Set

50、Text("有点难度!",0,0);void CPictureDlg:SetPos()BITMAP bm;INT con, move;if(Advan = FALSE)Bitmap.GetObject(sizeof(BITMAP),&bm);Width = bm.bmWidth; Height = bm.bmHeight;if(Easy)x = Width / 3; y = Height / 3; con = 2;else if(!Easy)x = Width / 4; y = Height / 4; con = 3;if(Islong) move = 70;els

51、e move = 0;for(int i = 0; i <= con; i+)m_Imagei.SetWindowPos(NULL,x*i+move,0,0,0,SWP_NOSIZE);m_Imagei.SetWindowPos(NULL,0, 0, x, y, SWP_NOMOVE);for(int j = 0; j <= con; j+)m_Imagecon+1+j.SetWindowPos(NULL,x*j+move,y,0,0,SWP_NOSIZE);m_Imagecon+1+j.SetWindowPos(NULL,0, 0, x, y, SWP_NOMOVE);for(i

52、nt k = 0; k <= con; k+)m_Image(con+1)*2+k.SetWindowPos(NULL,x*k+move,2*y,0,0,SWP_NOSIZE);m_Image(con+1)*2+k.SetWindowPos(NULL,0,0,x,y,SWP_NOMOVE);if(!Easy)for(int l = 0; l <= 3; l+)m_Imagel+12.SetWindowPos(NULL,x*l+move,3*y,0,0,SWP_NOSIZE);m_Imagel+12.SetWindowPos(NULL,0,0,x,y,SWP_NOMOVE);CCli

53、entDC dc(&m_Imagel+12);void CPictureDlg:SetImage()INT con;HANDLE picture;CRect rect(0,0,x,y);if(Advan=TRUE) picture = hBitmap;else if(Advan=FALSE) picture = Bitmap;if(Easy) con = 2;else if(!Easy) con = 3;for(int i = 0; i <= con; i+)CDC *pDC = new CDC;CClientDC dc(&m_Imagei);pDC->CreateCompatibleDC(&dc);pDC->SelectObject(picture);dc.BitBlt(0,0,x,y,pDC,x*i,0,SRCCOPY);if(St

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论