资源描述
目录1、 需求分析1 1.课程设计目的1 2.程序所实现的功能12、 设计内容11. 主模块图12.1. 主程序流程图2 2.2 用例图2 2.3主程序调用关系图32.4函数主要调用关系图3三、设计方案论述3四、调试分析4 1.实际完成的情况4 2.程序的性能分析43.上机过程中出现的问题及其解决方案44.程序中可以改进、扩充的功能及设计实现构想4五、用户手册4六、设计总结5 七、程序中主要的功能函数6八、主要参考文献6九、附录6一、需求分析1.课程设计目的 (1)运用C+语言设计拼图游戏具有极强的实践性,加强我们对C+课程基础知识点的理解掌握和灵活运用理能力,培养实际分析问题能力,养成良好的编程习惯;了解C+面向对象的设计方法与技巧,有效地、深刻地理解课程内容,体会理论、方法和设计原则;培养分析实际问题和解决问题的能力,具备使用面向对象程序设计开发工具设计实际系统的能力。 (2)进一步领会程序设计的特点和应用,提高运用C+ 以及面向对象知识解决实际问题的能力,初步掌握MFC编程的基本功能,掌握一种可视化编程的方法,学习使用CStatic控制操作位图,加强对C+面向对象程序设计的理解。 (3)掌握用C+ 编写面向对象的实用程序的设计方法,对面向对象方法和思想增加感性的认识,学会利用C+程序设计语言编写出一些短小、可靠的Windows实用程序,切实提高面向对象的程序设计能力,为后续的相关课程的学习打下基础。 (4)锻炼实际的编程能力,提高调查资料、查阅技术文献、资料以及编写软件设计文档的能力,提高自学编程的能力。2.程序所实现的功能 (1)本程序除了实现了拼图所要求的基本功能外,还添加了背景音乐、计算步数和游戏所用的时间,当游戏开始时背景音乐自动循环播放,步数随player操作自动增加,时间自动增加。 (2)进入游戏界面后,player可以在菜单栏中选择游戏的难度、图片风格和拼图图像,亦可以自定义图片,若选择“简单”,程序将图片分成9块,若选择“困难”,程序将图片分成16块. (3)单击“重置”或按F3菜单项会弹出一个对话框让用户确认是否重置游戏。 (4)单击任意图象,图像将随机排列,并开始计时和记步,用户通过鼠标单击空格周围的图片来改变其位置,用户没单击一次,步数增加一次。 (5)游戏中用户可通过单击“提示”菜单项或按F4来查看图像的缩略图及游戏相关信息。 (6)游戏状态栏显示用户所用时间及步数,成功时状态栏给出提示信息和所花费时间、步数,用户可选择其他图像或难度进行游戏。二、设计内容1.主模块图2.1主程序流程图 2.2 用例图 : 返回重新选择背景图片及难度级别显示原图 不显示拼图成功是否选择原图提示开始游戏选择难度级别选择背景图片用户 2.3主程序类调用关系图2.4 CPictureDlg类中成员函数主要调用关系图三、设计方案论述 本程序有一个CPictureDlg类,它公有继承CDialog类的一些性质。CDialog类中包括位图的读入和显示,拼图游戏中的Picture都是位图资源。在游戏程序中,采用Static Text即静态文本控件来显示位图。静态文本控件的功能比较简单,可显示字符串,图标,位图。 先为对话框的“游戏”中的菜单项“容易”和“困难”添加消息响应为另外还需为CPictureDlg类添加BOOL型变量Easy来标识游戏的难度(分为9格或16格),同时添加BOOL型变量IsRnd用来标识图格是否进行了随机位置的初始化,接下来为CPictureDlg对话框添加16个Static控件(可以先设置好一个控件后,再通过复制得到其它的控件),并设置它们的属性:ID设为IDC_IMAGE0到IDC_IMAGE15,Tabstop请勾上,Type属性设为Bitmap,控件添加好了后,我们需要添加一个CStatic类型的数组m_Image16,与这16个Static控件相关联,通过这个操作这个数组的下标来控制这16个控件对图像进行分格显示。建立关联的代码应写在CPictureDlg类中系统生成的OnInitDialog()函数体内,这个函数是整个对话框程序运行的入口,相当于一个main函数,在这个函数体里,我们也需要为之前声明的变量提供初始值,即将变量初始化,变量没有初始化的后果通常会造成内存泄露,使程序在运行时出现莫名奇妙的错误。判断游戏是否完成的函数IsWin(),只要所有的Static控件都回到了相应的位置,就可以认为用户己完成了拼图,即游戏完成。 四、调试分析1.实际完成的情况(1)完成的功能: 本程序除了实现了拼图所要求的基本功能外,还添加了背景音乐、计算步数和游戏所用的时间,当游戏开始时背景音乐自动循环播放,步数随player操作自动增加,时间自动增加。 (2)支持的数据类型: BOOL类型、控件数组类型。2. 程序的性能分析 本程序能够很好的运行,并且画面质量以及音质方面都很高3. 上机过程中出现的问题及其解决方案 1)开始导入图片时,图片不能显示,重新导入bmp格式的图片后解决了。 2)开始建立了时间函数OnTimer,但是游戏运行后时间并不增加,在开始游戏对应的函 数中增加SetTimer函数,得到想要的结果。 3)初始设置的快捷键无效,查阅资料后加入Accelerator及相应的函数,使得快捷键有效。4. 程序中可以改进、扩充的功能及设计实现构想。 1)游戏的难度等级有点少,可以适当增加几个等级。 2)游戏未设置根据用户花费的时间和步数判定用户的成绩并进行排名的功能,可以增设,以便用户了解自己玩的水平。5、 用户手册1.打开Picture文件夹,双击Ppicture.dsw标志打开程序,然后运行。2.开始程序会出现以下欢迎界面: 3.用户需要选择图片、难度和图片风格,然后单击图片开始游戏,计时器开始计时,用户通过鼠标单击空格周围的图片来改变其位置,用户每单击一次,步数增加一次。4.游戏中用户可通过单击“提示”菜单项或按F4来查看图像的缩略图及游戏相关信息。图像缩略图 游戏相关信息 5. 用户也可以单击菜单栏中的重置或按快捷键F3重置图片,会出现提示信息,用户单击确定重置图片。提示框如下: 6.当完成拼图后系统会自动给出成功提示,并显示用户的成绩,用户单击确定后可以选择其他图片或难度继续游戏,也可以选择单击“退出”或按Esc退出游戏。六、设计总结通过本次课程设计,学习并初步掌握了基于对话框的MFC程序的设计,并学会了使用CStatic控件操作位图。熟悉了在基于对话框的工程中加入菜单操作、用代码操作菜单、Windows位图文件的基本结构、Visual C+中对位图资源的操作、Visual C+中对自定义位图文件的操作、设置相关位图的概念、用Static控件显示位图以及用Status Bar显示提示信息和Visual C+随机函数。在设计过程中,曾遇到了两个瓶颈导致程序一度无法完成,第一个是位图文件的添加,包括将图片格式转换成BMP格式、添加相关Static控件,尤其是对控件图标不熟悉的情况下,一时不知道在哪儿添加控件,后来上网查阅并请教同学才得以完成控件的添加,使得程序可以继续完成。不过在程序即将结束的时候,又遇到了一个新的问题,导致程序差点功亏一篑,问题就是图片的缩略图的添加,也就是游戏中的“提示”的应用,当然没有“提示”操作,并不会影响整个程序的运行环境,但是为了使游戏者能够顺利的完成游戏,此“提示”操作必不可少,在纠结了一段时间之后,在与同学的商讨下,终于完成了缩略图的添加,为程序的顺利完成提供了帮助。在本次设计的完成过程中,我对软件的开发有了一个初步的认识,一个小型游戏软件尚且需要不断地查阅资料、请教别人,那么完成一个大型的软件,必定需要更加复杂的过程。所以在做软件开发时首先要保持一个平静的心态,静下心来潜心去研究,同时还要熟悉的掌握、灵活的运用所学知识,方能完成设计。也对MFC程序开发也有了相应的了解,每一个函数都有其特定的用途,掌握好这其中的一些关联,对一个程序的完成不无好处,这次课程设计为我以后编程的相关学习奠定了基础,使我在不同方面得到了锻炼。七、程序中类的主要的成员函数BOOL OnInitDialog(); /初始化函数void OnRun(UINT nBitmapID,UINT nMenuID);/加载位图资源BOOL IsWin(); /判断拼图是否成功void MoveImage(int num); /移动随机小图块void Rnd(); /随机设置小图块的位置UINT MapRand(UINT nMax); /随机函数void SetImage(); /把图像拷贝到Static控件void SetPos() / 初始化Staic 控件的位置CString IntToString(int number); /为游戏添加计时器void OnTimer(UINT nIDEvent); /计时函数void SetPre(); /生成略缩图void CPictureDlg:OnForHelp() /显示略缩图void ShowItem(); /显示帮助对话框八、主要参考文献 1.郑莉.C+语言程序设计(第3版)北京:清华大学出版社,2005.7 2.钱能.C+程序设计教程(第2版)北京:清华大学出版社,2005.8 3.黄维通.Visual C+面向对象与可视化程序设计(第2版).北京:清华大学出版社, 2003.12 4.刘路放.Visual C+与面向对象程序设计教程(第二版).北京:高等教育出版社,2007.8 5. 潘爱民. COM原理与应用.北京:清华大学出版社,1999.11九、附录BOOL CPictureDlg:OnInitDialog()/整个对话框程序运行的入口CDialog:OnInitDialog();/ Set the icon for this dialog. The framework does this automatically/ when the applications main window is not a dialogSetIcon(m_hIcon, TRUE); / Set big iconSetIcon(m_hIcon, FALSE); / Set small iconsrand(unsigned)time(NULL);hAccel = :LoadAccelerators(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_ACCELERATOR1);/ TODO: Add extra initialization here Bitmap.LoadBitmap(IDB_BITMAP6);/初始界面是图像BITMAP6pKDC = new CDC;pMainMenu = GetMenu(); /获取菜单Style3d = TRUE;Islong = FALSE;Advan = FALSE;Easy = TRUE;TimeCon = 计时器;IntStep = 0;Strstep = 步数;SetWindowPos(NULL,0,0,600,700,SWP_NOMOVE); /控制窗口大小SetTimer(10,1000,NULL);/10表示计时器的名字,1000表示时间间隔是1000毫秒,NULL表示使用onTimer函数。m_wndStatusBar.Create(WS_CHILD|WS_VISIBLE|CCS_BOTTOM|CCS_NODIVIDER,CRect(0,0,0,0),this,102);int static strPartDim5 = 100,230, 330,400, -1;m_wndStatusBar.SetParts(4,strPartDim);/将状态显示栏分为四块m_wndStatusBar.SetText(TimeCon,1,0);m_wndStatusBar.SetText(Strstep,2,0);m_wndStatusBar.SetText(Player,3,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_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_Image12.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();PlaySound(rain.wav, NULL,SND_LOOP | SND_ASYNC);return TRUE; / return TRUE unless you set the focus to a controlvoid CPictureDlg:OnSysCommand(UINT nID, LPARAM lParam)/截获控制命令的函数if (nID & 0xFFF0) = IDM_ABOUTBOX)CAboutDlg dlgAbout;dlgAbout.DoModal();/用来显示一个模态对话框,其返回值对应于用来关闭对话框的控件的IDelseCDialog: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 model,/ 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 = GetSystemMetrics(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();/调用SetImage函数将图片拷贝到Static控件上面if(pKDC) pKDC-DeleteDC();/ The system calls this to obtain the cursor to display while the user drags/ the minimized window.HCURSOR CPictureDlg:OnQueryDragIcon()return (HCURSOR) m_hIcon;void CPictureDlg:OnRun(UINT nBitmapID, UINT nMenuID) pSubMenu = pMainMenu-GetSubMenu(1);/用GetSubMenu得到指向弹出菜单对象的指 pSubMenu-CheckMenuItem(ID_PICTURE1,MF_UNCHECKED);/用CheckMenuItem方法为nMenuID所指定的菜单项放置选中标记 pSubMenu-CheckMenuItem(ID_PICTURE2,MF_UNCHECKED);/用CBitmap对象的LoadBitmap方法将nBitmapID所指定的位图载入 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.DeleteObject();/先调用函数CGdiObject:DeleteObject删除由LoadBitmap加载过的位图 Bitmap.LoadBitmap(nBitmapID);/用LoadBitmap方法载入新的位图对象 SetPos(); SetImage(); /IsWin();void CPictureDlg:OnPicture1() / TODO: Add your command handler code hereOnRun(IDB_BITMAP1, ID_PICTURE1);/调用OnRun()函数加载位图m_wndStatusBar.SetText(三只小熊,0,0);IntStep = 0;/设定初始步数为0SetStep(IntStep);/调用记步函数,计算步数PlaySound(yin.wav, NULL, SND_LOOP | SND_ASYNC);void CPictureDlg:OnPicture2() / TODO: Add your command handler code hereOnRun(IDB_BITMAP2, ID_PICTURE2);/调用OnRun()函数加载位图m_wndStatusBar.SetText(阿狸,0,0);IntStep = 0;/设定初始步数为0 SetStep(IntStep);/调用记步函数,计算步数PlaySound(yue.wav, NULL, SND_LOOP | SND_ASYNC);void CPictureDlg:OnPicture3() / TODO: Add your command handler code hereOnRun(IDB_BITMAP3, ID_PICTURE3);/调用OnRun()函数加载位图m_wndStatusBar.SetText(小可爱,0,0); IntStep = 0;/设定初始步数为0SetStep(IntStep);/调用记步函数,计算步数PlaySound(l.wav, NULL, SND_LOOP | SND_ASYNC);void CPictureDlg:OnPicture4() / TODO: Add your command handler code hereOnRun(IDB_BITMAP4, ID_PICTURE4);/调用OnRun()函数加载位图m_wndStatusBar.SetText(小象,0,0);IntStep = 0;/设定初始步数为0SetStep(IntStep);/调用记步函数,计算步数PlaySound(ai.wav, NULL, SND_LOOP | SND_ASYNC);void CPictureDlg:OnPicture5() / TODO: Add your command handler code hereOnRun(IDB_BITMAP5, ID_PICTURE5);/调用OnRun()函数加载位图m_wndStatusBar.SetText(比卡丘,0,0); IntStep = 0;/设定初始步数为0SetStep(IntStep);/调用记步函数,计算步数PlaySound(天籁童声 - Tell Me Why.wav, NULL, SND_LOOP | SND_ASYNC);void CPictureDlg:OnAdvan() /自定义图片的函数/用LoadImage方法来加载自定义文件中的位图资源,然后用GetObject方法得到其BITMAP对象/ TODO: Add your command handler code hereCFileDialog dlg(TRUE, NULL, NULL, NULL, 位图文件(*.bmp)|*.bmp);INT Result = dlg.DoModal();/PlaySound(l.wav, NULL, SND_LOOP | SND_ASYNC);if(Result = IDOK)count = 0; CanCount = FALSE;IsRnd = FALSE; Advan = TRUE;hBitmap = (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, 650, 600, LR_LOADFROMFILE);/限定自定义图片的大小Width = 650; Height = 600;Islong = FALSE;else if(bm.bmWidth GetSubMenu(0);pSubMenu-CheckMenuItem(ID_HARD, MF_UNCHECKED);pSubMenu-CheckMenuItem(ID_EASY, MF_CHECKED);Easy = TRUE; IsRnd = FALSE;CanCount=FALSE;SetPos();m_wndStatusBar.SetText(加油!,0,0);IntStep = 0;/设定初始步数为0SetStep(IntStep);/调用记步函数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();m_wndStatusBar.SetText(有点难度!,0,0);IntStep = 0;SetStep(IntStep);void CPictureDlg:SetPos()/对Static控件的位置进行初始化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;else 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(int 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);CClientDC dc(&m_Imagel+12);void CPictureDlg:SetImage()/将图像拷贝到Static控件上面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 CreateCompatibleDC(&dc);pDC-SelectObject(picture);dc.BitBlt(0,0,x,y,pDC,x*i,0,SRCCOPY);if(Style3d) dc.DrawEdge(rect,EDGE_RAISED,BF_RECT);else if(!Style3d) dc.Draw3dRect(rect,RGB(0,0,0,),RGB(0,0,0,);delete pDC;UpdateWindow();for(int j = 0; j CreateCompatibleDC(&dc);pDC-SelectObject(picture);dc.BitBlt(0,0,x,y,pDC,x*j,y,SRCCOPY); if(Style3d) dc.DrawEdge(rect,EDGE_RAISED,BF_RECT); else if(!Style3d) dc.Draw3dRect(rect,RGB(0,0,0,),RGB(0,0,0,); delete pDC;for(int k = 0; k CreateCompatibleDC(&dc);pDC-SelectObject(picture);dc.BitBlt(0,0,x,y,pDC,x*k,2*y,SRCCOPY);if(Style3d) dc.DrawEdge(rect,EDGE_RAISED,BF_RECT);else if(!Style3d) dc.Draw3dRect(rect,RGB(0,0,0,),RGB(0,0,0,);delete pDC;if(!Easy)for(int l = 0; l CreateCompatibleDC(&dc);pDC-SelectObject(picture);dc.BitBlt(0,0,x,y,pDC,x*l,3*y,SRCCOPY);if(Style3d) dc.DrawEdge(rect,EDGE_RAISED,BF_RECT);else if(!Style3d) dc.Draw3dRect(rect,RGB(0,0,0,),RGB(0,0,0,);delete pDC;if(!IsRnd)pSubMenu = pMainMenu-GetSubMenu(0);pSubMenu-EnableMenuItem(ID_FORHELP,MF_DISABLED|MF_GRAYED);void CPictureDlg:On3d()/图片3D效果 / TODO: Add your command handler code herepSubMenu = pMainMenu-GetSubMenu(2);pSubMenu-CheckMenuItem(ID_FLAT,MF_UNCHECKED);pSubMenu-CheckMenuItem(ID_3D,MF_CHECKED);Style3d = TRUE;SetImage();void CPictureDlg:OnFlat() /图片平面效果/ TODO: Add your command handler code herepSubMenu = pMainMenu-GetSubMenu(2);pSubMenu-CheckMenuItem(ID_FLAT,MF_CHECKED);pSubMenu-CheckMenuItem(ID_3D,MF_UNCHECKED);Style3d = FALSE;SetImage();UINT CPictureDlg:MapRand(UINT nMax)/随机函数int nRand = rand();float fMap = (float)nMax / RAND_MAX;float fRetVal = (float)nRand*fMap+0.5f;return (UINT)fRetVal;void CPictureDlg:Rnd()/设定随机图格的位置int xnum,ynum,level;UINT rand;if(Easy) level = 8; /如果是9格else if(!Easy) level = 15;/如果是16格WINDOWPLACEMENT wpnum, wp15;for(int a = 0; a = 600; a+) rand = MapRand(4); if(rand=1) for(int b = 0; b = level - 1; b+) m_Imagelevel.GetWindowPlacement(&wp15); m_Imageb.GetWindowPlacement(&wpnum); xnum = wpnum.rcNormalPosition.left; ynum = wpnum.rcNormalPosition.top; if(wpnum.rcNormalPosition.top = wp15.rcNormalPosition.top & wpnum.rcNormalPosition.left =wp15.rcNormalPosition.left - x) m_Imageb.SetWindowPos(NULL,xnum+x,ynum,0,0,SWP_NOSIZE);m_Imagelevel.SetWindowPos(NULL,xnum,ynum,0,0,SWP_NOSIZE); if(rand = 2)for(int c = 0; c = level - 1; c+)m_Imagelevel.GetWindowPlacement(&wp15);m_Imagec.GetWindowPlacement(&wpnum);xnum = wpnum.rcNormalPosition.left;ynum = wpnum.rcNormalPosition.top;if(wpnum.rcNormalPosition.top=wp15.rcNormalPosition.top& wpnum.rcNormalPosition.left =wp15.rcNormalPosition.left + x)m_Imagec.SetWindowPos(NULL,xnum-x,ynum,0,0,SWP_NOSIZE); m_Imagelevel.SetWindowPos(NULL,xnum,ynum,0,0,SWP_NOSIZE); if(rand = 3)for(int d = 0; d = level - 1; d+)m_Imagelevel.GetWindowPlacement(&wp15);m_Imaged.GetWindowPlacement(&wpnum);xnum = wpnum.rcNormalPosition.left;ynum = wpnum.rcNormalPosition.top; if(wpnum.rcNormalPosition.left=wp15.rcNormalPosition.left& wpnum.rcNormalPosition.top =wp15.rcNormalPosition.top + y)m_Imaged.SetWindowPos(NULL,xnum,ynum-y,0,0,SWP_NOSIZE); m_Imagelevel.SetWindowPos(NULL,xnum,ynum,0,0,SWP_NOSIZE);if(rand = 4)for(int e = 0; e GetSubMenu(0);pSubMenu-EnableMenuItem(ID_FORHELP,MF_ENABLED);IsRnd = TRUE;CanCount=TRUE;void CPictureDlg:MoveImage(int num)/移动随机图格的函数int xnum,ynum,level;if(Easy) level = 8;else if(!Easy) level = 15;WINDOWPLACEMENT wpnum, wp15;m_Imagelevel.GetWindowPlacement(&wp15);m_Imagenum.GetWindowPlacement(&wpnum);xnum = wpnum.rcNormalPosition.left;ynum = wpnum.rcNormalPosition.top;if(num!=level) if(wpnum.rcNormalPosition.top=wp15.rcNormalPosition.top &wpnum.rcNormalPosition.left =wp15.rcNormalPosition.left - x) m_Imagenum.SetWindowPos(NULL,xnum + x,ynum,0,0,SWP_NOSIZE);m_Imagelevel.SetWindowPos(NULL,xnum,ynum,0,0,SWP_NOSIZE); if(wpnum.rcNormalPosition.top=wp15.rcNormalPosition.top &wpnum.rcNormalPosition.left =wp15.rcNormalPosition.left + x) m_Imagenum.SetWindowPos(NULL,xnum - x,ynum,0,0,SWP_NOSIZE);m_Imagelevel.SetWindowPos(NULL,xnum,ynum,0,0,SWP_NOSIZE); if(wpnum.rcNormalPosition.left=wp15.rcNormalPosition.left &wpnum.rcNormalPosition.top =wp15.rcNormalPosition.top + y) m_Imagenum.SetWindowPos(NULL,xnum,ynum - y,0,0,SWP_NOSIZE);m
展开阅读全文