版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、VC+ 入门与提高,主讲教师:贾澎涛,第六章 应用实例之一编写一个具有实用功能的字处理软件,本篇经典 文档和视图是怎样联系起来的? 如何为程序添加查找、替换等功能? 为什么在某些程序新创建的菜单中只输入了一个菜单ID标识就可以实现某一种功能? 为什么在应用程序的菜单中有的菜单是灰的? 怎样为程序添加一个浮动菜单? 如何在“帮助关于”对话框中添加系统信息? 怎样为应用程序做一个每日提示(在程序启动时显示)?,8. 如何动态修改菜单? 9. 怎样为应用程序增加一个日历? 10. 如何使EditSoft应用程序成为多文档程序? 11. 怎样修改应用程序标题栏上的显示文字? 12. 怎样使应用程序以最
2、大化窗口显示? 13. 怎样在应用程序的状态条上显示时间? 14. 如何使应用程序窗口左上角标题栏上的应用程序图标动起来? 15. 怎样使应用程序支持拖放功能? 16. 怎样建立一个文件打开、保存对话框?,17. 如何使用字体、颜色对话框? 18. 如何处理文字输入? 19. 如何在字处理编辑器中增加一个插入符? 20. 如何使应用程序窗口滚动? 21. 如何处理方向键、翻页键等虚键操作? 22. 如何实现字符串的复制、粘贴? 23. 如何为文档增加打印功能? 24. 如何实现应用程序数据的读出和写入?,6.1 程序创建过程,(1)用AppWizard新建一个项目,EditSoft。 (2)在
3、第1步选择单文档类型。 (3)在应用程序生成向导的第2、3步选择保留缺省值。 (4)在第4步改扩展名(通过选择高级选项,你可以用AppWizard设定支持的文本文档的扩展名为TXT)。 (5)第5步选择保留缺省值. (6)MFC AppWizardStep 6是生成EditSoft应用程序的关键,在应用程序新生成的类的列表框中选择视图类(CEditSoftView),在基类名(Base Class)下拉列表框选择CEditView类,其与保留缺省值。 (7)选择完成,编译连接并执行EditSoft程序。,1.文档和视图是怎样联系起来的?,在文档视图结构的应用程序中,文档类和视图类常常需要进行相
4、互之间数据的交换和引用,这就需要采用一种办法实现两者见数据的通信。视图对象通常只有一个与之相联系的文档对象,利用它所包含的成员函数GetDocument()函数可以在视图类中得到与之相联系的文档。在几乎所有视图类的显示函数OnDraw(CDC* pDC)中,都有一个指向文档类的指针。利用它我们就可以对文档类的成员函数以及公共数据成员进行访问。,打开EditSoft应用程序的视图类CEditSoftView的实现文件“EditSoftView.cpp”,找到以下代码: void CEditSoftView:OnDraw(CDC* pDC) CEditSoftDoc* pDoc = GetDocu
5、ment(); /获取文档数据 ASSERT_VALID(pDoc); / TODO: add draw code for native data here /CView:GetDocument CDocument* GetDocument( ) const; Call this function to get a pointer to the views document. This allows you to call the documents member functions.,同样在应用程序的文档类CDocument中也有一个UpdateAllViews()成员函数,用来向视图类传递
6、消息。一旦文档数据发生了变化,所有与该文档相关联的视图都通过此函数取得通知,对其所显示的的数据进行更新。 /CDocument:UpdateAllViews void UpdateAllViews( CView* pSender, LPARAM lHint = 0L, CObject* pHint = NULL ); Call this function after the document has been modified.,2.如何为程序添加查找、替换等功能?,添加查找功能 (1)打开ResourceView,打开IDR_MAINFRAME; (2)为“编辑”菜单添加“查找”菜单项,并将
7、ID设为“ID_EDIT_FIND”,注意提示(prompt)编辑框的变化。 (3)编译、连接运行。 添加替换功能 (1)打开ResourceView,打开IDR_MAINFRAME; (2)为“编辑”菜单添加“替换”菜单项,并将ID设为“ID_EDIT_REPLACE”,注意提示(prompt)编辑框和标题框的变化。 (3)编译、连接运行。,练习,按照上述办法在“编辑”菜单下加入以下菜单:,3.为什么在某些程序新创建的菜单中只输入了一个菜单ID标识就可以实现某一种功能?,在前面我们为EditSoft应用程序所增加的任何功能都只在资源编辑中添加了菜单ID标识,而没有添加任何执行代码,但应用程序
8、的每一个菜单仍然具有应有的功能。为什么呢? MFC定义的消息进程继承类似于类的继承树。如果一个类没有提供某个特殊消息的消息处理函数,则消息通过树传到父类,进程持续下去直至消息映射所有的基类都被搜索一遍。如果没有一个类处理该消息,它就由缺省进程处理。,在EditSoft应用程序中,由于其视图类是从CEditView基类继承而来,在类CEditView中已经对诸如“查找”、“替换”等功能进行了处理。即使在CEditSoftView中没有对这些功能进行处理,所定义的ID标识仍将使MFC追溯到其基类CEditView和CView的消息处理函数,由基类的处理函数代为响应。 MFC为进一步扩展其重复使用性
9、,它为大多数Windows应用程序中的应用很广的命令提供了缺省操作,大多数缺省操作的命令同时也被包含在由AppWizard产生的缺省菜单中。 以下是在MFC中有缺省操作的菜单命令:,文件菜单:New, Open, Close, Save, Page Setup, Print, Print Preview, Exit等; 编辑菜单:Clear,Clear All, Copy, Cut, Find, Paste, Repeat, Replace, Undo, Redo等。 视图菜单:Toolbar,Statusbar等 窗口菜单:Arrange Casecade, Tile, Horizontal
10、 tile, Vertical tile等; 帮助菜单:Index, Using, Help, About等。,4.为什么在应用程序的菜单中有的菜单是灰的?,命令更新机制:在程序显示一个菜单前,先检查该菜单的所有条件,再决定如何显示该菜单。 ON_UPDATE_COMMAND_UI 宏:负责将用户界面元素和命令更新程序连接起来。 CCmdUI(参看MSDN),5.怎样为程序添加一个浮动菜单?,方法一 (1)在资源编辑器中编辑一个菜单资源,使用缺省的也可。 (2)打开ClassWizard,为一个窗口类或其派生类添加消息“WM_CONTEXTMENU”。 (3)在系统生成的消息处理函数中添加如下
11、代码:,CMenu *pFileMenu=GetMenu()-GetSubMenu(2); ClientToScreen(,如果是新建的菜单,则只需添加如下代码(其中IDR_MENU1是新建菜单ID) CMenu menu; menu.LoadMenu(IDR_MENU1); CMenu *pFileMenu=menu.GetSubMenu(0); ClientToScreen(,/CMenu:TrackPopupMenu BOOL TrackPopupMenu( UINT nFlags, int x, int y, CWnd* pWnd, LPCRECT lpRect = NULL ); R
12、emarks Displays a floating pop-up menu at the specified location and tracks the selection of items on the pop-up menu. A floating pop-up menu can appear anywhere on the screen.,方法二,(1)新建一个项目 (2)选择“ProjectAdd to ProjectComponents and Controls”将出现组件和控件库对话框,双击部件文件夹(Visual C+ Components),选择Pop-up Menu,双
13、击。 (3)在询问是否加入Pop-Menu部件,单击确定,确认加入该控件 (4)在弹出的对话框中选择要加入的类及菜单ID,单击“OK”完成,练习,为一个新建项目添加浮动菜单。要求采用两种方法。,6.如何在“帮助关于”对话框中添加系统信息?,(1)打开项目EditSoft (2)选择“ProjectAdd to ProjectComponents and Controls”将出现组件和控件库对话框,双击部件文件夹(Visual C+ Components),选择System Info for About Dlg,双击。在弹出的对话框上击确定,将返回到“Components and Control
14、s Gallery”,单击“Close”,插入过程完成。 (3)修改对话框资源,为“IDD_ABOUTBOX”增加两个静态文本控件用以进行信息提示,一个是“物理内存”,另一个是“硬盘可用空间”。,(4)再添加两个静态文本控件,给定ID分别为“IDC_PHYSICAL_MEM”和“IDC_DISK_SPACE”。按“Ctrl+T”预览对话框。 (5)修改CAboutDlg的初始化函数BOOL CAboutDlg:OnInitDialog(),然后编译运行。 添加如下代码: /TODO: Add a static control to your About Box to receive the m
15、emory / information. Initialize the control with code like this: SetDlgItemText(IDC_PHYSICAL_MEM, strFreeMemory); / Fill disk free information /TODO: Add a static control to your About Box to receive the memory / information. Initialize the control with code like this: SetDlgItemText(IDC_DISK_SPACE,
16、 strFreeDiskSpace); /Sets the caption or text of a control owned by a window or dialog box.,7.怎样为应用程序做一个每日提示(在程序启动时显示)?,(1)打开工程项目EditSoft; (2)选择“ProjectAdd to ProjectComponents and Controls”将出现组件和控件库对话框,双击部件文件夹(Visual C+ Components),选择Tip of the day,双击。出现插入部件确认对话框,选择“确定”,出现部件类的实现文件和头文件的文件名对话框,保留缺省值,
17、选择“OK”按钮。 (3)将返回到“Components and Controls Gallery”,单击“Close”,插入过程完成。 (4)编译、连接并运行。,(5)运行时发现屏幕上显示“提示文件”在指定目录中不存在的信息(Tips file does not exist in the prescribed directory),并且下一提示“Next Tip”按钮变灰。为什么? (6)打开类CTipDlg类的构造函数,发现,每日提示部件是在读入了一个称为“tips.txt”的文本文件后,将文本文件的内容赋给一个变量FILE m_pStream,然后在成员函数void CTipDlg:Ge
18、tNextTipString(CString /取得框架菜单的第4项“帮助” 编译运行查看运行结果。 仿照前面汉化“CG_IDS_TIPOFTHEDAYMENU”和“CG_IDS_TIPOFTHEDAYHELP”。,MFC提供的菜单类CMenu为动态修改菜单提供了几个有用的函数,GetSubMenu():得到菜单内的弹出式菜单(子菜单) GetMenuItemCount():取得菜单内菜单项的个数 AppendMenu():在菜单的尾部添加一个菜单项 Insertmenu():在菜单内某一个位置插入一个菜单项 DeleteMenu():删除一个菜单项 ModifyMenu():修改一个菜单项
19、以上的成员函数用法参看教材8.1节及MSDN。,练习,(1)新建一个项目,为其“帮助关于”对话框添加系统信息。 (2)为该程序做一个每日提示。 (3)动态的为该项目添加菜单项。,9.怎样为应用程序增加一个日历?,在VC+ 6.0中,微软公司为广大程序员提供了丰富的控件,控件是系统封装的能完成特定功能的单元。使用控件不仅能使界面美观、标准,而且可以大大的减少编程的工作量。(控件的介绍参看教材第11、12章。) 在这里我们通过对日历控件的学习,使大家可以掌握控件的使用方法。,添加日历控件的步骤,(1)打开EditSoft,打开ResourceViewDialog,右键单击对话框(Dialog)标识
20、,弹出一个浮动菜单,选择插入对话框(Insert Dialog)菜单,系统将生成一个IDD_DIALOG1对话框,将其ID修改为IDD_DIALOGCALENDAR。 (2)编辑对话框外观。打开菜单:ViewFull Screen,对话框资源将呈现在整个屏幕中。调整大小到合适位置。选择“Cancel”,按下键盘“Del”键删除。将“OK”按钮拖动到对话框的下方。在控件工具栏上找到“Month Calendar”控件,拖到对话框上,调整位置大小。 (3)在日历控件上单击右键,选择属性,选择“扩展样式(Extend Styles)”,选择“Client edge”和“Modal Frame”复选框
21、。按Enter返回。,(4)修改对话框的英文标题为汉字。右键单击新建对话框,选择“属性”菜单项,选择常用(General)选项页,ID为IDD_DIALOGCALENDAR,修改其标题。同样方法修改汉化“OK”按键。 (5)为新建对话框生成一个类。双击对话框(或右键单击选择ClassWizard菜单项。 ClassWizard检测到这是一个新建的对话框资源,立即询问是否新建一个类或者选择一个已有的类。在弹出的的对话框中采用缺省设置(Create a new class)击OK。在弹出的New Class对话框中输入类名CCalendarDlg,其它保持默认值。 (6)为启动日历对话框新建一个菜
22、单。 打开ResourceView的菜单资源,左键双击ID标识IDR_MAINFRAME,在帮助菜单的下拉式空白框中双击左键,在弹出的对话框中输入ID:ID_HELP_CALENDARDLG,Caption:日历。,(7)为启动日历对话框定义一个快捷键。打开ResourceView的加速键编辑器(Accelerator),选择新建加速键。在ID中输入:ID_HELP_CALENDARDLG,在键值(Key)中输入H,其它选项保留缺省值。 (8)在视图类的头文件中加入日历对话框类的头文件引用:#include “CalendarDlg.h”. (9)增加ID_HELP_CALENDARDLG消息
23、的消息处理函数。添加如下代码: void CEditSoftView:OnHelpCalenderdlg() CCalendarDlg dlg; dlg.DoModal(); (10)编译连接并执行。,10. 如何使EditSoft应用程序成为多文档程序?,单文档和多文档程序重要的区别就是文档模板和框架。 (1)增加文档模板成员变量CMultiDocTemplate *m_pDocTemplate; (2)在应用类的构造函数中添加如下代码: m_pDocTemplate=NULL; (3)在应用类的初始化函数InitInstance中作修改。删除原来的单文档模板,新建一个多文档模板。 m_pD
24、ocTemplate = new CMultiDocTemplate( IDR_MAINFRAME,RUNTIME_CLASS(CEditSoftDoc), RUNTIME_CLASS(CMainFrame), RUNTIME_CLASS(CEditSoftlView); AddDocTemplate(m_pDocTemplate);,(4)在框架类中重载函数LoadFrame,添加代码。 if(!CFrameWnd:LoadFrame(nIDResource, dwDefaultStyle, pParentWnd, pContext) return FALSE; CWinApp *pApp=
25、AfxGetApp(); if(pApp-m_pMainWnd=NULL) pApp-m_pMainWnd=this; return TRUE; (5)为应用类添加ID_FILE_NEW的消息映射,添加如下代码,编译连接。,ASSERT(m_pDocTemplate!=NULL); CDocument *pDoc=NULL; CFrameWnd *pFrame=NULL; pDoc=m_pDocTemplate-CreateNewDocument(); if(pDoc!=NULL) pFrame=m_pDocTemplate-CreateNewFrame(pDoc,NULL); if(pFra
26、me!=NULL) m_pDocTemplate-SetDefaultTitle(pDoc); if(!pDoc-OnNewDocument() pFrame-DestroyWindow(); else m_pDocTemplate-InitialUpdateFrame(pFrame,pDoc,TRUE); else delete pDoc; if(pFrame=NULL|pDoc=NULL) AfxMessageBox(AFX_IDP_FAILED_TO_CREATE_DOC);,11.怎样修改应用程序标题栏上的显示文字?,缺省情况下,应用程序标题栏上显示“无标题”,实际上,它是一个用字符创
27、表示的结构。 EditSoftnnEditSonnnEditSoft.DocumentnEditSo Document 该字符串分成了7段,每段用n分开,各段意义如下:,要修改标题栏的内容或文件打开(关闭)对话框的过滤器中的显示内容,只须在字符串表编辑器对此项目进行重新编辑即可。 (1)打开String Table,找到IDR_MAINFRAME,双击。 (2)在弹出的String Properties对话框Caption中输入:文本编辑器nEditnEditSonnn nEditSoft.DocumentnEditSo Document (3)编译连接并执行。 该字符串的设置还可通过MFC
28、AppWizardStep 4 of 6的“Advanced”进行设置。,12.怎样使应用程序以最大化窗口显示?,方法一:通过MFC AppWizardStep 4 of 6的“Advanced”进行设置。 方法二:通过在函数BOOL CMainFrame:PreCreateWindow(CREATESTRUCT ,方法三:另一种方法是在将应用程序类的InitInstance()中的ShowWindow()函数,改成下面这样。 pMainFrame-ShowWindow(SW_SHOWMAXIMIZED); pMainFrame-UpdateWindow();,说明,The CREATESTR
29、UCT structure defines the initialization parameters passed to the window procedure of an application. The GetSystemMetrics function retrieves various system metrics (widths and heights of display elements) and system configuration settings. All dimensions retrieved by GetSystemMetrics are in pixels.
30、 SM_CXSCREEN, SM_CYSCREEN Width and height, in pixels, of the screen of the primary display monitor.,13.怎样在应用程序的状态条上显示时间?,(1)打开EditSoft工程项目 (2)打开CMainFrame的实现文件“MainFrm.cpp”,找到窗口创建函数:int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct) ,加入以下代码:,/设置状态条的第三个框的宽度为100 m_wndStatusBar.SetPaneInfo(2,ID_SE
31、PARATOR,SBPS_NORMAL,100); /定义显示时间字符串 char strMsg250; /取得当前时间 CTime time=CTime:GetCurrentTime(); /将时间格式转换成字符串 sprintf(strMsg,启动时刻:%02d:%02d:%02d, time.GetHour(),time.GetMinute(),time.GetSecond(); /显示时间 m_wndStatusBar.SetPaneText(2,strMsg);,说明,m_wndStatusBar是CStatusBar对象,在Mainfrm.h中定义。 CStatusBar:SetP
32、aneInfo void SetPaneInfo( int nIndex, UINT nID, UINT nStyle, int cxWidth ); Sets the specified indicator pane to a new ID, style, and width. CStatusBar:SetPaneText BOOL SetPaneText( int nIndex, LPCTSTR lpszNewText, BOOL bUpdate = TRUE ); Sets the pane text to the string pointed to by lpszNewText,练习,
33、在状态栏内显示鼠标位置 为程序的视图类添加WM_MOUSEMOVE窗口消息处理函数,添加如下代CMainFrame* pFrame=(CMainFrame*)(AfxGetApp()-m_pMainWnd); pFrame-m_wndStatusBar.SetPaneInfo(2,ID_SEPARATOR,SBPS_NORMAL,50); char strMsg25; /定义显示鼠标字符串 sprintf(strMsg, %03d,%03d,point.x,point.y);/把鼠标点拷贝到缓冲区 pFrame-m_wndStatusBar.SetPaneText(2,strMsg); /显示
34、鼠标 在视图类中添加框架类头文件MainFrm.h 修改框架类的m_wndStatusBar为公有数据类型。,14.如何使应用程序窗口左上角标题栏上的应用程序图标动起来?,(1)编辑四个图标资源 (2)为类CMainFrame增加时间成员变量。 public: CTime m_tstart; CTime m_tnow; (3)为CMainFrame添加成员函数,void CMainFrame:LoadNewIcon(UINT nIconID) HICON hIconNew=AfxGetApp()-LoadIcon(nIconID); HICON hIconOld=(HICON)GetClass
35、Long(m_hWnd,GCL_HICON); ASSERT(hIconNew); ASSERT(hIconOld); if(hIconNew!=hIconOld) DestroyIcon(hIconOld); SetClassLong(m_hWnd,GCL_HICON,(long)hIconNew); RedrawWindow(NULL,NULL,RDW_FRAME|RDW_ERASE|RDW_INVALIDATE); ,(4)在主框架类的int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct)函数中添加一个定时器。 SetTimer(0,
36、200,NULL); (5)为框架类添加WM_TIMER的消息处理函数。,void CMainFrame:OnTimer(UINT nIDEvent) CTime t=CTime:GetCurrentTime(); m_tnow=t; CTimeSpan ts=m_tnow-m_tstart; if(ts.GetTotalSeconds()=5) m_tstart=m_tnow; if(ts.GetTotalSeconds()=2) static int icons=IDI_ICON1,IDI_ICON2,IDI_ICON3,IDI_ICON4; static long index=0; Lo
37、adNewIcon(iconsindex+%4); else LoadNewIcon(IDR_MAINFRAME); ,15.怎样使应用程序支持拖放功能?,(1)打开EditSoft工程项目 (2)打开BOOL CEditSoftApp:InitInstance(),在其中添加以下代码: m_pMainWnd-DragAcceptFiles();/拖放文件 return TRUE; /*CWnd:DragAcceptFiles void DragAcceptFiles( BOOL bAccept = TRUE ); Call this member function from within a
38、 window, using a CWnd pointer, in your applications CWinApp:InitInstance function to indicate that the window accepts dropped files from the Windows File Manager or Windows Explorer.*/,16.怎样建立一个文件打开、保存对话框?,文件打开、保存对话框就是一个文件操作对话框类CFileDialog, CFileDialog类用于实现文件选择对话框,以支持文件的打开和保存操作。用户要打开或保存文件,就会和文件选择对话框
39、打交道。文件选择对话框的创建过程与一般对话框的类似,首先是在堆栈上构建一个CFileDialog对象,然后调用CFileDialog:DoModal( )来启动对话框。文件对话框的构造函数为 CFileDialog( BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL );,其中,参数的含义如下: bOpenFileDialog:如果参数bOpenFileDialog的值为TRUE,将创建Open(打开文件)对话框,否则就创建Save As(保存文件)对话框。 lpszDefExt用来指定缺省的文件扩展名。 lpszFileName用于规定初始文件名。 dwFlags用于设置对话框的一
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 包抓联工作制度
- 信息工作制度
- 传染病工作制度
- 中成药工作制度
- 初中团工作制度
- 包楼栋工作制度
- 优抚工作制度
- 医美科工作制度
- 修剪队工作制度
- 三站工作制度
- 移动模架施工安全监理实施细则
- 中兴新云2026年测评-B套题
- 分岗设权内部控制制度
- 2026年全国体育单招考试时事政治(2025.6-2026.1)-2026届中职高考
- 2026年山西经贸职业学院单招职业技能考试题库及答案解析
- 2026年丽水职业技术学院单招职业适应性考试题库带答案详解(基础题)
- 2025年广东中烟工业机电岗位笔试及答案
- 野生动物种源基地及繁育中心建设项目可行性实施报告
- M30注浆砂浆配合比计算资料
- 《现代汉语语法词类》PPT课件(完整版)
- 云南普通初中学生成长记录-基本素质发展初一-初三备课讲稿
评论
0/150
提交评论