记事本的基本功能已经都实现:采用的是CEdit类实现,包括打开文件,保存文件,粘贴,复制剪切等等:
1:
[cpp] view plaincopyprint?
1.//实现菜单栏目下 复制的功能
2.void CNotePadDlg::OnEditCopy()
3.{
4. CEdit * pEdit = (CEdit*)GetDlgItem(IDC_TEXT);
5. pEdit->Copy();
6.}
7.
8.//实现菜单栏目下 删除的功能
9.void CNotePadDlg::OnEditClear()
10.{
11. CEdit * pEdit = (CEdit*)GetDlgItem(IDC_TEXT);
12. pEdit->Clear();
13.}
14.//实现菜单栏目下 撤销的功能
15.void CNotePadDlg::OnEditUndo()
16.{
17. CEdit* pEdit = (CEdit*)GetDlgItem(IDC_TEXT);
18. pEdit ->Undo();
19.}
20.
21.//实现菜单栏目下 剪切的功能
22.void CNotePadDlg::OnEditCut()
23.{
24. CEdit* pEdit = (CEdit*)GetDlgItem(IDC_TEXT);
25. pEdit ->Cut();
26.}
27.//实现菜单栏目下 全选的功能
28.void CNotePadDlg::OnEditSelectAll()
29.{
30. CEdit* pEdit = (CEdit*)GetDlgItem(IDC_TEXT);
31. pEdit ->SetSel(0,-1);
32.}
33.//实现菜单栏目下 粘贴的功能
34.void CNotePadDlg::OnEditPaste()
35.{
36.
37. CEdit* pEdit = (CEdit*)GetDlgItem(IDC_TEXT);
38. pEdit ->Paste();
39.}
40.//实现菜单栏目下 时间的功能
41.void CNotePadDlg::OnEditDate()
42.{
43. CTime t = CTime::GetCurrentTime();
44.
45. CString str = t.Format(“%Y年%m月%d日 %H:%M:%S”);
46. CEdit* pEdit = (CEdit*)GetDlgItem(IDC_TEXT);
47. pEdit ->ReplaceSel( str,TRUE);
48.}
2:
[cpp] view plaincopyprint?
1.//实现移动窗口大小的功能;记得修改窗口属性当中的值
2.void CNotePadDlg::OnSize(UINT nType, int cx, int cy)
3.{
4. CDialog::OnSize(nType, cx, cy);
5.
6. CWnd* pEdit = GetDlgItem(IDC_TEXT);
7. if(pEdit)
8. pEdit->MoveWindow(0,0,cx,cy);
9.
10.}
11.
12.//实现菜单下退出的功能
13.void CNotePadDlg::OnFileExit()
14.{
15. if(Prompt() == 0) //如果等于0,代表选择了取消,那么不关闭对话框
16. {
17. //不做任何处理
18. }
19. else//如果不等于0 那么代表选择了 否 直接关闭对话框
20. {
21. EndDialog(IDCANCEL);
22. }
23.
24.}
3:
[cpp] view plaincopyprint?
1.//实现关于对话框的显示
2.void CNotePadDlg::OnHelpAbout()
3.{
4. CAbout dlg;
5. dlg.DoModal();
6.
7.}
8.
9.//禁用esc退出程序
10.void CNotePadDlg::OnCancel()
11.{
12. //CDialog::OnCancel();
13.}
14.
15.//重载OnClose()实现X的退出功能
16.void CNotePadDlg::OnClose()
17.{
18. OnFileExit();//这里调用菜单下的退出函数
19. //EndDialog(IDCANCEL);
20. //CDialog::OnClose();
21.}
4:
[cpp] view plaincopyprint?
1.//实现菜单栏目下另存为的功能
2.void CNotePadDlg::OnFileSaveAs()
3.{
4.
5. LPCTSTR szFilter = “文本文件(.txt)|.txt|所有文件(.)|.||”;
6. //初始化文件对话框 FALSE代表保存文件
7. CFileDialog filedlg(FALSE,”txt”,”11”,OFN_OVERWRITEPROMPT|OFN_PATHMUSTEXIST|
8. OFN_FILEMUSTEXIST|OFN_CREATEPROMPT,szFilter);
9. //打开文件对话框
10. if(IDCANCEL == filedlg.DoModal())
11. return;
12. //得到文件对话框中选择文件的路径名
13. CString szFile = filedlg.GetPathName();
14.
15. //声明一个CFile对象
16. CFile file;
17. //打开文件
18. if( file.Open(szFile,CFile::modeWrite|CFile::modeCreate) == 0)
19. {
20. MessageBox(filedlg.GetFileName()+”保存文件时失败!”, NULL,MB_ICONEXCLAMATION);
21. return;
22. }
23.
24. //当前文件为该文件,保存下来
25. m_szCurrentFile = szFile;
26.
27. CString strText;
28. //得到IDC_TEXT控件里面的内容
29. GetDlgItemText(IDC_TEXT,strText);
30. //文件写入,第一个参数是要写入的内容,第二个是写入内容的长度
31. file.Write(strText,strText.GetLength());
32.
33. /*
34.1: Flush是将缓冲区的内容写入文件,并清空。缓冲区是4k的内容,够4k了,
35. 就会自动写入文件,不够的话就需要flush一下,如果不flush的话,文件
36. 的最后有可能会少一些内容
37.2: Flush()的作用是刷新缓冲区,如果你在write()完成后调用了Close(),
38. 那缓冲区的那部分数据就丢失了,因为数据时先写入内存然后在读进文件了。
39. 所以在调用Close()前把缓冲区的数据强行输出,这样才不会丢失数据。
40.3: flush()的作用是强制将缓冲区的数据写入磁盘,只是为了确保数据尽快被写入,但是其实如果小量数据就用flush(),那么硬盘写入的机械操作时间是相对比较长的,
41. 如果不调用flush(),缓冲区达到一定的数据量就会自动写入磁盘。
42. 在关闭文件的时候也会把缓冲区的数据(如果有)强制写入磁盘
43.4: 如果不是多线程写同一个文件,可以不用flush(),
44. 最后结束前记得close就可以,当然也可以最后flush一次,再close
45. */
46. file.Flush();//上面的解释跟清除了,我看这个就明白了,相信你也一样
47.
48. file.Close();//关闭文件,删除对象!
49.
50. CEdit* pEdit = (CEdit*)GetDlgItem(IDC_TEXT);
51. pEdit ->SetModify(FALSE);
52. SetTitle();
53.
54.}
5:
[cpp] view plaincopyprint?
1.//实现菜单栏目下打开的功能
2.void CNotePadDlg::OnFileOpen()
3.{
4. //过滤器
5. LPCTSTR szFilter = “文本文件(.txt)|.txt|所有文件(.)|.||”;
6. //打开一个文件选择对话框 TRUE代表 打开文件
7. CFileDialog filedlg(TRUE,”txt”,”11”,OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST,
8. szFilter);
9. if(IDCANCEL== filedlg.DoModal())
10. return;
11. //打开文件并显示到IDC_TEXT当中
12. OpenFile(filedlg.GetPathName(),filedlg.GetFileName());
13.}
14.
15.void CNotePadDlg::OpenFile(CString szFilePath, CString szFileName)
16.{
17.
18. CFile file;//声明一个CFile对象
19.
20. //打开一个文件
21. if(file.Open(szFilePath,CFile::modeRead) == 0)
22. {
23. MessageBox(szFileName+”打开文件失败!”,NULL,MB_ICONEXCLAMATION);
24. return;
25. }
26. /*
27. int size = file.GetLength();//得到文件的长度
28. char* pText = new char[size+1];//要读入文件缓冲区的指针
29.
30. //将CFile对象file相关联文件的数据读入缓冲。
31. int nRet = file.Read(pText,size);
32. file.Close();//关闭对象
33. */
34.
35. //第二种方法
36. CFileStatus fs;
37. file.GetStatus(fs);
38. char *pText = new char[fs.m_size+1];
39. memset(pText,0,fs.m_size+1);
40. int nRet = file.Read(pText,fs.m_size);
41. file.Close();
42./*
43. 这里解释一下你打开文件有可能是乱码,那是因为你要打开的文件是unicode或者其他不是ANSI的格式
44. 怎么看你要打开的文件是什么格式?
45. 用记事本打开你要打开的文件,然后另存为,你就会看到你的这个文件是什么格式的了。当你把它改为ANSI格式
46. 就不会出现乱码了!
47.*/
48. pText[nRet] = 0;//把最后置为0 结尾 字符串结尾要为\0;
49. m_szCurrentFile = szFilePath;//把当前文件路径设置为当前打开的文件路径
50.
51. CEdit* pEdit = (CEdit*)GetDlgItem(IDC_TEXT);
52. pEdit->SetWindowText(pText);
53. pEdit ->SetModify(FALSE);
54.
55. SetTitle();
56.
57.}
6:
[cpp] view plaincopyprint?
1.//实现菜单栏目下保存的功能
2.void CNotePadDlg::OnFileSave()
3.{
4. //如果要保存的文件是第一次保存,那么就转换到 另存为
5. if(m_szCurrentFile.GetLength() == 0)
6. {
7. OnFileSaveAs();
8. return;
9. }
10.
11. CFile file;
12. if(file.Open(m_szCurrentFile,CFile::modeWrite|CFile::modeCreate) == 0)
13. {
14. OnFileSaveAs();
15. return;
16.
17. }
18.
19. CString szText;
20. GetDlgItemText(IDC_TEXT,szText);//得到Edit控件里面的内容
21. file.Write(szText,szText.GetLength());//写入file对象
22. file.Close();//关闭对象
23.
24. CEdit* pEdit = (CEdit*)GetDlgItem(IDC_TEXT) ;
25. pEdit ->SetModify(FALSE);//FALSE表示文本没有改变;这里直接保存,点击退出的时候不要再提示改变
26.
27.}
7:
[cpp] view plaincopyprint?
1.//实现菜单栏下新建的功能
2.void CNotePadDlg::OnFileNew()
3.{
4. //处理文件改变的情况;如果在我们新建一个文件的时候,改变了原来存在的文件
5. //如果==0;代表取消,那么直接返回,表示取消新建的任务
6. //如果!=0; 那么就可能保存当前文件或者不保存当前文件
7. if(Prompt() == 0)
8. return;
9.
10. //然后下面就是新建文件的任务。
11. CEdit* pEdit = (CEdit*)GetDlgItem(IDC_TEXT);
12. pEdit->SetWindowText(“”);
13. m_szCurrentFile = “”;
14. SetTitle();
15.
16.
17.}
8:
[cpp] view plaincopyprint?
1.//处理文件修改的情况
2.BOOL CNotePadDlg::Prompt()
3.{
4. CEdit* pEdit = (CEdit*)GetDlgItem(IDC_TEXT);
5. if(pEdit->GetModify())//如果文件被修改
6. {
7. CString str;
8. if(m_szCurrentFile.IsEmpty())//如果当前的文件为空,则str= 无标题
9. str = “无标题”;
10. else
11. str = m_szCurrentFile; //否则就是 现在打开文件的Path
12.
13. int nRet = MessageBox(str+”\r\n已经被修改,是否保存?”,”提示消息”,
14. MB_YESNOCANCEL|MB_ICONEXCLAMATION);
15.
16. if(IDCANCEL == nRet)//如果选择了 取消,那么不做任何处理,也不关闭对话框(在退出函数中做处理)
17. return FALSE;
18. if(IDNO == nRet) //如果选择了 否 直接关闭对话框(在退出函数当中做处理)
19. return TRUE;
20. else//如果选择了 是 保存文件
21. OnFileSave();
22. }
23.
24. return TRUE;
25.}
26.
27.//设置上面的标题
28.void CNotePadDlg::SetTitle()
29.{
30. CString str;
31. if(m_szCurrentFile.IsEmpty())
32. str = “无标题”;
33. else
34. str = m_szCurrentFile;
35.
36. int i = str.ReverseFind(‘\’); //反向找到 \
37. if(i > 0)
38. str = str.Mid(i+1); //从\位置处 截出str后面的内容
39.
40. SetWindowText(str);
41.}
9:
[cpp] view plaincopyprint?
1.//实现菜单栏目下字体选择的功能
2.void CNotePadDlg::OnFormatFont()
3.{
4.
5. CFont* pFont = GetDlgItem(IDC_TEXT)->GetFont();
6. LOGFONT lf;
7. pFont->GetLogFont(&lf);//获得当前CFont对象的LOGFONT结构体的拷贝
8. CFontDialog fd(&lf);//构造字体对话框,初始选择字体为当前CFont对象的字体
9.
10. if(IDCANCEL == fd.DoModal())
11. return;
12. m_font.DeleteObject();//如果m_font已经关联了一个字体资源对象,则释放它
13. m_font.CreateFontIndirect(fd.m_cf.lpLogFont);//使用选定字体的LOGFONT创建新的字体
14.// m_font.CreateFontIndirect(&lf);
15. GetDlgItem(IDC_TEXT)->SetFont(&m_font);//选定字体
16.
17.}
10:
[cpp] view plaincopyprint?
1.//实现拖一个文件进入的功能
2.void CNotePadDlg::OnDropFiles(HDROP hDropInfo)
3.{
4. if(!Prompt())
5. return;
6. char szFile[MAX_PATH];
7. UINT n = DragQueryFile(hDropInfo,0,szFile,sizeof(szFile));
8. CString str = szFile ;
9. n = str.ReverseFind(‘\’);
10. if(n>0)
11. {
12. str = str.Mid(n+1);
13. OpenFile(szFile,str);
14. }
15.
16. CDialog::OnDropFiles(hDropInfo);
17.}