VC++记事本实验报告.docx
《VC++记事本实验报告.docx》由会员分享,可在线阅读,更多相关《VC++记事本实验报告.docx(24页珍藏版)》请在冰豆网上搜索。
VC++记事本实验报告
西安科技大学计算机学院
VC++程序设计实验报告
题目科学计算器
学号
专业及班级计科0804
姓名
日期2010-11-03
一、
实验内容
参考Windows自带记事本,做一个超级记事本程序,使其具有添加字体颜色、背景颜色、等设置。
通过这个过程掌握如何使用VC++设计文本程序,熟练VC++中的一些编程技巧。
二、设计思路
1.文档类的方法
CDocument类提供了文档类所需要的最基本的功能实现。
它提供的方法主要有一般方法和虚拟方法。
表2-1是CDocument中的一般方法。
方法
说明
GetTitle()
SetTitle()
GetPathName()
SetPathName()
GetDocTemplate()
AddView()
RemoveView()
UpdateAllViews()
DisconnectViews()
GetFile()
获得文档标题
设置文档标题
获得文档数据文件的路径字符串
设置文档数据文件的路径字符串
获得指向描述文档类型的文档模板的指针
向与文档相关联的视图列表添加指定的视图
从文档视图列表中删除视图
通知所有视图文档已被修改,应该重画
使文档与视图分离
获得指向CFile类型的指针
表2-1CDocument中的一般方法
CDocument类提供的虚拟方法,使应用程序可以重写虚拟函数来提供CDocument派生类中的方法。
CDocument的虚拟方法的具体说明如表2-2所示。
方法
说明
OnNewDocument()
OnOpenDocument()
OnSaveDocument()
OnCloseDocument()
CanCloseFrame()
PreCloseFrame()
DeleteContents()
ReleaseFile()
SaveModified()
IsModified()
SetModifiedFlag()
GetFirstViewPosition()
GetNextView()
由MFC调用来建立文档
由MFC调用来打开文档
由MFC调用来保存文档
由MFC调用来关闭文档
确定观察文档的框架窗口是否被允许关闭
在关闭框架窗口过程中调用该函数以询问用户要求
在未撤销文档对象时删除文档数据
释放文件以允许其他应用程序使用
查询文档的修改状态并存储修改的文档
确定文档从它最后一次存储后是否被修订过
设置文档从它最后一次存储后是否被修订过的布尔值
获得视图列表头的位置
获得视图列表的下一个视图
表2-2CDocument中的虚拟方法
2.文档的建立、打开或保存。
建立或者打开文档的流程如图2-3所示。
保存文档的流程如图2-4所示。
图2-3建立或打开文档
图2-4保存文档
2.视图类的方法
表2-5所示是CView中的一般方法。
方法
说明
GetDocument()
DoPreparePrinting()
获得指向与视图相关联的文档的指针
初始化视图窗口
表2-5CView中的一般方法
CView类提供的虚拟方法使应用程序可以重写它们来提供CView派生类中的方法。
CView的虚拟方法的具体说明如表2-6所示。
方法
说明
IsSelected()
OnScroll()
OnInitialUpdate()
OnDraw()
OnUpdate()
OnPrepareDC()
确定文档是否被选中
当操作视图窗口的滚动条时被调用
第一次更新视图窗口时被调用
重绘视图窗口时被调用
更新视图窗口时被调用
在调用OnDraw()前修改设备环境表
表2-6CView中的虚拟方法
3.视图类的派生类
CEditView类
CRichCEditView类
CTreeView类
CListView类
CScrollView类
三、代码实现
A.主要代码实现
1.在“帮助\关于…”对话框中添加系统信息
(1)打开项目EditSoft
(2)选择“Project\AddtoProject\ComponentsandControls…”将出现组件和控件库对话框,双击部件文件夹(VisualC++Components),选择SystemInfoforAboutDlg,双击。
在弹出的对话框上击确定,将返回到“ComponentsandControlsGallery”,单击“Close”,插入过程完成。
(3)修改对话框资源,为“IDD_ABOUTBOX”增加两个静态文本控件用以进行信息提示,一个是“物理内存”,另一个是“硬盘可用空间”。
(4)再添加两个静态文本控件,给定ID分别为“IDC_PHYSICAL_MEM”和“IDC_DISK_SPACE”。
按“Ctrl+T”预览对话框。
(5)修改CAboutDlg的初始化函数BOOLCAboutDlg:
:
OnInitDialog(),然后编译运行。
添加如下代码:
…
//TODO:
AddastaticcontroltoyourAboutBoxtoreceivethememory
//information.Initializethecontrolwithcodelikethis:
SetDlgItemText(IDC_PHYSICAL_MEM,strFreeMemory);
//Filldiskfreeinformation
…
//TODO:
AddastaticcontroltoyourAboutBoxtoreceivethememory
//information.Initializethecontrolwithcodelikethis:
SetDlgItemText(IDC_DISK_SPACE,strFreeDiskSpace);
//Setsthecaptionortextofacontrolownedbyawindowordialogbox.
2.为应用程序做一个每日提示(在程序启动时显示)
(1)打开工程项目EditSoft;
(2)选择“Project\AddtoProject\ComponentsandControls…”将出现组件和控件库对话框,双击部件文件夹(VisualC++Components),选择Tipoftheday,双击。
出现插入部件确认对话框,选择“确定”,出现部件类的实现文件和头文件的文件名对话框,保留缺省值,选择“OK”按钮。
(3)将返回到“ComponentsandControlsGallery”,单击“Close”,插入过程完成。
(4)编译、连接并运行。
(5)运行时发现屏幕上显示“提示文件”在指定目录中不存在的信息(Tipsfiledoesnotexistintheprescribeddirectory),并且下一提示“NextTip”按钮变灰。
为什么?
(6)打开类CTipDlg类的构造函数,发现,每日提示部件是在读入了一个称为“tips.txt”的文本文件后,将文本文件的内容赋给一个变量FILE*m_pStream,然后在成员函数voidCTipDlg:
:
GetNextTipString(CString&strNext)中读入一个个字符串m_strTip,再通过一个静态文本空间,通过对话框数据交换技术显示出来的。
(7)因此,我们必须编辑一个纯文本文件“tips.txt”,加入项目目录中。
3.为应用程序增加一个日历
(1)打开EditSoft,打开ResourceView\Dialog,右键单击对话框(Dialog)标识,弹出一个浮动菜单,选择插入对话框(InsertDialog)菜单,系统将生成一个IDD_DIALOG1对话框,将其ID修改为IDD_DIALOGCALENDAR。
(2)编辑对话框外观。
打开菜单:
View\FullScreen,对话框资源将呈现在整个屏幕中。
调整大小到合适位置。
选择“Cancel”,按下键盘“Del”键删除。
将“OK”按钮拖动到对话框的下方。
在控件工具栏上找到“MonthCalendar”控件,拖到对话框上,调整位置大小。
(3)在日历控件上单击右键,选择属性,选择“扩展样式(ExtendStyles)”,选择“Clientedge”和“ModalFrame”复选框。
按Enter返回。
(4)修改对话框的英文标题为汉字。
右键单击新建对话框,选择“属性”菜单项,选择常用(General)选项页,ID为IDD_DIALOGCALENDAR,修改其标题。
同样方法修改汉化“OK”按键。
(5)为新建对话框生成一个类。
双击对话框(或右键单击选择ClassWizard菜单项。
ClassWizard检测到这是一个新建的对话框资源,立即询问是否新建一个类或者选择一个已有的类。
在弹出的的对话框中采用缺省设置(Createanewclass)击OK。
在弹出的NewClass对话框中输入类名CCalendarDlg,其它保持默认值。
(6)为启动日历对话框新建一个菜单。
打开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消息的消息处理函数。
添加如下代码:
voidCEditSoftView:
:
OnHelpCalenderdlg()
{
CCalendarDlgdlg;
dlg.DoModal();
}
(10)编译连接并执行。
4.使EditSoft应用程序成为多文档程序
单文档和多文档程序重要的区别就是文档模板和框架。
(1)在应用类增加文档模板成员变量CMultiDocTemplate*m_pDocTemplate;
(2)在应用类的构造函数中添加如下代码:
m_pDocTemplate=NULL;
(3)在应用类的初始化函数InitInstance中作修改。
删除原来的单文档模板,新建一个多文档模板。
m_pDocTemplate=newCMultiDocTemplate(
IDR_MAINFRAME,RUNTIME_CLASS(CEditSoftDoc),
RUNTIME_CLASS(CMainFrame),
RUNTIME_CLASS(CEditSoftView));
AddDocTemplate(m_pDocTemplate);
(4)在框架类中重载函数LoadFrame,添加代码。
if(!
CFrameWnd:
:
LoadFrame(nIDResource,dwDefaultStyle,pParentWnd,pContext))
returnFALSE;
CWinApp*pApp=AfxGetApp();
if(pApp->m_pMainWnd==NULL)
pApp->m_pMainWnd=this;
returnTRUE;
(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(pFrame!
=NULL)
{
m_pDocTemplate->SetDefaultTitle(pDoc);
if(!
pDoc->OnNewDocument())
{
pFrame->DestroyWindow();
}
else
m_pDocTemplate->InitialUpdateFrame(pFrame,pDoc,TRUE);
}
else
deletepDoc;
}
if(pFrame==NULL||pDoc==NULL)
AfxMessageBox(AFX_IDP_FAILED_TO_CREATE_DOC);
5.在应用程序的状态条上显示时间
(1)打开EditSoft工程项目
(2)打开CMainFrame的实现文件“MainFrm.cpp”,找到窗口创建函数:
intCMainFrame:
:
OnCreate(LPCREATESTRUCTlpCreateStruct)
加入以下代码:
//设置状态条的第三个框的宽度为100
m_wndStatusBar.SetPaneInfo(2,ID_SEPARATOR,SBPS_NORMAL,100);
//定义显示时间字符串
charstrMsg[250];
//取得当前时间
CTimetime=CTime:
:
GetCurrentTime();
//将时间格式转换成字符串
sprintf(strMsg,"启动时刻:
%02d:
%02d:
%02d",
time.GetHour(),time.GetMinute(),time.GetSecond());
//显示时间
m_wndStatusBar.SetPaneText(2,strMsg);
6.使应用程序窗口左上角标题栏上的应用程序图标动起来
(1)编辑三个图标资源
(2)为类CMainFrame增加时间成员变量。
public:
CTimem_tstart;
CTimem_tnow;
(3)为CMainFrame添加成员函数
voidCMainFrame:
:
LoadNewIcon(UINTnIconID)
{
HICONhIconNew=AfxGetApp()->LoadIcon(nIconID);
HICONhIconOld=(HICON)GetClassLong(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)在主框架类的intCMainFrame:
:
OnCreate(LPCREATESTRUCTlpCreateStruct)函数中添加一个定时器。
SetTimer(0,500,NULL);
(5)为框架类添加WM_TIMER的消息处理函数。
voidCMainFrame:
:
OnTimer(UINTnIDEvent)
{
staticinticons[]={IDI_ICON1,IDI_ICON2,IDI_ICON3};
staticlongindex=0;
LoadNewIcon(icons[index++%3]);
}
7.使应用程序支持拖放功能
(1)打开EditSoft工程项目
(2)打开BOOLCEditSoftApp:
:
InitInstance(),在其中添加以下代码:
m_pMainWnd->DragAcceptFiles();//拖放文件
returnTRUE;
}
8.建立一个文件打开、保存对话框
(1)建立一个以对话框为基础的应用程序,或新建一个对话框。
添加一个按钮,为按钮添加消息处理函数。
(2)在对话框类声明中添加一个字符串变量,以存放文本:
Public:
CStringm_txtString;
(3)在按钮消息处理函数中加入如下代码:
charszFilter[]="TxtFile(*.txt)|*.txt|AllFiles(*.*)|*.*||";
TCHARbuffer[256];
staticintnIndex=1;
CStringPathName;
CStringm_txtString;
CFileDialogFileDlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,szFilter);
FileDlg.m_ofn.nFilterIndex=(DWORD)nIndex;
if(FileDlg.DoModal()==IDOK)
{
PathName=FileDlg.GetPathName();
PathName.MakeUpper();
nIndex=(int)FileDlg.m_ofn.nFilterIndex;
CStdioFilefile(PathName,CFile:
:
modeRead|CFile:
:
typeText);
longcount=0;
longlength=file.GetLength();
longpos=0;
do{
memset(buffer,0,sizeof(buffer));
count=file.Read(buffer,sizeof(buffer)-1);
m_txtString+=buffer;
pos+=count;
}while(count==sizeof(buffer)-1);
UpdateData(FALSE);
}
(4)编译、连接运行。
B.EditSoft.cpp文件
//EditSoft.cpp:
Definestheclassbehaviorsfortheapplication.
//
#include"stdafx.h"
#include"EditSoft.h"
#include"MainFrm.h"
#include"EditSoftDoc.h"
#include"EditSoftView.h"
#include"resource.h"
#include
#include
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//CEditSoftApp
BEGIN_MESSAGE_MAP(CEditSoftApp,CWinApp)
ON_COMMAND(CG_IDS_TIPOFTHEDAY,ShowTipOfTheDay)
//{{AFX_MSG_MAP(CEditSoftApp)
ON_COMMAND(ID_APP_ABOUT,OnAppAbout)
ON_COMMAND(ID_FILE_NEW,OnFileNew)
//}}AFX_MSG_MAP
//Standardfilebaseddocumentcommands
ON_COMMAND(ID_FILE_NEW,CWinApp:
:
OnFileNew)
ON_COMMAND(ID_FILE_OPEN,CWinApp:
:
OnFileOpen)
//Standardprintsetupcommand
ON_COMMAND(ID_FILE_PRINT_SETUP,CWinApp:
:
OnFilePrintSetup)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//CEditSoftAppconstruction
CEditSoftApp:
:
CEditSoftApp()
{
//TODO:
addconstructioncodehere,
m_pDocTemplate=NULL;
//PlaceallsignificantinitializationinInitInstance
}
/////////////////////////////////////////////////////////////////////////////
//TheoneandonlyCEditSoftAppobject
CEditSoftApptheApp;
/////////////////////////////////////////////////////////////////////////////
//CEditSoftAppinitialization
BOOLCEditSoftApp:
:
InitInstance()
{
AfxEnableControlContainer();
m_pDocTemplate=newCMultiDocTemplate(
IDR_MAINFRAME,RUNTIME_CLASS(CEditSoftDoc),
RUNTIME_CLASS(CMainFrame),
RUNTIME_CLASS(CEditSoftView));
AddDocTemplate(m_pDocTemplate);
//Standardinitialization
//Ifyouarenotusingthesefeaturesandwishtoreducethesize
//ofyourfinalexecutable,youshouldremovefromthefollowing
//thespecificinitializationroutinesyoudonotneed.
#ifdef_AFXDLL
Enable3dControls();//CallthiswhenusingMFCinasharedDLL
#else
Enable3dControlsStatic