📄 notepad.c
字号:
#include <stdio.h>
#include <string.h>
#include <asixwin.h>
#include <asixapp.h>
#include <asixwin\asix_ed.h>
#include <asixwin\asix_mn.h>
#include <asixwin\asix_tb.h>
#include <asixwin\select.h>
#include "notepad.h"
#include "..\sms\sms.h"
#include <database\ntpaddb.h>
#include <resource\bitmap.h>
#include <resource\sysicon.h>
//注册表
TASKDESCRIPTION NOTETskDesp =
{"NOTEPAD", ASIX_APP, 0, jishi, 4096, 1, LCD_WIDTH, LCD_HEIGHT, BrowseNotepad, APP_PRI};
//记事本浏览模块
void BrowseNotepad(void)
{
U32 hGC;
//定义窗口和控件的ID
U32 mainwin; //主窗口
U32 newone; //新建 按钮
U32 del; //删除 按钮
U32 search; //查找 按钮
U32 order; //排序,菜单
U32 rename; //重命名 按钮
U32 up; //向上一级 按钮
U32 back; //目录(文件)列表的的外框 静态文本框
U32 note[NOTE_DISP_MAX]; //目录(文件)列表 按钮
U32 property[NOTE_DISP_MAX]; //属性按钮
U32 scroll; //垂直滚动条
U32 path; //路径显示栏 静态框
U32 dirnumtip; //目录个数的图标
U32 filenumtip; //目录个数的显示
U32 dirnumdisp; //文件个数的图标
U32 filenumdisp; //文件个数的显示
U32 tskbar; //底部任务栏
//定义函数用变量
MSG msg;
S16 quit = 0;
S16 dragflag = 0; //拖动标志
S16 i = 0, j = 0;
S16 noworder; //当前的排序方式
S16 allnum; //目录和文件的总个数
S16 dirnum; //目录的个数
S16 filenum; //文件的个数
S16 row = 1; //滚动块的位置
char currentdir[NAME_SIZE + 1]; //当前目录名
char currentid[LEVEL_NUM + 1], currentid2[LEVEL_NUM + 1]; //当前的目录id(绝对路径)
S16 offset = -1; //offset是被选中的目录/文件与当前目录下的首个目录/文件偏移量,-1表示没有选中目录/文件
S16 length = NOTE_DISP_MAX; //滚动条长度,默认为一屏显示的目录/文件个数
PROPERTY *nowlist[MAX_ITEM_NUM];
// PROPERTY *tempitem;
LOCALSEARCHLIST *searchlist, *searchlist2, *templist;
DBLACB *lacb;
char dirtemp[2];
char filetemp[2];
S16 searchflag = 0;
// U8 searchtype = 0xff;
//初始化
struct MENU_ITEM menuitem[] =
{
1, 1, "按时间",
1, 1, "按名称",
0, 0, NULL,
};
// tempitem = (PROPERTY *)Lmalloc(sizeof(PROPERTY));
// memset(tempitem, 0x00, sizeof(PROPERTY));
// searchlist2 = NULL;
memset(currentdir, 0x00, NAME_SIZE + 1);
memset(currentid, 0x00, (LEVEL_NUM + 1)*sizeof(char)); //默认当前目录为根目录
memset(currentid2, 0x00, (LEVEL_NUM + 1)*sizeof(char));
strcpy(currentdir, "\\");
//连接数据库并读入数据
// CreateDataBase();
lacb = LinkDataBase(NOTEPAD_DATA_BASE);
searchlist = LocalSortRecord(lacb, NOTEPAD_NAME_FIELD, currentid, PRECISE_PART_MATCH);
noworder = NAME_ORDER;
allnum = searchlist->num;
GetNoteList(nowlist, allnum, searchlist);
if(allnum > NOTE_DISP_MAX)
{
length = allnum;
}
for(i = 0; i < allnum; i++)
{
if(*(nowlist[i]->id) == 0) //当项目类型为文件时,跳出
break;
}
dirnum = i; //得出目录的个数
filenum = allnum - dirnum; //剩下的是文件个数
//创建窗口和控件
mainwin = CreateWindow(WNDCLASS_WIN, "NOTEPAD", WS_OVERLAPPEDWINDOW, 0, 0, PHY_LCD_W, PHY_LCD_H, 0, 0, NULL);
newone = CreateWindow(WNDCLASS_BUTTON, "\\新建", WS_CHILD|BS_REGULAR, (LCD_WIDTH - 150)/2, 23, BUTTON_W, BUTTON_W, mainwin, 0x00140014, (char *)zi_new);
del = CreateWindow(WNDCLASS_BUTTON, "\\删除", WS_CHILD|BS_REGULAR, (LCD_WIDTH - 150)/2 + 25, 23, BUTTON_W, BUTTON_W, mainwin, 0x00140014, (char *)zi_cancel);
search = CreateWindow(WNDCLASS_MENU, (char *)zi_find, WS_CHILD|MNS_ICON, (LCD_WIDTH - 150)/2 + 50, 23, BUTTON_W, BUTTON_W, mainwin, 0, menuitem);
order = CreateWindow(WNDCLASS_MENU, (char *)zi_paixu, WS_CHILD|MNS_ICON, (LCD_WIDTH - 150)/2 + 75, 23, BUTTON_W, BUTTON_W, mainwin, 0, menuitem);
rename = CreateWindow(WNDCLASS_BUTTON, "\\重命名", WS_CHILD|BS_REGULAR, (LCD_WIDTH - 150)/2 + 100, 23, BUTTON_W, BUTTON_W, mainwin, 0x00140014, (char *)zi_rename);
up = CreateWindow(WNDCLASS_BUTTON, "\\返回上级目录", WS_CHILD|BS_REGULAR, (LCD_WIDTH - 150)/2 + 125, 23, BUTTON_W, BUTTON_W, mainwin, 0x00140014, (char *)zi_back);
back = CreateWindow(WNDCLASS_STATIC, "", WS_CHILD|SS_BOARD, (LCD_WIDTH - 150)/2, 46, 130, 152, mainwin, 0, NULL);
scroll = CreateWindow(WNDCLASS_SCROLL, "", WS_CHILD|SBS_VERT, (LCD_WIDTH - 150)/2 + 131, 46, 20 , 152, mainwin, MAKELONG(1, length - NOTE_DISP_MAX + 1), NULL);
tskbar = CreateWindow(WNDCLASS_TSKBAR, NULL, WS_CHILD|TBS_TYPICAL, 0, 0, 0, 0,mainwin, 0, NULL);
//底部显示
path = CreateWindow(WNDCLASS_STATIC, currentdir, WS_CHILD|SS_TEXT|SS_LEFT, (LCD_WIDTH-150)/2, 200, 75, 20, mainwin, 0, NULL);
dirnumtip = CreateWindow(WNDCLASS_STATIC, NULL, WS_CHILD|SS_ICON, 70 + (LCD_WIDTH-150)/2, 200, BUTTON_W, BUTTON_W, mainwin, 0x00140014, (char *)zi_mulushuxing);
sprintf(dirtemp, "%u", dirnum);
dirnumdisp = CreateWindow(WNDCLASS_STATIC, dirtemp, WS_CHILD|SS_TEXT, 90 + (LCD_WIDTH-150)/2, 200, 16, BUTTON_W, mainwin, 0, NULL);
filenumtip = CreateWindow(WNDCLASS_STATIC, NULL, WS_CHILD|SS_ICON, 110 + (LCD_WIDTH-150)/2, 200, BUTTON_W, BUTTON_W, mainwin, 0x00140014, (char *)zi_wenjianshuxing);
sprintf(filetemp, "%u", filenum);
filenumdisp = CreateWindow(WNDCLASS_STATIC, filetemp, WS_CHILD|SS_TEXT, 130 + (LCD_WIDTH-150)/2, 200, 16, BUTTON_W, mainwin, 0, NULL);
for(i = 0; i < NOTE_DISP_MAX; i++) //显示目录/文件列表
{
if(i < allnum)
{
if(*(nowlist[i]->id) == 0)
property[i] = CreateWindow(WNDCLASS_BUTTON, "\\属性", WS_CHILD|BS_ICON, (LCD_WIDTH-150)/2, (U16)(48 + i*(BUTTON_W + 1)), BUTTON_W, BUTTON_W, mainwin, 0x00140014, (char *)zi_wenjianshuxing); //属性按钮
else
property[i] = CreateWindow(WNDCLASS_BUTTON, "\\属性", WS_CHILD|BS_ICON, (LCD_WIDTH-150)/2, (U16)(48 + i*(BUTTON_W + 1)), BUTTON_W, BUTTON_W, mainwin, 0x00140014, (char *)zi_mulushuxing); //属性按钮
note[i] = CreateWindow(WNDCLASS_BUTTON, nowlist[i]->name, WS_CHILD|BS_REGULAR, (LCD_WIDTH-150)/2 + 20, (U16)(48 + i*(BUTTON_W + 1)), 110, BUTTON_W, mainwin, 0, NULL); //目录列表
}
else
{
property[i] = CreateWindow(WNDCLASS_BUTTON, "\\属性", WS_CHILD|BS_ICON, 2, (U16)(48 + i*(BUTTON_W + 1)), BUTTON_W, BUTTON_W, mainwin, 0, NULL); //显示空按钮
note[i] = CreateWindow(WNDCLASS_BUTTON, "", WS_CHILD|BS_REGULAR, 23, (U16)(48 + i*(BUTTON_W + 1)), 116, BUTTON_W, mainwin, 0, NULL); //显示空按钮
}
}
hGC = GetGC();
//程序开始
while(!quit)
{
ASIXGetMessage(&msg, NULL, 0, 0);
switch(msg.message)
{
case WM_COMMAND:
if(msg.lparam == newone) //点击新建按钮
{
if(CreateNote(currentid)) //新建成功则刷新界面
{
if(offset != -1)
{
if(((offset - row + 1) >= 0) && ((offset - row + 1) < NOTE_DISP_MAX))
{
RepaintWindow(note[offset - row + 1], BS_INVERT); //把刚才的目录/文件恢复
}
}
DelOldSearchList(searchlist);
searchlist = LocalSortRecord(lacb, (U8)noworder, currentid, PRECISE_PART_MATCH); //重新读入列表
for(i = 0; i < allnum; i++)
{
Lfree(nowlist[i]);
}
allnum = searchlist->num;
length = NOTE_DISP_MAX; //得出滚动条的长度
if(allnum > NOTE_DISP_MAX)
{
length = allnum;
}
GetNoteList(nowlist, allnum, searchlist); //解析数据
for(i = 0; i < allnum; i++)
{
if(*(nowlist[i]->id) == 0) //当项目类型为文件时,跳出
break;
}
dirnum = i; //得出目录的个数
filenum = allnum - dirnum; //剩下的时文件个数
//更改目录和文件的个数
sprintf(dirtemp, "%u", dirnum);
SetWindowText(dirnumdisp, dirtemp, NULL);
sprintf(filetemp, "%u", filenum);
SetWindowText(filenumdisp, filetemp, NULL);
GroupOn( hGC );
//刷新列表
for(i = 0; i < NOTE_DISP_MAX; i++)
{
if(i < allnum) //列表没有结束时
{
if(*(nowlist[i]->id) == 0) //是文件类型
SetWindowText(property[i], NULL, (char *)zi_wenjianshuxing);
else //是目录类型
SetWindowText(property[i], NULL, (char *)zi_mulushuxing); //属性按钮
SetWindowText(note[i], nowlist[i]->name, NULL); //目录文件名称
}
else //列表结束时,显示空按钮
{
SetWindowText(property[i], NULL, NULL); //显示空属性和按钮
SetWindowText(note[i], NULL, NULL);
}
}
GroupOff( hGC, 0, 46, 159, 197 );
//恢复状态参数
SetScrollRange(scroll, 1, (U16)(length - NOTE_DISP_MAX + 1)); //重新设置滚动条长度,并定位到最顶端
SetScrollPos(scroll, 1, 0, 0);
row = 1;
}
offset = -1;
}
else
if(msg.lparam == del) //点击删除按钮
{
if(offset == -1)
MessageBox(mainwin, "请选择要删除的目录/文件!", "提醒", MB_ICONEXCLAMATION|MB_OK);
else
{
//删除操作
if(MessageBox(mainwin, "确定要删除该目录/文件!!!", "提醒", MB_ICONEXCLAMATION|MB_OKCANCEL) == IDOK)
{
if(((offset - row + 1) >= 0) && ((offset - row + 1) < NOTE_DISP_MAX))
{
RepaintWindow(note[offset - row + 1], BS_INVERT); //把刚才的目录/文件恢复
}
if(*(nowlist[offset]->id) == 0) //要删除的是文件时
{
LocalDelRecord( lacb, nowlist[offset]->index ); //从数据库中删除
}
else //要删除的是目录时
{
strcpy(currentid2, nowlist[offset]->parent);
strcat(currentid2, nowlist[offset]->id);
searchlist2 = LocalFindRecord(lacb, NOTEPAD_PARENT_FIELD, currentid2, 0);
if(searchlist2->num != 0)
{
if(MessageBox(mainwin, "当前目录下还有文件,确定要删除吗!", "提醒", MB_ICONEXCLAMATION|MB_OKCANCEL) == IDOK)
{
for(i = 0; i < searchlist2->num; i++)
{
LocalDelRecord( lacb, searchlist2->head[i].index ); //从数据库中删除
}
LocalDelRecord( lacb, nowlist[offset]->index );
}
}
else
LocalDelRecord( lacb, nowlist[offset]->index );
DelOldSearchList(searchlist2);
searchlist2 = NULL;
}
//刷新列表
DelOldSearchList(searchlist);
searchlist = LocalSortRecord(lacb, (U8)noworder, currentid, PRECISE_PART_MATCH); //重新读入列表
for(i = 0; i < allnum; i++)
{
Lfree(nowlist[i]);
}
allnum = searchlist->num;
GetNoteList(nowlist, allnum, searchlist); //解析数据
length = NOTE_DISP_MAX; //得出滚动条的长度
if(allnum > NOTE_DISP_MAX)
{
length = allnum;
}
for(i = 0; i < allnum; i++)
{
if(*(nowlist[i]->id) == 0) //当项目类型为文件时,跳出
break;
}
dirnum = i; //得出目录的个数
filenum = allnum - dirnum; //剩下的时文件个数
//更改目录和文件的个数
sprintf(dirtemp, "%u", dirnum);
SetWindowText(dirnumdisp, dirtemp, NULL);
sprintf(filetemp, "%u", filenum);
SetWindowText(filenumdisp, filetemp, NULL);
GroupOn( hGC );
//刷新列表
for(i = 0; i < NOTE_DISP_MAX; i++)
{
if(i < allnum) //列表没有结束时
{
if(*(nowlist[i]->id) == 0) //是文件类型
SetWindowText(property[i], NULL, (char *)zi_wenjianshuxing);
else //是目录类型
SetWindowText(property[i], NULL, (char *)zi_mulushuxing); //属性按钮
SetWindowText(note[i], nowlist[i]->name, NULL); //目录文件名称
}
else //列表结束时,显示空按钮
{
SetWindowText(property[i], NULL, NULL); //显示空属性和按钮
SetWindowText(note[i], NULL, NULL);
}
}
GroupOff( hGC, 0, 46, 159, 197 );
//恢复状态参数
SetScrollRange(scroll, 1, (U16)(length - NOTE_DISP_MAX + 1)); //重新设置滚动条长度,并定位到最顶端
SetScrollPos(scroll, 1, 0, 0);
row = 1;
}
}
offset = -1;
}
else
if(msg.lparam == search) //点击查找菜单
{
switch(msg.wparam)
{
case 0: //按时间查找
templist = SearchTime();
if(templist == NULL) //没有查找
{
break;
}
if(templist->num != 0) //查找结果为空
{
if(searchflag == 1)
{
DelOldSearchList(searchlist2);
searchlist2 = NULL;
}
else
{
DelOldSearchList(searchlist);
searchlist = NULL;
}
searchlist2 = templist;
templist = NULL;
if(offset != -1)
{
if(((offset - row + 1) >= 0) && ((offset - row + 1) < NOTE_DISP_MAX))
{
RepaintWindow(note[offset - row + 1], BS_INVERT); //把刚才的目录/文件恢复
}
}
offset = -1;
for(i = 0; i < allnum; i++)
{
Lfree(nowlist[i]);
}
allnum = searchlist2->num;
GetNoteList(nowlist, allnum, searchlist2); //解析数据
length = NOTE_DISP_MAX; //得出滚动条的长度
if(allnum > NOTE_DISP_MAX)
{
length = allnum;
}
for(i = 0; i < allnum; i++)
{
if(*(nowlist[i]->id) == 0) //当项目类型为文件时,跳出
break;
}
dirnum = i; //得出目录的个数
filenum = allnum - dirnum; //剩下的时文件个数
//更改目录和文件的个数
sprintf(dirtemp, "%u", dirnum);
SetWindowText(dirnumdisp, dirtemp, NULL);
sprintf(filetemp, "%u", filenum);
SetWindowText(filenumdisp, filetemp, NULL);
SetWindowText(path, "", NULL);
GroupOn( hGC );
//刷新列表
for(i = 0; i < NOTE_DISP_MAX; i++)
{
if(i < allnum) //列表没有结束时
{
if(*(nowlist[i]->id) == 0) //是文件类型
SetWindowText(property[i], NULL, (char *)zi_wenjianshuxing);
else //是目录类型
SetWindowText(property[i], NULL, (char *)zi_mulushuxing); //属性按钮
SetWindowText(note[i], nowlist[i]->name, NULL); //目录文件名称
}
else //列表结束时,显示空按钮
{
SetWindowText(property[i], NULL, NULL); //显示空属性和按钮
SetWindowText(note[i], NULL, NULL);
}
}
GroupOff( hGC, 0, 46, 159, 197 );
//恢复状态参数
SetScrollRange(scroll, 1, (U16)(length - NOTE_DISP_MAX + 1)); //重新设置滚动条长度,并定位到最顶端
SetScrollPos(scroll, 1, 0, 0);
row = 1;
//查找后的处理
EnableWindow(newone, FALSE);
searchflag = 1;
noworder = TIME_ORDER;
}
else
{
Lfree(templist);
MessageBox(mainwin, "没有符合要求的目录/文件!", "提醒", MB_ICONEXCLAMATION|MB_OK);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -