一、SDK文本编辑器界面分析
主界面如下:
文件菜单如下:
编辑菜单如下:
工具菜单如下:
帮助菜单如下:
二、界面实现分析
1、文件菜单
>>>>新建:
MessageBox //是否新建
OPENFILENAME ofn; //文件对象
GetSaveFileName(&ofn)//保存API对话框
fp=fopen(szFile,"w"); //打开文件
TCHAR str[10000];
TCHAR end[10000];
memset(end,0,10000);
GetDlgItemText(hwnd,IDC_EDIT1,str,sizeof(str));//保存到缓冲区str
fputs(str,fp);//缓冲区数据str写入文件
fclose(fp);
SetDlgItemText(hwnd,IDC_EDIT1,"")//Edit框置为空
>>>>打开:
GetOpenFileName()//获取文件路径
TCHAR line[256];
TCHAR end[10000];
memset(line,0,256);//一行256个TCHAR数据
memset(end,0,256);
while(!feof(fp))
{
fgets(line,sizeof(line),fp);//读取到行缓冲区
lstrcat(end,line);//连接复制到TCHAR end数组中,以'\0'为起始点
int w=strlen(end);
end[w-1]='\0';
lstrcat(end,"\r\n");
}
SetDlgItemText(hwnd,IDC_RICHEDIT1,end);//将数据显示到Edit控件中
>>>>保存:
if (GetSaveFileName(&ofnb))//保存对话框
{
FILE * fp = fopen (".txt","w"); //保存所有文件都为txt格式
TCHAR baoc [100000]; //保存的最大容量为100000
GetDlgItemText(hwnd,IDC_RICHEDIT1,baoc,sizeof(baoc));//Edit中的内容拷贝到baoc缓冲区
fputs(baoc,fp);//缓冲区数据写入文件
fclose(fp);
}
>>>>退出:
MessageBox //提示是否保存,不保存则直接退出
GetSaveFileName(&ofn)//保存对话框
fp=fopen(szFile,"w");//新建文件
TCHAR str[10000];
TCHAR end[10000];
memset(end,0,10000);
GetDlgItemText(hwnd,IDC_EDIT1,str,sizeof(str));//获取Edit内容到缓冲区str[10000]中
fputs(str,fp);//写入到文件中
fclose(fp);//关闭文件句柄
2、编辑菜单
>>>>剪切
SendDlgItemMessage(hwnd,IDC_RICHEDIT1,WM_CUT,0,0);//发消息给RichEdit,WM_CUT
>>>>复制
SendDlgItemMessage(hwnd,IDC_RICHEDIT1,WM_COPY,0,0);
>>>>粘贴
SendDlgItemMessage(hwnd,IDC_RICHEDIT1,WM_PASTE,0,0);
>>>>清除
SetDlgItemText(hwnd,IDC_RICHEDIT1,"");
>>>>撤销
SendDlgItemMessage(hwnd,IDC_RICHEDIT1, EM_UNDO, 0, 0);
>>>>删除
SendMessage(GetDlgItem(hwnd, IDC_RICHEDIT1), WM_CLEAR, 0, 0);
>>>>全选
SendMessage(GetDlgItem(hwnd, IDC_RICHEDIT1), EM_SETSEL, 0, -1);
————————————————
>>>>时间显示
TCHAR str[256];
GetLocalTime(&strLocal);
wsprintf(str,"%04d-%02d-%02d %02d:%02d:%02d",strLocal.wYear,strLocal.wMonth,
strLocal.wDay,\\SYSTEMTIME strLocal结构体,有年、月、日、时、分、秒等
SetDlgItemText(hwnd,IDC_EDIT2,str);\\显示到Edit中
>>>>查找算法
TCHAR str1[256];
TCHAR temp1[5000];
TCHAR temp2[5000];
memset(temp1,0,5000);
memset(temp2,0,5000);
memset(str1,0,256);
GetDlgItemText(hwnd,IDC_EDIT_FINDWORD,str1,sizeof(str1));//获取查找对话框中Edit的要查询的内容
while(str2[i]!='\0' )\\str2[]读取的是文本的内容,其传递详见交互式分析
{
以'\n'作为标志统计行int Line_count;\\"\r\n"=0d0A,一个是return ,一个是next
str1[j]=str2[i]
{
匹配后,则wsprintf(temp2,"<%i>你要寻找的内容在第:%i 行,第:%i 列至第:%i 列!!!",count,Line_count,(Row_count-strlen(str1)),(Row_count-1));//count是相同的个数
将temp2,连接到temp1当中去。
SetDlgItemText(hwnd,IDC_EDIT2,temp1);
}
}
>>>>替换算法
change::D_change(TCHAR S[], TCHAR T1[] ,TCHAR T2[]) //替换功能,S是返回的文本指针,T1、T2是替换文本、被替换文本
基本思路是:也通过字符算的比配,一一找到后,一一替换,最后返回替换后的文本内容;
>>>>统计算法
WinMain当中进行处理:
统计所有字符,则total[i] 不为' ' 、'\r'、'\n'
统计英文字符,则total[i] 在'a'和'z'、'A'和'Z'之间
统计数字,则total[i] 在'0'和'9'之间
统计标点符号,直接与anscii码比较,有!\"\'\,\.\:\;\?
统计空格,则total2[i] ==' '
统计行数、列数,则total2[i]=='\n' 或者 每行个字符数Row_count == 62 规定数 ,则Line_count++ ,Row_count = 0
否则Row_count++
然后拷贝到一个缓冲区temp2,加入控制符,连接到另外一个缓冲区temp1,最后Edit控件显示
wsprintf(temp2,"<1>文本的行数为:%i !",Line_count-1);
strcat(temp1,temp2);
SetDlgItemText(hwnd,IDC_EDIT1,temp1);
3、工具菜单
>>>>背景音乐mp3
WinMain当中消息响应
GetShortPathName("C:\\Documents and Settings\\user\\桌面\\edit\\邓紫棋 - 寂寞星球的玫瑰.mp3",shortPath,sizeof(shortPath)); //获取音乐的短途径
//主要是防止,mciSendString()函数引用路径时出错,
TCHAR cmd[MAX_PATH+10];
wsprintf(cmd,"play %s",shortPath);//加上play + 文件路径,即可播放
mciSendString(cmd," ",0,NULL);
mciSendString("CLOSE cmd"," ",0,NULL);//加上CLOSE + 文件路径,即可关闭
4、关于菜单
>>>>关于
WinMain当中消息响应——弹出关于对话框
HINSTANCE hInstance=(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE);
DialogBox(hInstance, MAKEINTRESOURCE(IDD_ABOUT), NULL, Main_Proc);
>>>>访问百度
ShellExecute(hwnd,TEXT("open"),TEXT("www.baidu.com"),NULL,NULL,SW_SHOWNORMAL);
>>>>访问114
ShellExecute(hwnd,TEXT("open"),TEXT("www.114la.com"),NULL,NULL,SW_SHOWNORMAL);
三、交互式分析
1、查询对话框、主界面交互
通过DialogBoxParam传文本内容字符串指针str1即可
DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_FIND), NULL, Find_Proc,(LPARAM)str1);
在查找对话框.cpp中,接受,并拷贝到指针str2中
BOOL Find_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{
str2=((TCHAR*)lParam);
return TRUE;
}
参考:1、文本编辑器课程设计报告