📄 notepro.asm
字号:
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; NOTEPRO FOR WINDOWS
;
; 这是一个记事本程序,也是我的第一个32位汇编程序
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat,stdcall
option casemap:none
;>>>>>>>>>>>>>>>include文件定义>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
include comctl32.inc
includelib comctl32.lib
include comdlg32.inc
includelib comdlg32.lib
include shell32.inc ;ShellExecuteEx API
includelib shell32.lib
include masm32.inc
includelib masm32.lib ;by str function
include gdi32.inc
includelib gdi32.lib
;>>>>>>>>>>>>>>自定义函数声明>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_OpenTheFile proto
_argc proto
_argv proto :dword,:dword,:dword
_Init proto
_OpenFile proto
_SaveFile proto
_SaveAs proto
_ProcStream proto :dword,:dword,:dword,:dword
_CreateTBParts proto
_EditSize proto
_CheckModify proto
_SetCaption proto
_PageSetup proto
_GetPrinterDC proto
_PrintText proto
_FindText proto
_ResizeWindow proto
_Quit proto
_ProcSoftDlg proto :dword,:dword,:dword,:dword
_ProcWinMain proto :dword,:dword,:dword,:dword
_WinMain proto
_GetRecentlyFile proto
_SaveRecentlyFile proto
_DeleteMenu proto
_DeleteFileKey proto
_GetFilePath proto
_SetToolStatus proto
_SetMenuStatus proto
_SetStatusStatus proto
_SetFont proto :dword,:dword,:dword
_ModifyTimeMenu proto
_ChooseFont proto
_ChooseColor proto
_ProcRichEdit proto :dword,:dword,:dword,:dword
_LetterChange proto
_GetRichEdit proto
_OFNHookProcTxt proto :dword,:dword,:dword,:dword
_ProcOptionDlg proto :dword,:dword,:dword,:dword
_SetChild1Status proto
_GetChild1Status proto
_ReadConfigFile proto
_GetFileTitle proto
_SaveWinPosition proto
_ReadWinPosition proto
_ShowSplash proto
_SplashProc proto :dword,:dword,:dword,:dword
_ProcChild1 proto :dword,:dword,:dword,:dword
_ProcChild2 proto :dword,:dword,:dword,:dword
;>>>>>>>>>>>>>>>>>equ等值定义>>>>>>>>>>>>>>>>>>>>>>>>>>>
IDM_FILE_NEW equ 4110h
IDM_FILE_OPEN equ 4120h
IDM_FILE_SAVE equ 4130h
IDM_FILE_SAVEAS equ 4140h
IDM_FILE_CREATE equ 4170h
IDM_FILE_SETUP equ 4180h
IDM_FILE_PRINT equ 4190h
IDM_FILE_RECENT_FILE01 equ 4191h
IDM_FILE_RECENT_FILE10 equ 419ah
IDM_FILE_RECENT_DELLIST equ 4200h
IDM_FILE_EXIT equ 4290h
IDM_EDIT_UNDO equ 4310h
IDM_EDIT_REDO equ 4320h
IDM_EDIT_CUT equ 4330h
IDM_EDIT_COPY equ 4340h
IDM_EDIT_PASTE equ 4350h
IDM_EDIT_DEL equ 4360h
IDM_EDIT_CHANG_CHANG equ 4361h
IDM_EDIT_CHANG_UPPER equ 4362h
IDM_EDIT_CHANG_LOWER equ 4363h
IDM_EDIT_INSERT_DATE1 equ 4371h ;时间与日期
IDM_EDIT_INSERT_DATE7 equ 4377h
IDM_EDIT_SELECTALL equ 4380h
IDM_SEARCH_FIND equ 4510h
IDM_SEARCH_NEXT equ 4520h
IDM_SEARCH_PREV equ 4530h
IDM_SEARCH_REPLACE equ 4540h
IDM_SEARCH_GOTO equ 4550h
IDM_CONFIG_FONT equ 4710h
IDM_CONFIG_BKCOLOR equ 4720h
IDM_CONFIG_TOOL equ 4730h
IDM_CONFIG_STATUS equ 4740h
IDM_CONFIG_BAR equ 4750h
IDM_CONFIG_WRAP equ 4760h
IDM_CONFIG_OPTION equ 4770h
IDM_HELP_HELP equ 4910h
IDM_HELP_SOFT equ 4920h
IDM_MENUHELP equ 6000h
IDM_RESTORE equ 7000h
ID_MainMenu equ 1000h
ID_MainAcc equ 2000h
ID_ToolBar equ 3000h
ID_StatusBar equ 4000h
ID_MainIcon equ 5000h
ID_TrayIcon equ 6000h
DLG_SOFT equ 0001h
DLG_GOTO equ 0002h
DLG_TXT equ 0003h
DLG_OPTION equ 1010h
DLG_CHILD1 equ 1011h
DLG_CHILD2 equ 1012h
ID_LINETEXT equ 0010h
ID_PREVIEW equ 0011h
IDC_TAB1 equ 0012h
ID_SAVE equ 0100h
ID_ESC equ 0101h
ID_ONTOP equ 0102h
ID_FULLPATH equ 0103h
ID_POSITION equ 0104h
ID_TRAY equ 0105h
ID_DROPPED equ 0106h
ID_SPLASH equ 0107h
WM_SHELLNOTIFY equ WM_USER+5
CDN_INITDONE equ CDN_FIRST - 0
CDN_SELCHANGE equ CDN_FIRST - 1
;>>>>>>>>>>>>>>>>>>>>>数据段>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data
dwMenuHelp dd 0,IDM_MENUHELP,0,0
bReadOnlyFlag dd FALSE
bInsertFlag dd TRUE
bHasModifyFlag dd FALSE
bToUpper dd FALSE
bToLower dd FALSE
bTool dd TRUE
bStatus dd TRUE
bShowBar dd TRUE ;显示边距
bWrap dd TRUE ;自动换行
bSave dd TRUE ;选项对话框中的各标志
bEsc dd TRUE
bOnTop dd FALSE
bFullPath dd TRUE
bPosition dd FALSE
bTray dd TRUE
bDropped dd TRUE
bSplash dd FALSE
.data?
hInstance dd ?
lpCmdline dd ? ;指向命令行
hWinMain dd ?
hMenu dd ?
hTrayMenu dd ?
hDlgSoft dd ?
hDlgGoto dd ?
hDlgTxt dd ?
hDlgOption dd ?
hTab1 dd ?
hChild1 dd ?
hChild2 dd ?
hSplash dd ?
hToolBar dd ?
hEditDll dd ?
hEdit dd ?
hPreView dd ?
hStatus dd ?
szFileName db MAX_PATH dup (?)
szFileTitle db MAX_PATH dup (?)
szBuffer1 db MAX_PATH dup (?)
szBuffer2 db MAX_PATH dup (?)
hFile dd ?
hFindDialog dd ?
szFindText db 100 dup (?)
szReplaceText db 100 dup (?)
stFind FINDREPLACE <?>
idFindMessage dd ?
bReplaceAllFlag db ?
dwFontColor dd ?
stLogFont LOGFONT <?>
dwBackColor dd ?
dwCustColors dd 16 dup (?)
lpOldProcRichEdit dd ?
stOF OPENFILENAME <>
stNote NOTIFYICONDATA <>
stItem TC_ITEM <?>
WhichTabChosen DWORD ?
;>>>>>>>>>>>>>>>>>>>常量定义>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.const
szClassName db 'NotePro',0
szCaptionMain db 'NotePro',0
szEditDllName db 'Riched20.dll',0
szEditClassName db 'RichEdit20A',0
szFilter db 'All supprt(*.txt;*.ini;*.asm;*.inc;*.c;*.h;*.rc;*.cpp;*.htm;*.html)',0,\
'*.txt;*.ini;*.asm;*.inc;*.c;*.h;*.rc;*.cpp;*.htm;*.html',0,
'Text Files(*.txt;*.ini)',0,'*.txt;*.ini',0,
'Asm Files(*.asm;*.inc)',0,'*.asm;*.inc',0,
'C/C++Files(*.c;*.h;*.rc;*.cpp)',0,'*.c;*.h;*.rc;*.cpp',0,
'Html Files(*.htm;*.html)',0,'*.htm;*.html',0,
'All Files(*.*)',0,'*.*',0,0
szSplashName db "Splash_Class",0
szErrOpenFile db '无法打开文件!',0
szDefExt db 'txt',0
szSaveCaption db '请输入保存的文件名',0
szErrCreateFile db '无法建立文件!',0
szFileReadOnly db '这是只读文件',0
szLineError db '行号大于总行数了',0
szCaption db '提问',0
szModify db '文件已修改,是否保存?',0
szTitleFormat1 db 'NotePro - [%s]',0
szTitleFormat2 db 'NotePro - [%s %s]',0
szNoName db '未命名的文件',0
FINDMSGSTRING db 'commdlg_FindReplace',0
szNotFound db '字符串未找到!',0
szReplaceInfo db '共替换字符串N处!',0
szPreview db '选中一个文本文件,在这里预览其中的内容',0
szFontFace db '宋体',0
CHAR_BLANK equ 20h
CHAR_DELI equ '"'
szCharStar db '*',0
szCharBlank db ' ',0
szIniFileName db '\Notepro.ini',0
szSecName1 db 'Recently Files',0
szKeyName1 db 'File01',0,'File02',0,'File03',0,'File04',0,'File05',0,\
'File06',0,'File07',0,'File08',0,'File09',0,'File10',0
szSecName2 db 'Options',0
szKeyName2a db 'SaveAtExit',0
szKeyName2b db 'EscapeExit',0
szKeyName2c db 'AlwaysOnTop',0
szKeyName2d db 'FullPath',0
szKeyName2e db 'SavePosition',0
szKeyName2f db 'MinimizeToTray',0
szKeyName2g db 'DNDNewWindow',0
szKeyName2h db 'ShowSplash',0
szKeyName2i db 'ShowTool',0
szKeyName2j db 'ShowStatus',0
szKeyName2k db 'ShowBar',0
szKeyName2l db 'AutoWrap',0
szSecName3 db 'Windows Placement',0
szKeyName3a db 'showCmd',0
szKeyName3b db 'Min.X',0
szKeyName3c db 'Min.Y',0
szKeyName3d db 'Max.X',0
szKeyName3e db 'Max.Y',0
szKeyName3f db 'Top',0
szKeyName3g db 'Left',0
szKeyName3h db 'Bottom',0
szKeyName3i db 'Right',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
stToolbar equ this byte
TBBUTTON <STD_FILENEW,IDM_FILE_NEW,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1>
TBBUTTON <STD_FILEOPEN,IDM_FILE_OPEN,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1>
TBBUTTON <STD_FILESAVE,IDM_FILE_SAVE,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1>
TBBUTTON <0,0,TBSTATE_ENABLED,TBSTYLE_SEP,0,0,-1>
TBBUTTON <STD_COPY,IDM_EDIT_COPY,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1>
TBBUTTON <STD_CUT,IDM_EDIT_CUT,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1>
TBBUTTON <STD_PASTE,IDM_EDIT_PASTE,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1>
TBBUTTON <0,0,TBSTATE_ENABLED,TBSTYLE_SEP,0,0,-1>
TBBUTTON <STD_UNDO,IDM_EDIT_UNDO,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1>
TBBUTTON <STD_REDOW,IDM_EDIT_REDO,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1>
TBBUTTON <0,0,TBSTATE_ENABLED,TBSTYLE_SEP,0,0,-1>
TBBUTTON <STD_FIND,IDM_SEARCH_FIND,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1>
TBBUTTON <STD_REPLACE,IDM_SEARCH_REPLACE,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1>
TBBUTTON <0,0,TBSTATE_ENABLED,TBSTYLE_SEP,0,0,-1>
TBBUTTON <STD_PRINT,IDM_FILE_PRINT,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1>
NUM_BUTTONS equ 15
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
szTimeFormat1 db '%s-%s-%s',0
szTimeFormat3 db '%s.%s.%s',0
szTimeFormat4 db '%d年%d月%d日',0
szTimeFormat5 db '%d年%d月%d日 星期%s',0
szTimeFormat6 db '%d:%s:%s',0
szWeek db '日一二三四五六',0
szTime db '凌晨上午下午晚上',0
;>>>>>>>>>>>>>>>>>>
szReady db '就绪',0
szLineFormat db '当前行:%d',0
szLinesFormat db '总行数:%d',0
szCharsFormat db '总长度:%d',0
szRWMode db '读写',0
szRMode db '只读',0
szInsert db '插入',0
szUnInsert db '改写',0
szCapsLock db '大写',0
szCapsUnLock db '小写',0
szNumLock db '数字',0
szNumUnLock db '控制',0
szRestore db '显示主窗口',0
szExit db '退出',0
TabTitle1 DB "常 规",0
TabTitle2 DB "关 于",0
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ShowTab1 proc
INVOKE GetDlgItem,hDlgOption,IDC_TAB1
MOV hTab1,EAX
MOV stItem.imask,TCIF_TEXT
MOV stItem.lpReserved1,0
MOV stItem.lpReserved2,0
MOV stItem.pszText,OFFSET TabTitle1
MOV stItem.cchTextMax,sizeof TabTitle1
MOV stItem.iImage,0
MOV stItem.lParam,0
INVOKE SendMessage,hTab1,TCM_INSERTITEM,0,OFFSET stItem
MOV stItem.pszText,OFFSET TabTitle2
MOV stItem.cchTextMax,sizeof TabTitle2
INVOKE SendMessage,hTab1,TCM_INSERTITEM,1,OFFSET stItem
MOV EAX,OFFSET _ProcChild1
INVOKE CreateDialogParam,hInstance,DLG_CHILD1,hTab1,EAX,0
MOV hChild1,EAX
MOV EAX,OFFSET _ProcChild2
INVOKE CreateDialogParam,hInstance,DLG_CHILD2,hTab1,EAX,0
MOV hChild2,EAX
MOV WhichTabChosen,0
INVOKE ShowWindow,hChild1,SW_SHOWDEFAULT
;invoke MessageBox,hWinMain,addr szClassName,NULL,MB_OK
ret
_ShowTab1 endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ShowSplash proc
local @Spl :WNDCLASSEX
local @DlgWidth :DWORD
local @DlgHeight :DWORD
local @DlgLeft :DWORD
local @DlgTop :DWORD
mov @Spl.cbSize, sizeof WNDCLASSEX
mov @Spl.style, CS_HREDRAW or CS_VREDRAW or CS_BYTEALIGNWINDOW
mov @Spl.lpfnWndProc, offset _SplashProc
mov @Spl.cbClsExtra, NULL
mov @Spl.cbWndExtra, NULL
push hInstance
pop @Spl.hInstance
mov @Spl.hbrBackground,COLOR_BTNFACE+1
mov @Spl.lpszMenuName, NULL
mov @Spl.lpszClassName, offset szSplashName
mov @Spl.hIcon, NULL
mov @Spl.hCursor, NULL
mov @Spl.hIconSm, NULL
invoke RegisterClassEx,addr @Spl
;*************************************
mov @DlgWidth,350
mov @DlgHeight,200
invoke GetSystemMetrics,SM_CXSCREEN
sub eax,@DlgWidth
shr eax,1
mov @DlgLeft,eax
invoke GetSystemMetrics,SM_CYSCREEN
sub eax,@DlgHeight
shr eax,1
mov @DlgTop,eax
invoke CreateWindowEx,WS_EX_TOPMOST,ADDR szSplashName,NULL,WS_POPUP or WS_BORDER,\
@DlgLeft,@DlgTop,@DlgWidth,@DlgHeight,NULL,NULL,hInstance,NULL
mov hSplash,eax
invoke ShowWindow,hSplash,SW_SHOWNORMAL
invoke UpdateWindow,hSplash
ret
_ShowSplash endp
;>>>>>>>>>>>>>>>>>>>取窗口属性>>>>>>>>>>>>>>>>>>>>
_ReadWinPosition proc
local @stWin :WINDOWPLACEMENT
mov @stWin.iLength,sizeof @stWin
mov @stWin.flags,0
invoke GetWindowPlacement,hWinMain,addr @stWin
invoke GetPrivateProfileInt,addr szSecName3,addr szKeyName3a,@stWin.showCmd,addr szBuffer1
mov @stWin.showCmd,eax
invoke GetPrivateProfileInt,addr szSecName3,addr szKeyName3b,@stWin.ptMinPosition.x,addr szBuffer1
mov @stWin.ptMinPosition.x,eax
invoke GetPrivateProfileInt,addr szSecName3,addr szKeyName3c,@stWin.ptMinPosition.y,addr szBuffer1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -