文本编辑器代码分析(续2)

本文详细介绍了SDK文本编辑器的设计与实现过程,包括文件菜单的各项功能如新建、打开、保存、退出,编辑菜单的功能如剪切、复制、粘贴、撤销等,以及工具菜单中的背景音乐播放功能和关于菜单的实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、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、文本编辑器课程设计报告

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值