编写工具:MFC
一、功能分析
A、文件:新建、打开、保存、另存为 B、编辑:撤销、删除、剪切、复制、粘贴、全选
C、应用:查找/替换、字体设置、统计字符串、统计字数
D、关于EasyTXT、帮助 E、关联注册、还原注册
具体分析:
A1 “新建”消息响应
m_Edit.GetModify()来获取,Edit框是否被修改过,如果返回值为TRUE,则提示是否保存,调用“保存”,否则,
A2 “打开”消息响应
打开方式1:首先对文件路径进行一个分析,char read[50000];file.Read(read,50000)中,然后用for(file.length)将read[5000]数据,复制到CString strText中, 用strText+=read[i]方式。
file.Close();
m_Edit.SetWindowText(strText);
m_Edit.SetModify(FALSE);
isNew = FALSE;
Invalidate()
A3 “保存”消息响应
if(isNew) 调用另存为函数,//第一次新建且未保存
else
m_Edit.GetWindowText(strText);
strcpy(write,strText)//char write[50000],CString strText
file.Write(write,strText.GetLength());
m_Edit.SetSel(0,0);//什么都不选择
A4 另存为
CFileDialog dlg;
CFileStatus fs;
dlg.DoModal();//提示保存文件对话框
strPath = dlg.GetPathName();//获取路径名
strPath.Right(4) !=".txt" strPath+=".txt";//不是.txt结尾,则加上.txt
if(CFile::GetStatus(strPath,fs))//获取文件,返回了,则已存在
//存在则提示,是否替换,是,则替换,不是,则调用另存为,
//不存在,则直接写入strPath路径,
isNew = FALSE;//不是新的文件
m_Edit.SetModify(FALSE);//标记为未修改
A5 退出
isModified = m_Edit.GetModify();//
if(isNew && string.IsEmpty())//若是新建文件,且有内容,则CDialog::OnClose(),直接退出
if(isModified)//如果被修改过,则提示是否保存,否则直接退出
B、编辑:撤销、删除、剪切、复制、粘贴、全选
m_Edit.Undo();//“撤销”菜单响应
m_Edit.Clear();//“删除”菜单响应,可见是对选中部分进行删除
m_Edit.Cut();//剪切选中的部分
m_Edit.Copy();//复制选中部分
m_Edit.Paste();//粘贴
m_Edit.SetSel(0,-1);//全选
C、应用:查找/替换、字体设置、统计字符串、统计字数
//C1 查找/替换
dlg = new CFindReplaceDialog;//查找对话框
dlg->Create(FALSE,NULL);
dlg->ShowWindow(SW_SHOW);//显示它
CEasyTXTDlg::OnFindReplace(wParam,lParam);//这个是
strText = dlg->GetFindString();//获取要查找的字符串
m_Edit.GetWindowText(str);//获取Edit字符串到CString str中;
if(dlg->ReplaceAll())//判断是否替换所有,
strText = dlg->GetFindString()//获得要替换的字符
repText = dlg->GetReplaceString()//获得替换后的字符
str.Replace(strText,repText);//替换
m_Edit.SetWindowText(str);//显示到Edit中去
if(dlg->ReplaceCurrent());//是替换,还是查找
find = FALSE;else find = TRUE;//根据find标志,去替换或者查找,基本思路一致
//C2 字体设置
TempFont = m_Edit.GetFont();//获取当前字体
TempFont->GetLogFont(&LogFont);//LOGFONT类型,
CFontDialog dlg(&LogFont);//初始字体对话框
m_Font.Detach();
dlg.GetCurrentFont(&temp);//LOGFONT temp;
m_Font.CreateFontIndirect(&temp);//直接创建字体
m_Edit.SetFont(&m_Font);//设置字体
//C3 统计字符串
CCountStringDlg dlg;
dlg.SetText(str);//m_Edit.GetWindowText(str);
dlg.DoModal();
//统计字数
char c = strText.GetAt(i);//i从0,到strText.GetLength()
c<0 || c>255 //表示非英文字符
if(c == '\r') i++;nEnterLength++;\\跳过一个,因为Enter占2个字符,Enter计数量+1
else nEnLenth++;if(c==' ')//为空格,
if(c>'0' && c<='9') //数字
if(c>='a' && c <='z' || (c>'A' && c<='Z')//字母
nCLength=(Length-nEnLenth)/2-nEnterLenth;//中文字符个数,总字符-英文字符-Enter个数*2,再除以2
CCountAllDlg dlg;
dlg.SetText(各个统计的参数);
D、关于EasyTXT、帮助
CHelpDlg dlg; dlg.DoModal();//弹出关于对话框
m_HelpText.SetWindowText(str);//OnInitDialog()中初始化帮助对话框中的数据,str是局部变量,并且赋值,m_HelpText是不可修改内容的Edit框
E、关联注册、还原注册
//关联注册
str1 = "用EasyTXT miniword打开";//关联右键
str2 = GetModuleHandle(NULL)//程序路径
str3 = "str2"//代码表示为:str3 = "\""+str2+"\"";
str2 +=""%1\""//将引号加入的方法是\"
value = RegCreateKeyEx(&hresult,)//txtfile\\shell\\open open键写入
value = RegSetValueEx(hresult,) //设置open键的项目值
value = RegCreateKeyEx()//txtfile\\shell\\OPEN\\command 双击键写入注册表
value = RegSetValueEx(hresult,)//设置项及项值
value = RegCreateKeyEx()//txtfile\\DefaultIcon 图标写入
value = RegSetValueEx(hresult,)//设置项及项值
::RegCloseKey(hresult);
//还原注册
依照上面的还原即可,最后提示,
菜单栏:
EasyTXT_ToolBar.SetButtonInfo(0,ID_MENU_NEW,TBSTYLE_BUTTON,0);//
SetButtonText(0,"新建文件");
SetButtonInfo(1,ID_MENU_SAVE,TBSTYLE,..1,)//
SetButtonText(1,"保存文件");
菜单的图标:
EasyTXT_ToolBar.CreateEx(this)//
CImageList ImageList;
ImageList.Create(32,32,ILC_COLOR32 | ILC_MASK,10,10);//创建图像列表
ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON1));//分别加载图片
EasyTXT_ToolBar.GetToolBarCtrl().SetImageList(&ImageList);//设置图像
ImageList.Detach();释放图像列表
EasyTXT_ToolBar.SetButtons(NULL,9)//这只工具栏按钮
总结:1、m_Edit.GetWindowText(CString类),CString类中一定是根据文本的长度,来计算空间大小,然后在进程的空间分配一定大小的内存,即程序可访问,把数据拷贝到CString str中。SetWindowText是传一个指针给内部,然后内部可能会把数据写到一个缓冲内存,Edit内部只需保存一个这个缓冲内存字符数据的地址。
二、交互分析
主界面如下:
1、数据分析
每当打开时,先把数据读进内存,然后再进行操作。编辑,则调用m_Edit默认函数;统计和查找、替换,都是GetWindowText到一个内存缓冲区,然后进行,在局部显示时。
对话框类的交互方式:a、用局部dlg,必要时,给它传参数,再调用dlg.DoModal() b、在所属类中,声明对象dlg,然后用dlg获取必要的数据。
工具栏加载图标时,用ImageList读取每个图标,SetImageList(),ImageList.Detach();//可能图标数据会送到TooBar类的里面,由它来管理,这时可释放ImageList资源。
参考:1、C++程序设计报告