




已阅读5页,还剩14页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一 实训目的 (1)培养分析问题、解决问题的能力(2)培养考虑问题的周密性和逻辑思维能力(3)培养实际动手能力(4)培养C+知识的综合运用能力二 实训任务和要求1.图形: 带颜色的图形。(增加选色功能) 线粗不同的图形。(修改线粗的功能) 块状图。(图形的填充色和边线颜色可以不同,由用户选择) 等等。 2. 界面 工具栏,状态栏,改变鼠标,查看窗口等等 3. 编辑 在重新打开时和在正常情况下一样画图或者选中图形进行图形编辑。 4. 文件保存 EMF文件, 导入位图文件成为一个(由位图填充的)矢量矩形等等。 5. 编辑 单个图像拖动,改变图形节点位置能够进行基本的图形绘制功能:直线,圆、矩形和多边形; 数据保存功能,能够把图形数据保存到文件中; 简单的编辑功能:改变线条和填充颜色以及线宽;三 实训过程和内容3.1需求分析(1)认识C+编程软件C+是一种使用非常广泛的计算机编程语言。C+是一种静态数据类型检查的,支持多重编程范式的通用程序设计语言。它支持过程化程序设计、数据抽象、面向对象程序设计、制作图标等等泛型程序设计等多种程序设计风格。C+支持C语言的几乎全部功能,在语法上与C语言仅有极微妙的差别;C+语言原本不具备面向对象的设计功能,然而随着面向对象编程的概念的提出以及如Java等语言的发展成熟,C+语言也开发出了支持面向对象功能的版本,现在编程者常用的VC+就是一种面向对象的语言;C+强大(但容易失控的)模板功能使它能在编译期完成许多工作,从而大大提高运行期效率。STL(C+标准模板库,Standard Template Library);随着STL的不断发展,它已经逐渐成为C+程序设计中不可或缺的部分,其效率可能比一般的native代码低些,但是其安全性与规范性使它大受欢迎。(2)计算机图形的认识在计算机科学中,图形和图像这两个概念是有区别的:图形一般指用计算机绘制的画面,如直线、圆、圆弧、任意曲线和图表等;图像则是指由输入设备捕捉的实际场景画面或以数字化形式存储的任意画面。图像是由一些排列的像素组成的,在计算机中的存储格式有BMP、PCX、TIF、GIFD等,一般数据量比较大。它除了可以表达真实的照片外,也可以表现复杂绘画的某些细节,并具有灵活和富有创造力等特点,而与图像不同,在图形文件中只记录生成图的算法和图上的某些特点,也称矢量图。在计算机还原时,相邻的特点之间用特定的很多段小直线连接就形成曲线,若曲线是一条封闭的图形,也可靠着色算法来填充颜色。它最大的优点就是容易进行移动、压缩、旋转和扭曲等变换。3.2 设计(1)C+程序中的应用程序对象 (a)基于窗口的应用程序还是使用MFC比较多,所以主要介绍一下MFC。CWnd窗口:它是大多数“看得见的东西”的父类(Windows里几乎所有看得见的东西都是一个窗口,大窗口里有许多小窗口),比如视图CView、框架窗口CFrameWnd、工具条CToolBar、对话框CDialog、按钮CButton,etc;一个例外是菜单(CMenu)不是从窗口派生的。CDocument文档,负责内存数据与磁盘的交互。最重要的是OnOpenDocument(读入),OnSaveDocument(写盘),Serialize(读写) CView视图:负责内存数据与用户的交互。包括数据的显示、用户操作的响应(如菜单的选取、鼠标的响应)。最重要的是OnDraw(重画窗口),通常用CWnd:Invalidate()来启动它。另外,它通过消息映射表处理菜单、工具条、快捷键和其他用户消息。CDC设备文本:无论是显示器还是打印机,都是画图给用户看。这图就抽象为CDC。CDC与其他GDI(图形设备接口)一起,完成文字和图形、图像的显示工作。把CDC想象成一张纸,每个窗口都有一个CDC相联系,负责画窗口。CDC有个常用子类CClientDC(窗口客户区),画图通常通过CClientDC完成。 CDialog:对话框 CWinApp应用程序类:似于C中的main函数,是程序执行的入口和管理者,负责程序建立、消灭,主窗口和文档模板的建立。CGdiObject及子类:用于向设备文本画图。它们都需要在使用前选进DC。 CPen笔:画线 CBrush刷子:填充 CFont字体:控制文字输出的字体 CBitmap:位图 CPalette:调色板 CRgn区域:指定一块区域可以用于做特殊处理。 CFile文件:最重要的不外是Open(打开),Read(读入),Write(写) CString字符串:封装了C中的字符数组CPoint点: (x,y)对 CRect矩形:(left,top,right,bottom) CSize大小:(cx,cy)对(宽、高)(b) MFC五大群组General Purpose classes:提供字符串类、数据处理类(如数组与链表),异常情况处理类、文件类等。 Windows API classes:用来封装Windows API,例如窗口类、对话框类、DC类等。 Application framework classes:组成应用程序骨干类,即此组类,包括Dcoument/View、消息泵、消息映射、消息传递、动态创建、文件读写等等。 High level abstractions:包括工具栏、状态栏、拆分窗口、滚动窗口等等。视觉性UI对象属于此类,例如工具栏CToolBar、状态栏CStatusBar、对话框列CDialogBar。加强型的View也属此类,如可滚动的ScrollView、以对话框为基础的CFormView、小型文字编辑器CEditView、树状结构的CTreeView,支持RTF文件格式的CRichEditView等等。 operation system extensions:包括OLE、ODBC、DAO、MAPI、WinSock、ISAPI等等。(2)文档对象、视图对象和框架对象在MFC中引入了文档-视图结构的概念,文档相当于数据容器,视图相当于查看数据的窗口或是和数据发生交互的窗口。因此一个完整的应用一般由四个类组成:CWinApp应用类,CFrameWnd窗口框架类,CDocument文档类,CView视类。在程序运行时CWinApp将创建一个CFrameWnd框架窗口实例,而框架窗口将创建文档模板,然后有文档模板创建文档实例和视实例,并将两者关联。一般来讲我们只需对文档和视图进行操作,框架的各种行为已经被MFC安排好了而不需人为干预,这也是设计文档-视结构的本意,让我们将注意力放在完成任务上而从界面编写中解放出来。在应用中一个视图对应一个文档,但一个文档可以包含多个视图。一个应用中只用一个框架窗口,对多文档界面来讲可能有多个MDI子窗口。每一个视图都是一个子窗口,在单文档界面中父窗口即是框架窗口,在多文档界面中父窗口为MDI子窗口。一个多文档应用中可以包含多个文档模板,一个模板定义了一个文档和一个或多个视图之间的对应关系。同一个文档可以属于多个模板,但一个模板中只允许定义一个文档。同样一个视图也可以属于多个文档模板。一般来说用户的输入/输出基本都是通过视图进行,但一些例外的情况下可能需要和框架直接发生作用。 在使用菜单时大家会发现当一个菜单没有进行映射处理时为禁止状态,在多视图的情况下菜单的状态和处理映射是和当前活动视相联系的,这样MFC可以保证视他能正确的接收到各种消息,但有时候也会产生不便。有一个解决办法就是在框架中对消息进行处理,这样也可以保证当前文档可以通过框架得到当前消息。 在用户进行输入后如何使视的状态得到更新?这个问题在一个文档对应一个视图时是不存在的,但是现在有一个文档对应了两个视图,当在一个视上进行了输入时如何保证另一个视图也得到通知呢?MFC的做法是利用文档来处理的,因为文档管理着当前和它联系的视图,由它来通知各个视图是最合适的。例如: void CView:OnUpdate( CView* pSender, LPARAM lHint, CObject* pHint ) void CDocument:UpdateAllViews( CView* pSender, LPARAM lHint = 0L, CObject* pHint = NULL ) 当文档的UpdateAllViews被调用时和此文档相关的所有视图对象的OnUpdate都会被调用,而参数lHint和pHint都会被传递。那么还有一个问题:如何在OnUpdate中知道是那个视图发生了改变呢,这就可以利用pHint参数,只要调用者将this指针赋值给参数就可以了,当然完全可以利用该参数传递更复杂的结构。 视图对象的初始化,当一个文档被打开或是新建一个文档时视图的CView:OnInitialUpdate()会被调用,你可以通过重载该函数对视图对象进行初始化,并在结束前调用父类的OnInitialUpdate,因为这样可以保证OnUpdate会被调用。 文档中内容的清除,当文档被关闭时(比如退出或是新建前上一个文档清除)void CDocument:DeleteContents ()会被调用,你可以通过重载该函数来进行清理工作。 在单文档结构中上面两点尤其重要,因为软件运行文档对象和视图对象只会被产生并删除一次。所以应该将上面两点和C+对象构造和构析分清楚。 文档模板分为两类单文档模板和多文档模板,分别由CSingleDocTemplate和CMultiDocTemplate表示,模板的作用在于记录文档对象,视图对象,框架对象之间的对应关系。还有一点就是模板可以记录应用程序可以打开的文件的类型,当打开文件时会根据文档模板中的信息选择正确的文档和视图。当使用者通过视图对象修改了数据时,应该调用GetDocument()-SetModifiedFlag(TRUE)通知文档数据已经被更新,这样在关闭文档时会自动询问用户是否保存数据。(3)菜单设计 (a) 菜单的种类: 生成数据 插入排序 希尔排序 起泡排序 快速排序 选择排序 堆排序 归并排序(非递归) 归并排序(递归) 退出(b) 工具条的实现例如,24位工具条的实现: 在mainframe.h文件中声明成员变量: CToolBar m_hotToolBar; 在 CMainFrame:OnCreate() 中创建工具条,假设你已经创建了一个ToolBar资源和两个工具条位图(Bitmap)资源:IDB_TOOLBAR_COLD 和 IDB_TOOLBAR_HOT,前者表示的是常态按钮,而后者表示的是鼠标移到上面时的状态按钮。用下面的代码创建工具条: if(!m_hotToolBar.CreateEx(this,TBSTYLE_FLAT|TBSTYLE_LIST,WS_CHILD|WS_VISIBLE | CBRS_TOP| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) |!m_hotToolBar.LoadToolBar(IDR_HOTBAR)TRACE0(Failed to create toolbarn);return -1; / fail to create 在CMainFrame:OnCreate()中还要添加如下代码,它们实现对位图资源的存取: / Set up hot bar image lists.CImageList imageList;CBitmap bitmap;/ Create and set the normal toolbar image list.bitmap.LoadBitmap(IDB_TOOLBAR_COLD);imageList.Create(21, 20, ILC_COLORDDB|ILC_MASK, 13, 1);imageList.Add(&bitmap, RGB(255,0,255);m_hotToolBar.SendMessage(TB_SETIMAGELIST, 0, (LPARAM)imageList.m_hImageList);imageList.Detach();bitmap.Detach();/ Create and set the hot toolbar image list.bitmap.LoadBitmap(IDB_TOOLBAR_HOT);imageList.Create(21, 20, ILC_COLORDDB|ILC_MASK, 13, 1);imageList.Add(&bitmap, RGB(255,0,255);m_hotToolBar.SendMessage(TB_SETHOTIMAGELIST, 0, (LPARAM)imageList.m_hImageList);imageList.Detach();bitmap.Detach(); 添加24位色工具条按钮的消息处理函数,这个工具条有五个按钮,那么在 mainframe.h中加入消息处理函数声明: afx_msg void OnBack();afx_msg void OnForward();afx_msg void OnStop();afx_msg void OnRefresh();afx_msg void OnHome();在mainframe.cpp中添加消息处理代码:消息映射 ON_COMMAND(ID_BACK, OnBack)ON_COMMAND(ID_FORWARD, OnForward)ON_COMMAND(ID_STOP, OnStop)ON_COMMAND(ID_REFRESH, OnRefresh)ON_COMMAND(ID_HOME, OnHome) 以上的结果如下图:图1 工具条示例(4)绘图的实现 窗口消息:WM_CREATE,WM_DESTROY,WM_CLOSE我们创建一个窗口对象的时候,这个窗口对象在创建过程中收到的就是WM_CREATE消息,对这个消息的处理过程一般用来设置一些显示窗口前的初始化工作,如设置窗口的大小,背景颜色等,WM_DESTROY消息指示窗口即将要被撤消,在这个消息处理过程中,我们就可以做窗口撤消前的一些工作。WM_CLOSE wm_close消息发生在窗口将要被关闭之前,在收到这个消息后,一般性的操作是回收所有分配给这个窗口的各种资源。 键盘消息:WM_CHAR,WM_KEYDOWN,WM_KEYUP这三个消息用来处理用户的键盘数据,当用户在键盘上按下某个键的时候,会产生WM_KEYDOWN消息,释放按键的时候又回产生WM_KEYUP消息,所以WM_KEYDOWN与WM_KEYUP消息一般总是成对出现的,至于WM_CHAR消息是在用户的键盘输入能产生有效的ASCII码时才会发生。这里特别提醒要注意前两个消息与WM_CHAR消息在使用上是有区别的。在前两个消息中,伴随消息传递的是按键的虚拟键码,所以这两个消息可以处理非打印字符,如方向键,功能键等。而伴随WM_CHAR消息的参数是所按的键的ASCII码,ASCII码是可以区分字母的大小写的。而虚拟键码是不能区分大小写的。 鼠标消息:WM_MOUSEMOVE,WM_LBUTTONDOWN, WM_LBUTTONUP, WM_LBUTTONDBCLICK,WM_RBUTTONDOWN, WM_RBUTTONUP,WM_RBUTTONDBCLICK这组消息是与鼠标输入相关的,WM_MOUSEMOVE消息发生在鼠标移动的时候,剩余的六个消息则分别对应于鼠标左右键的按下、释放、双击事件,要指出的是WINDOWS系统并不是在鼠标每移动一个像素时都产生MOUSEMOVE消息,这一点要特别注意。 另一组窗口消息:WM_MOVE , WM_SIZE , WM_PAINT 当窗口移动的时候产生WM_MOVE 消息,窗口的大小改变的时候产生WM_SIZE消息,而当窗口工作区中的内容需要重画的时候就会产生WM_PAINT消息。 焦点消息WM_SETFOCUS,WM_KILLFOCUS当一个窗口从非活动状态变为具有输入焦点的活动状态的时候,它就会收到WM_SETFOCUS消息,而当窗口失去输入焦点的时候它就会收到WM_KILLFOCUS消息。 定时器消息:WM_TIMER当我们为一个窗口设置了定时器资源之后,系统就会按规定的时间间隔向窗口发送WM_TIMER消息,在这个消息中就可以处理一些需要定期处理的事情。最后要指出的一点是,在WINDOWS环境下,消息的来源是多方面的,最常见的是用户的操作产生消息,系统在必要的时候也会向程序发送系统消息,其他在运行中的程序也可以向程序发送消息。此外,在程序的内部,也可以根据需要在适当的时候主动产生消息,比如主动产生WM_PAINT消息以实现需要的重画功能。例如,创建一个定时器。点击查看,建立类向导图2 创建定时器 建立类向导示例(1)在class name下点击ctestview,然后再messages 选择 WM TIMER。然后选择Add Function. 图3 创建定时器 建立类向导示例(2)自己命名一下确定就建立成功。 消除鼠标移动过程中的绘图痕迹void CShanView:OnDrawArraw() m_DrawMode=1;void CShanView:OnUpdateDrawArraw(CCmdUI* pCmdUI) pCmdUI-SetCheck(m_DrawMode=1);void CShanView:OnDrawCircle() m_DrawMode=4;void CShanView:OnUpdateDrawCircle(CCmdUI* pCmdUI) pCmdUI-SetCheck( m_DrawMode=4);void CShanView:OnDrawLine() m_DrawMode=2;void CShanView:OnUpdateDrawLine(CCmdUI* pCmdUI) pCmdUI-SetCheck( m_DrawMode=2);void CShanView:OnDrawRect() m_DrawMode=3;void CShanView:OnUpdateDrawRect(CCmdUI* pCmdUI) pCmdUI-SetCheck(m_DrawMode=3);/void CShanView:OnDropFiles(HDROP hDropInfo) / TODO: Add your message handler code here and/or call default/CView:OnDropFiles(hDropInfo);/void CShanView:OnLButtonDown(UINT nFlags, CPoint point) CClientDC dc(this);dc.SetMapMode(MM_LOENGLISH);dc.DPtoLP(&point);m_originp = point; m_oldp = point;CView:OnLButtonDown(nFlags, point); void CShanView:OnMouseMove(UINT nFlags, CPoint point) CClientDC dc(this);dc.SetMapMode(MM_LOENGLISH); dc.DPtoLP(&point);if(m_DrawMode != 0 )CPen *oldPen, pen(PS_DASH,1,RGB(0,0,0);oldPen = dc.SelectObject(&pen);dc.SetROP2(R2_NOTXORPEN);if(nFlags=MK_LBUTTON & m_DrawMode=2)dc.MoveTo(m_originp); dc.LineTo(m_oldp);dc.MoveTo(m_originp); dc.LineTo(point);if(nFlags=MK_LBUTTON & m_DrawMode=3)dc.Rectangle(m_originp.x, m_originp.y, m_oldp.x, m_oldp.y);dc.Rectangle(m_originp.x, m_originp.y, point.x, point.y);if(nFlags=MK_LBUTTON & m_DrawMode=4)dc.Ellipse(m_originp.x, m_originp.y, m_oldp.x, m_oldp.y);dc.Ellipse(m_originp.x, m_originp.y, point.x, point.y);m_oldp=point; dc.SelectObject(oldPen);CView:OnMouseMove(nFlags, point);void CShanView:OnLButtonUp(UINT nFlags, CPoint point) if(m_DrawMode != 0)CShanDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);CClientDC dc(this);dc.SetMapMode(MM_LOENGLISH);dc.DPtoLP(&point);CPen pen(PS_SOLID, m_penWidth, m_penColor);CPen *oldPen = dc.SelectObject(&pen);CBrush brush(m_brushColor);CBrush *oldBrush = dc.SelectObject(&brush);if(m_DrawMode = 2)/dc.MoveTo(m_originp); dc.LineTo(point);MLine *p = new MLine(m_originp, point);pDoc-m_List.Add(p);p-m_brushColor = m_brushColor;p-m_penColor = m_penColor;p-m_penWidth = m_penWidth;p-Draw(&dc);if(m_DrawMode = 3)/dc.Rectangle(m_originp.x, m_originp.y, point.x, point.y);MRect *p = new MRect(m_originp, point);pDoc-m_List.Add(p);p-m_brushColor = m_brushColor;p-m_penColor = m_penColor;p-m_penWidth = m_penWidth;p-Draw(&dc);if(m_DrawMode = 4)/dc.Ellipse(m_originp.x, m_originp.y, point.x, point.y);MCircle *p = new MCircle(m_originp, point);pDoc-m_List.Add(p);p-m_brushColor = m_brushColor;p-m_penColor = m_penColor;p-m_penWidth = m_penWidth;p-Draw(&dc); dc.SelectObject(oldPen);dc.SelectObject(oldBrush);CView:OnLButtonUp(nFlags, point);void CShanView:OnProPencolor() CColorDialog dlg;if(dlg.DoModal() = IDOK)m_penColor = dlg.GetColor();void CShanView:OnProBrushcolor() CColorDialog dlg;if(dlg.DoModal() = IDOK)m_brushColor = dlg.GetColor();void CShanView:OnProPenwidth() Cfgh dlg;dlg.DoModal();if(dlg.DoModal() = IDOK)m_penWidth = dlg.m_Width;void CShanView:OnMaaaaaaa() Cpp/shanDoc.cpp:implementation of the CShanDoc class/#include stdafx.h#include shan.h#include shanDoc.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CShanDoc(5)图形结构的设计图形是矢量图。就是说绘制出来的图形数据是以坐标形式存储,而不是以位图形式存储。对矢量图进行任意倍数的放大缩小,图形不会失真,线粗不变。 所谓线粗不变,是说比如原图线粗是1,无论放大多少倍之后,线粗都是1,仅仅是图像大小变化。 基本功能中只要求单色的线图。就是说只需使用一种颜色作为图形的边线就可以了。图形内部是透明的。不需增加选色功能。并且图形的线粗可以只是1, 不必增加线粗的改变功能。.带颜色的图形。(增加选色功能).线粗不同的图形。(修改线粗的功能)图形的填充色和边线颜色可以不同,由用户选择等等。 例如:画图板的实现View窗口/ shanView.cpp : implementation of the CShanView class#include stdafx.h#include shan.h/#include PenWidthDlg.h#include fgh.h#include shanDoc.h#include shanView.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endifIMPLEMENT_DYNCREATE(CShanView, CView)BEGIN_MESSAGE_MAP(CShanView, CView)/AFX_MSG_MAP(CShanView)ON_COMMAND(IDM_DRAW_ARRAW, OnDrawArraw)ON_UPDATE_COMMAND_UI(IDM_DRAW_ARRAW, OnUpdateDrawArraw)ON_COMMAND(IDM_DRAW_CIRCLE, OnDrawCircle)ON_UPDATE_COMMAND_UI(IDM_DRAW_CIRCLE, OnUpdateDrawCircle)ON_COMMAND(IDM_DRAW_LINE, OnDrawLine)ON_UPDATE_COMMAND_UI(IDM_DRAW_LINE, OnUpdateDrawLine)ON_COMMAND(IDM_DRAW_RECT, OnDrawRect)ON_UPDATE_COMMAND_UI(IDM_DRAW_RECT, OnUpdateDrawRect)ON_WM_DROPFILES()ON_WM_LBUTTONDOWN()ON_WM_MOUSEMOVE()ON_WM_LBUTTONUP()ON_COMMAND(IDM_PRO_PENCOLOR, OnProPencolor)ON_COMMAND(IDM_PRO_BRUSHCOLOR, OnProBrushcolor)ON_COMMAND(IDM_PRO_PENWIDTH, OnProPenwidth)ON_COMMAND(IDMAAAAAAA, OnMaaaaaaa)/AFX_MSG_MAP/ Standard printing commandsON_COMMAND(ID_FILE_PRINT, CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView:OnFilePrintPreview)END_MESSAGE_MAP()/ CShanView construction/destructionBOOL CShanView:OnPreparePrinting(CPrintInfo* pInfo)/ default preparationreturn DoPreparePrinting(pInfo);void CShanView:OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)/ TODO: add extra initialization before printingvoid CShanView:OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)/ TODO: add cleanup after printing/ CShanView diagnostics#ifdef _DEBUGvoid CShanView:AssertValid() constCView:AssertValid();void CShanView:Dump(CDumpContext& dc) constCView:Dump(dc);CShanDoc* CShanView:GetDocument() / non-debug version is inlineASSERT(m_pDocument-IsKindOf(RUNTIME_CLASS(CShanDoc);return (CShanDoc*)m_pDocument;#endif /_DEBUG/ CShanView message handlersIMPLEMENT_DYNCREATE(CShanDoc, CDocument)IMPLEMENT_SERIAL(MShape,CObject,1)IMPLEMENT_SERIAL(MLine,MShape,1)IMPLEMENT_SERIAL(MRect,MShape,1)IMPLEMENT_SERIAL(MCircle,MShape,1)BEGIN_MESSAGE_MAP(CShanDoc, CDocument)/AFX_MSG_MAP(CShanDoc)/ NOTE - the ClassWizard will add and remove mapping macros here./ DO NOT EDIT what you see in these blocks of generated code!/AFX_MSG_MAPEND_MESSAGE_MAP()/ CShanDoc construction/destructionCShanDoc:CShanDoc()/ TODO: add one-time construction code hereCShanDoc:CShanDoc()for(int i = 0; i m_List.GetSize(); i+)MShape *shape = (MShape*)m_Listi;delete shape;m_List.RemoveAll();BOOL CShanDoc:OnNewDocument()if (!CDocument:OnNewDocument()return FALSE;for(int i = 0; i m_List.GetSize(); i+)MShape *shape = (MShape*)m_Listi;delete shape;m_List.RemoveAll();/ (SDI documents will reuse this document)return TRUE;/ CShanDoc serializationvoid CShanDoc:Serialize(CArchive& ar)if (ar.IsStoring() m_List.Serialize(ar);elsem_List.Serialize(ar);/ CShanDoc diagnostics#ifdef _DEBUGvoid CShanDoc:AssertValid() constCDocument:AssertValid();void CShanDoc:Dump(CDumpContext& dc) constCDocument:Dump(dc);#endif /_DEBUG/ CShanDoc commands图4 画图板的实现示例(6)对话框的实现 定义一个对话框资源。在WORKSPACE窗口当中RESOURCE一页,在DIALOG小图标上面单击鼠标右键,弹出菜单,选择INSERT命令,图5 对话框的实现(1)接下来在弹出的资源类型对话框中选择DIALOG,表示添加一个对话框资源。单击NEW按钮。接下来我们就开始布置这个对话框。对话框上面已经有了两个按钮:OK和CANCEL。 图6 对话框的实现(2) 对话框中控件与成员变量之间如何进行数据交换DoDataExchange函数就是对话框类和对话框资源进行DDX数据交换的函数。在对话框初始化的时候或者在程序中调用UpdateData()函数的时候,这个函数将会被调用。DDX_TEXT这个函数可以处理
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 消费贷受托支付合同范本
- 物流车队调动协议书范本
- 网约出租车买卖合同范本
- 销售合伙人模式合同范本
- 清洗窗帘合同协议书模板
- 离婚协议女方补偿协议书
- 海鲜店合作协议合同范本
- 长期租地建房合同协议书
- 甲方授权乙方的合同范本
- 美业学员合同协议书范本
- 2025春季学期国家开放大学本科《国际私法》一平台在线形考(形考任务1至5)试题及答案
- 风电运维安全培训内容课件
- 体育设备采购项目方案投标文件(技术方案)
- 《癫痫疾病分类》课件
- 烘焙技巧培训课程行业深度调研及发展战略咨询报告
- 经前期综合征课件
- 2025-2030中国期货行业市场深度分析及竞争格局与投资发展研究报告
- 2024年秋新鲁科版三年级上册英语 Unit 1 lesson 1 教学课件
- 顶管工程监理实施细则
- 智慧树知到《中国历史地理(北京大学)》2025章节测试附答案
- 如何经营管理一家酒店
评论
0/150
提交评论