📄 notepad.c
字号:
#include <stdio.h>
#include <string.h>
#include <minigui/common.h>
#include <minigui/minigui.h>
#include <minigui/gdi.h>
#include <minigui/window.h>
#include <minigui/control.h>
#include <minigui/mgext.h>
#define IDM_NEW 0x01
#define IDM_OPEN 0x02
#define IDM_SAVE 0x03
#define IDM_EXIT 0x04
#define IDC_EDIT 0x05
#define IDC_TIME 0x06
#define IDC_EDIT_FN 0x07
#define IDC_OK_FN 0x08
#define IDM_SEARCH 0x09
#define IDC_EDIT_SH 0x10
#define IDC_SEARCH_SH 0x11
#define IDM_CUT 0x12
#define IDM_PAUSE 0x13
#define IDM_COPY 0x14
#define MAINWINRX 400
#define MAINWINBY 450
#define FILENAME_MAXLEN 30
#define BUFFER_MAXLEN 300
static int flag_changed;
static char filename[FILENAME_MAXLEN];
static char buffer[BUFFER_MAXLEN];
static char texttime[50];
static char searchstr[20];
static FILE* fp;
struct tm* ptime;
static int state;
time_t now;
void saveText(void)
{
if((fp=fopen(filename,"w+"))==NULL)
return;
time(&now);
ptime=localtime(&now);
sprintf(texttime," %s last write time: %d.%d.%d:%d:%d",filename,
ptime->tm_year+1900,ptime->tm_mon+1,ptime->tm_mday,
ptime->tm_hour,ptime->tm_min);
fwrite(buffer,sizeof(buffer),1,fp);
fwrite(texttime,sizeof(texttime),1,fp);
fclose(fp);
}
void openText(void)
{
if((fp=fopen(filename,"r+"))==NULL)
return;
fread(buffer,sizeof(buffer),1,fp);
fread(texttime,sizeof(texttime),1,fp);
fclose(fp);
}
void findStr(int line_pos,int char_pos)
{
int i,j;
char* ch;
for(i=0,j=0;i!=line_pos;j++)
if(buffer[j]=='\n')
i++;
j=j+char_pos;
ch=strstr(buffer+j,searchstr);
state=ch-buffer;
}
void setCur(HWND hEdit)
{
int i=0;
int line_pos,char_pos;
for(line_pos=0,char_pos=0;i<=state;i++,char_pos++)
if(buffer[i]=='\n')
{
line_pos++;
char_pos=-1;
}
char_pos--;
SendMessage(hEdit,EM_SETCARETPOS,line_pos,char_pos);
}
static DLGTEMPLATE DlgInitProgress=
{
WS_BORDER | WS_CAPTION,0,80,50,200,70,"",0,0,3,NULL,0
};
static CTRLDATA CtrlInitProgress[]=
{
{"static",WS_VISIBLE,10,20,50,20,0,"file name :",0},
{"edit",WS_VISIBLE | WS_BORDER,65,20,60,20,IDC_EDIT_FN,"",0},
{"button",WS_VISIBLE,130,20,40,20,IDC_OK_FN,"ok",0}
};
static CTRLDATA CtrlSearchProgress[]=
{
{"static",WS_VISIBLE,10,20,50,20,0,"string :",0},
{"edit",WS_VISIBLE | WS_BORDER,65,20,60,20,IDC_EDIT_SH,"",0},
{"button",WS_VISIBLE,130,20,40,20,IDC_SEARCH_SH,"search",0}
};
static int InitDialogBoxProc(HWND hDlg,int message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case MSG_COMMAND:
switch(wParam)
{
case IDC_OK_FN:
SendMessage(GetDlgItem(hDlg,IDC_EDIT_FN),MSG_GETTEXT,FILENAME_MAXLEN,(LPARAM)filename);
EndDialog(hDlg,wParam);
break;
default:break;
}
break;
case MSG_CLOSE:
EndDialog(hDlg,wParam);
break;
}
return DefaultDialogProc(hDlg,message,wParam,lParam);
}
static int SearchDialogBoxProc(HWND hDlg,int message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case MSG_COMMAND:
switch(wParam)
{
case IDC_SEARCH_SH:
SendMessage(GetDlgItem(hDlg,IDC_EDIT_SH),MSG_GETTEXT,20,(LPARAM)searchstr);
EndDialog(hDlg,wParam);
break;
default:break;
}
break;
case MSG_CLOSE:
EndDialog(hDlg,wParam);
break;
}
return DefaultDialogProc(hDlg,message,wParam,lParam);
}
static void InitDialogBox (HWND hWin)
{
DlgInitProgress.controls=CtrlInitProgress;
DialogBoxIndirectParam(&DlgInitProgress,hWin,InitDialogBoxProc,0L);
}
static void SearchDialogBox (HWND hWin)
{
DlgInitProgress.controls=CtrlSearchProgress;
DialogBoxIndirectParam(&DlgInitProgress,hWin,SearchDialogBoxProc,0L);
}
void askForFilename(HWND hWin)
{
InitDialogBox(hWin);
}
static HMENU createFileSubmenuLvl1(void)
{
HMENU hmnu;
MENUITEMINFO mii;
memset(&mii, 0, sizeof( MENUITEMINFO ) );
mii.type=MFT_SEPARATOR;
mii.id = 0;
mii.typedata = (DWORD)"";
hmnu = CreatePopupMenu( &mii );
memset(&mii, 0, sizeof( MENUITEMINFO ) );
mii.type = MFT_STRING;
mii.id = IDM_NEW;
mii.typedata = (DWORD)"New";
InsertMenuItem( hmnu, 0, TRUE, &mii );
mii.type = MFT_STRING;
mii.id = IDM_OPEN;
mii.typedata = (DWORD)"Open";
InsertMenuItem( hmnu, 1, TRUE, &mii );
mii.type = MFT_STRING;
mii.id = IDM_SAVE;
mii.typedata = (DWORD)"Save";
InsertMenuItem( hmnu, 2, TRUE, &mii );
mii.type = MFT_STRING;
mii.id = IDM_EXIT;
mii.typedata = (DWORD)"Exit";
InsertMenuItem( hmnu, 3, TRUE, &mii );
return hmnu;
}
static HMENU createEditSubmenuLvl1(void)
{
HMENU hmnu;
MENUITEMINFO mii;
memset(&mii, 0, sizeof( MENUITEMINFO ) );
mii.type = MFT_SEPARATOR;
mii.id = 0;
mii.typedata = (DWORD)"";
hmnu = CreatePopupMenu( &mii );
memset(&mii, 0, sizeof( MENUITEMINFO ) );
mii.type = MFT_STRING;
mii.id = IDM_SEARCH;
mii.typedata = (DWORD)"search";
InsertMenuItem( hmnu, 0, TRUE, &mii );
mii.type = MFT_STRING;
mii.id = IDM_CUT;
mii.typedata = (DWORD)"cut";
InsertMenuItem( hmnu, 1, TRUE, &mii );
mii.type = MFT_STRING;
mii.id = IDM_PAUSE;
mii.typedata = (DWORD)"pause";
InsertMenuItem( hmnu, 2, TRUE, &mii );
mii.type = MFT_STRING;
mii.id = IDM_COPY;
mii.typedata = (DWORD)"copy";
InsertMenuItem( hmnu, 3, TRUE, &mii );
return hmnu;
}
static HMENU createMenu(void)
{
HMENU hmnu;
MENUITEMINFO mii;
hmnu = CreateMenu();
memset( &mii, 0, sizeof( MENUITEMINFO ) );
mii.type = MFT_STRING;
mii.id = 0;
mii.typedata = (DWORD)"File";
mii.hsubmenu = createFileSubmenuLvl1();
InsertMenuItem( hmnu, 0, TRUE, &mii );
mii.type = MFT_STRING;
mii.id = 0;
mii.typedata = (DWORD)"Edit";
mii.hsubmenu = createEditSubmenuLvl1();
InsertMenuItem( hmnu, 1, TRUE, &mii );
return hmnu;
}
static int notepadWinProc( HWND hWin, int message, WPARAM wParam, LPARAM lParam )
{
int char_pos,line_pos;
flag_changed = 0;
time(&now);
ptime=localtime( &now );
sprintf(texttime," %s last write time: %d.%d.%d:%d:%d",filename,
ptime->tm_year+1900,ptime->tm_mon+1,ptime->tm_mday,
ptime->tm_hour,ptime->tm_min);
switch(message)
{
case MSG_CREATE:
CreateWindow(CTRL_TEXTEDIT, "",
WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | ES_AUTOWRAP, IDC_EDIT,
0, 0, MAINWINRX-4, MAINWINBY-75, hWin, 0 );
CreateWindow(CTRL_STATIC, texttime,
WS_VISIBLE, IDC_TIME,
0, MAINWINBY-74, MAINWINRX, 74, hWin, 0 );
break;
case MSG_COMMAND:
switch(wParam)
{
case IDM_NEW:
if(flag_changed != 0)
{
}
strcpy(filename,"");
SendMessage(GetDlgItem(hWin,IDC_EDIT),MSG_SETTEXT,0,(LPARAM)"" );
flag_changed = 0;
time(&now);
ptime=localtime( &now );
strcpy(filename,"");
sprintf(texttime," %s last write time: %d.%d.%d:%d:%d",filename,
ptime->tm_year+1900,ptime->tm_mon+1,ptime->tm_mday,
ptime->tm_hour,ptime->tm_min);
SendMessage(GetDlgItem( hWin,IDC_TIME),MSG_SETTEXT,50,(LPARAM)texttime);
break;
case IDM_OPEN:
if(flag_changed != 0 )
{
}
askForFilename( hWin );
openText();
SendMessage(GetDlgItem( hWin,IDC_EDIT),MSG_SETTEXT,BUFFER_MAXLEN,(LPARAM)buffer);
SendMessage(GetDlgItem( hWin,IDC_TIME),MSG_SETTEXT,50,(LPARAM)texttime);
flag_changed = 0;
break;
case IDM_SAVE:
askForFilename(hWin);
SendMessage(GetDlgItem(hWin,IDC_EDIT),MSG_GETTEXT,BUFFER_MAXLEN,(LPARAM)buffer);
saveText();
flag_changed = 1;
break;
case IDM_SEARCH:
SendMessage(GetDlgItem(hWin,IDC_EDIT),MSG_GETTEXT, BUFFER_MAXLEN, (LPARAM)buffer);
SearchDialogBox(hWin);
SendMessage(GetDlgItem(hWin,IDC_EDIT),EM_GETCARETPOS,(WPARAM)&line_pos, (LPARAM)&char_pos);
findStr(line_pos,char_pos);
setCur(GetDlgItem(hWin,IDC_EDIT));
break;
case IDM_CUT:
SendMessage (GetDlgItem( hWin, IDC_EDIT ), EM_CUTTOCB, 0, 0);
break;
case IDM_PAUSE:
SendMessage (GetDlgItem( hWin, IDC_EDIT ), EM_INSERTCBTEXT, 0, 0);
break;
case IDM_COPY:
SendMessage (GetDlgItem( hWin, IDC_EDIT ), EM_COPYTOCB, 0, 0);
break;
case IDM_EXIT:
if( flag_changed != 0 )
{
}
DestroyMainWindow( hWin );
PostQuitMessage( hWin );
return 0;
default: break;
}
break;
case MSG_CLOSE:
DestroyMainWindow( hWin );
PostQuitMessage( hWin );
return 0;
}
return DefaultMainWinProc( hWin, message, wParam, lParam );
}
int MiniGUIMain( int argc, const char* argv[] )
{
MAINWINCREATE mainWinCreateInfo;
HWND hWin;
MSG Msg;
#ifdef _MGRM_PROCESSES
JoinLayer( NAME_DEF_LAYER, "notepad", 0, 0 );
#endif
mainWinCreateInfo.dwStyle = WS_VISIBLE | WS_BORDER | WS_CAPTION;
mainWinCreateInfo.dwExStyle = WS_EX_NONE;
mainWinCreateInfo.spCaption = "NOTEPAD";
mainWinCreateInfo.hMenu = createMenu();
mainWinCreateInfo.hCursor = GetSystemCursor( 0 );
mainWinCreateInfo.hIcon = 0;
mainWinCreateInfo.MainWindowProc = notepadWinProc;
mainWinCreateInfo.lx = 0;
mainWinCreateInfo.ty = 0;
mainWinCreateInfo.rx = MAINWINRX;
mainWinCreateInfo.by = MAINWINBY;
mainWinCreateInfo.iBkColor = COLOR_lightwhite;
mainWinCreateInfo.dwAddData = 0;
mainWinCreateInfo.hHosting = HWND_DESKTOP;
hWin = CreateMainWindow( &mainWinCreateInfo );
if( hWin == HWND_INVALID )
return -1;
ShowWindow(hWin,SW_SHOWNORMAL);
while( GetMessage( &Msg, hWin))
{
TranslateMessage( &Msg );
DispatchMessage( &Msg );
}
MainWindowThreadCleanup( hWin );
return 0;
}
#ifndef _MGRM_PROCESSES
#include <minigui/dti.c>
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -