记事本.docx
- 文档编号:1621940
- 上传时间:2023-05-01
- 格式:DOCX
- 页数:18
- 大小:236.92KB
记事本.docx
《记事本.docx》由会员分享,可在线阅读,更多相关《记事本.docx(18页珍藏版)》请在冰点文库上搜索。
记事本
+
西安科技大学
《VC++程序设计》
实验报告
题目记事本
院、系(部)计算机科学与技术学院
专业及班级信息与计算科学班
学号
姓名HW
日期2012年12月25日
1题目要求
仿照Windows系统自带记事本做的一个小型记事本。
2功能需求
1为程序添加查找、替换等功能;
2在某些程序新创建的菜单中只输入了一个菜单ID标识就可以实现某一种功能;
3为应用程序增加一个日历;
4使EditSoft应用程序成为多文档程序;
5在应用程序的状态条上显示时间;
6使应用程序窗口左上角标题栏上的应用程序图标动起来;
7建立一个文件打开、保存对话框;
8使用字体、颜色对话框;
9处理文字输入;
10在字处理编辑器中增加一个插入符;
11处理方向键、翻页键等虚键操作;
12实现字符串的复制、粘贴等功能;
3总体设计
3.1系统模块
4详细设计
1)为程序添加查找、替换等功能
打开ResourceView,打开IDR_MAINFRAME;为“编辑”菜单添加“查找”菜单项,并将ID设为“ID_EDIT_FIND”;
打开ResourceView,打开IDR_MAINFRAME;为“编辑”菜单添加“替换”菜单项,并将ID设为“ID_EDIT_REPLACE”;
2)增加一个日历(核心代码)
在视图类的头文件中加入日历对话框类的头文件引用:
#include“CalendarDlg.h”.
增加ID_HELP_CALENDARDLG消息的消息处理函数。
添加如下代码:
voidCEditSoftView:
:
OnHelpCalenderdlg()
{
CCalendarDlgdlg;
dlg.DoModal();
}
3)使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);
4)在应用程序的状态条上显示时间
//设置状态条的第三个框的宽度为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);
5)使应用程序窗口左上角标题栏上的应用程序图标动起来
(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,200,NULL);
(5)为框架类添加WM_TIMER的消息处理函数。
voidCMainFrame:
:
OnTimer(UINTnIDEvent)
{
staticinticons[]={IDI_ICON1,IDI_ICON2,IDI_ICON3,IDI_ICON4};
staticlongindex=0;
LoadNewIcon(icons[index++%4]);
}
6)建立一个文件打开、保存对话框
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);
}
7)使用字体、颜色对话框
(1)在“编辑”菜单下增加子菜单:
字体,ID:
ID_EDIT_FONT。
为其增加消息处理函数。
(2)在文档类的定义中添加如下代码:
CStringm_Text;//定义一个存放文本的字符串变量
CFontm_Font;//定义一个字体变量
LOGFONTm_lf;//定义一个LOGFONT结构变量
CPointm_StartPoint;//定义文字的初始显示位置
(3)在字体的消息处理函数中添加如下代码:
voidCEditScrollView:
:
OnEditFont()
{
CEditScrollDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
CFontDialogFontDlg(&pDoc->m_lf);//定义一个字体对话框对象
FontDlg.DoModal();//调用字体对话框
InvalidateRect(NULL);//通知视图数据已经改变,请刷新
}
(4)在视图类的OnDraw()函数中编辑显示代码:
//TODO:
adddrawcodefornativedatahere
intnOldMode=pDC->SetBkMode(TRANSPARENT);
pDoc->m_Font.CreateFontIndirect(&pDoc->m_lf);
CFont*pOldFont=pDC->SelectObject(&pDoc->m_Font);
pDC->TextOut(pDoc->m_StartPoint.x,pDoc->m_StartPoint.y,pDoc->m_Text);
pDC->SelectObject(pOldFont);
pDoc->m_Font.DeleteObject();
pDC->SetBkMode(nOldMode);
(5)在文档类的新建文件函数OnNewDocument中初始化有关变量。
然后编译连接。
//(SDIdocumentswillreusethisdocument)
m_Text="!
";
m_StartPoint=CPoint(0,0);
m_lf.lfHeight=20;
m_lf.lfWidth=0;
m_lf.lfEscapement=0;
m_lf.lfOrientation=0;
m_lf.lfWeight=FW_NORMAL;
m_lf.lfItalic=0;
m_lf.lfUnderline=0;
m_lf.lfStrikeOut=0;
m_lf.lfCharSet=ANSI_CHARSET;
m_lf.lfOutPrecision=OUT_DEFAULT_PRECIS;
m_lf.lfClipPrecision=CLIP_DEFAULT_PRECIS;
m_lf.lfQuality=PROOF_QUALITY;
m_lf.lfPitchAndFamily=VARIABLE_PITCH|FF_ROMAN;
strcpy(m_lf.lfFaceName,"TimesNewRoman");
8)在字处理编辑器中增加一个插入符
(1)在视图类OnDraw函数中添加如下代码
if(!
pDoc->CaretCreated)
{
TEXTMETRICtextmetric;
pDC->GetTextMetrics(&textmetric);
CreateSolidCaret(textmetric.tmAveCharWidth/8,textmetric.tmHeight);
pDoc->CaretPosition.x=pDoc->CaretPosition.y=0;
SetCaretPos(pDoc->CaretPosition);
ShowCaret();
pDoc->CaretCreated=TRUE;
}
pDC->TextOut(pDoc->m_StartPoint.x,pDoc->m_StartPoint.y,pDoc->m_Text);
CSizesize=pDC->GetTextExtent(pDoc->m_Text);
HideCaret();//为在字符串显示插入符必须先隐藏它
pDoc->CaretPosition.x=size.cx;
SetCaretPos(pDoc->CaretPosition);//在字符串尾显示新的插入符
ShowCaret();
(2)修改视图类“编辑/字体”菜单的消息处理函数,否则在选择了字体后插入符会消失。
pDoc->CaretCreated=FALSE;
9)处理方向键、翻页键等虚键操作
(1)为前面程序的视图类添加WM_KEYDOWN消息处理函数,并添加如下代码
voidCEditScrollView:
:
OnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags)
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
CSizeDocSize=GetTotalSize();
RECTClientRect;
GetClientRect(&ClientRect);
switch(nChar)
{
caseVK_LEFT:
if(ClientRect.right SendMessage(WM_HSCROLL,SB_LINEUP); break; caseVK_RIGHT: if(ClientRect.right SendMessage(WM_HSCROLL,SB_LINEDOWN); break; caseVK_UP: if(ClientRect.bottom SendMessage(WM_VSCROLL,SB_LINEUP); break; caseVK_DOWN: if(ClientRect.bottom SendMessage(WM_VSCROLL,SB_LINEDOWN); break; caseVK_HOME: if(: : GetKeyState(VK_CONTROL)&0x8000) { if(ClientRect.bottom SendMessage(WM_VSCROLL,SB_TOP); } else { if(ClientRect.bottom SendMessage(WM_HSCROLL,SB_TOP); } break; caseVK_END: if(: : GetKeyState(VK_CONTROL)&0x8000) { if(ClientRect.bottom SendMessage(WM_VSCROLL,SB_BOTTOM); } else { if(ClientRect.bottom SendMessage(WM_HSCROLL,SB_BOTTOM); } break; caseVK_PRIOR: if(ClientRect.bottom SendMessage(WM_VSCROLL,SB_PAGEUP); break; caseVK_NEXT: if(ClientRect.bottom SendMessage(WM_VSCROLL,SB_PAGEDOWN); break; } CScrollView: : OnKeyDown(nChar,nRepCnt,nFlags); } 10)实现字符串的复制、粘贴 (1)在文档类的实现文件中加入 #include"Clipboard.h" (2)为应用程序“编辑”菜单下的“拷贝”、“粘贴”功能在文档类中添加消息处理函数。 在OnEditCopy中添加如下代码。 intnSize=m_Text[m_Count].GetLength(); char*buf=newchar[nSize+1]; strcpy(buf,m_Text[m_Count]); CClipboard: : SetText(buf); UpdateAllViews(NULL); delete[]buf; (3)同样的方法为文档类增加OnEditPaste函数,并添加如下代码: char*buf; unsignedlongnSize; CClipboard: : GetTextLength(&nSize); buf=newchar[nSize+1]; CClipboard: : GetText(buf,nSize+1); buf[nSize]=0; m_Text[m_Count]+=buf; UpdateAllViews(NULL); delete[]buf; 5测试与实现 6总结 这次的记事本是我个人单独完成的,在编写软件的过程中自己查阅资料以及参照了老师的上机指导书和课件,其中遇到一些问题,但是在同学们给了我很多帮助。 虽然软件完成了,但是此次的记事本不足之处在于功能还不是很完善,整体还是很粗糙,在以后的学习中我会利用我学到的只是继续完善它的。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 记事本
![提示](https://static.bingdoc.com/images/bang_tan.gif)