📄 richedit.asm
字号:
; #########################################################################
.386
.model flat, stdcall ; 32 bit memory model
option casemap :none ; case sensitive
include Richedit.inc ; local includes for this file
; ---------------------------------------
; Select rich edit version here, leave
; uncomment for richedit version 1 or
; comment out for richedit version 2
; ---------------------------------------
riched1 equ <anytext>
; -----------------------------------
; Select right click menu popup here
; -----------------------------------
menu_popup equ 0 ; 0 = File, 1 = Edit etc ....
; --------------------------
; Select either system font
; --------------------------
edit_font equ <SYSTEM_FIXED_FONT>
; edit_font equ <ANSI_FIXED_FONT>
; #########################################################################
.code
start:
invoke GetModuleHandle, NULL
mov hInstance, eax
invoke GetCommandLine
mov CommandLine, eax
invoke InitCommonControls
; --------------------------
; preset GLOBAL scope flags
; --------------------------
mov CaseFlag, 1
mov WholeWord, 0
mov CtrlFlag, 0
invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT
invoke ExitProcess,eax
; #########################################################################
WinMain proc hInst :DWORD,
hPrevInst :DWORD,
CmdLine :DWORD,
CmdShow :DWORD
;====================
; Put LOCALs on stack
;====================
LOCAL Wwd :DWORD
LOCAL Wht :DWORD
LOCAL Wtx :DWORD
LOCAL Wty :DWORD
LOCAL lpArg:DWORD
LOCAL sWid :DWORD
LOCAL sHgt :DWORD
LOCAL wc :WNDCLASSEX
LOCAL msg :MSG
; --------------------------------------------------
; Fill WNDCLASSEX structure with required variables
; --------------------------------------------------
invoke LoadIcon,hInst,500 ; icon ID
mov hIcon, eax
szText szClassName,"Rich_Edit_Class"
mov wc.cbSize, sizeof WNDCLASSEX
mov wc.style, CS_BYTEALIGNWINDOW
mov wc.lpfnWndProc, offset WndProc
mov wc.cbClsExtra, NULL
mov wc.cbWndExtra, NULL
m2m wc.hInstance, hInst
mov wc.hbrBackground, NULL
m2m wc.lpszMenuName, NULL
mov wc.lpszClassName, offset szClassName
m2m wc.hIcon, hIcon
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor, eax
m2m wc.hIconSm, hIcon
invoke RegisterClassEx, ADDR wc
; -------------------------------------------------
; Size & centre window at 75% x 75% of screen size
; -------------------------------------------------
invoke GetSystemMetrics,SM_CXSCREEN
mov sWid, eax
push sWid
shr eax, 2
sub sWid, eax
m2m Wwd, sWid
invoke GetSystemMetrics,SM_CYSCREEN
mov sHgt, eax
push sHgt
shr eax, 2
sub sHgt, eax
m2m Wht, sHgt
pop sHgt
invoke TopXY,Wht,sHgt
mov Wty, eax
pop sWid
invoke TopXY,Wwd,sWid
mov Wtx, eax
; ----------------------------------
invoke CreateWindowEx,WS_EX_LEFT or WS_EX_ACCEPTFILES,
ADDR szClassName,
ADDR Untitled,
WS_OVERLAPPEDWINDOW,
Wtx,Wty,Wwd,Wht,
NULL,NULL,
hInst,NULL
mov hWnd,eax
; ------------------------------
; get any command line filename
; ------------------------------
invoke PathGetArgs,CommandLine
mov lpArg, eax
mov esi, eax
lodsb
cmp al, 0
je noArgs ; jump if no arg
cmp al, 34
jne @F ; jump if no quote
invoke PathUnquoteSpaces,lpArg
mov lpArg, eax
@@:
invoke exist,lpArg
.if eax == 1
invoke StreamFileIn,hRichEd,lpArg
invoke SetWindowText,hWnd,lpArg
invoke SendMessage,hRichEd,EM_SETMODIFY,0,0
.else
szText cantfind,"Sorry, cannot find that file."
invoke MessageBox,hWnd,lpArg,ADDR cantfind,MB_OK
.endif
noArgs:
; ------------------------------
invoke LoadMenu,hInst,600 ; menu ID
mov hMnu, eax
invoke SetMenu,hWnd,eax
invoke ShowWindow,hWnd,SW_SHOWNORMAL
invoke UpdateWindow,hWnd
; -----------------------------------
; Loop until PostQuitMessage is sent
; -----------------------------------
StartLoop:
invoke GetMessage,ADDR msg,NULL,0,0
cmp eax, 0
je ExitLoop
; ------------------------------------------------
; process keystrokes directly in the message loop
; ------------------------------------------------
.if msg.message == WM_KEYDOWN
.if msg.wParam == VK_ESCAPE
invoke SendMessage,hWnd,WM_SYSCOMMAND,SC_CLOSE,NULL
.elseif msg.wParam == VK_CONTROL
mov CtrlFlag, 1 ; flag set
.endif
.endif
.if msg.message == WM_KEYUP
.if msg.wParam == VK_CONTROL
mov CtrlFlag, 0 ; flag clear
.elseif msg.wParam == 54h ; Ctrl + T
.if CtrlFlag == 1
invoke SendMessage,hWnd,WM_COMMAND,1105,0
.endif
.elseif msg.wParam == 4Eh ; Ctrl + N
.if CtrlFlag == 1
invoke SendMessage,hWnd,WM_COMMAND,1000,0
.endif
.elseif msg.wParam == 57h ; Ctrl + W
.if CtrlFlag == 1
invoke SendMessage,hWnd,WM_COMMAND,1001,0
jmp StartLoop
.endif
.elseif msg.wParam == 4Fh ; Ctrl + O
.if CtrlFlag == 1
invoke SendMessage,hWnd,WM_COMMAND,1002,0
.endif
.elseif msg.wParam == 53h ; Ctrl + S
.if CtrlFlag == 1
invoke SendMessage,hWnd,WM_COMMAND,1003,0
.endif
.elseif msg.wParam == 42h ; Ctrl + B
.if CtrlFlag == 1
invoke SendMessage,hWnd,WM_COMMAND,1004,0
.endif
.endif
.endif
; ------------------------------------------------
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
jmp StartLoop
ExitLoop:
return msg.wParam
WinMain endp
; #########################################################################
WndProc proc hWin :DWORD,
uMsg :DWORD,
wParam :DWORD,
lParam :DWORD
LOCAL var :DWORD
LOCAL caW :DWORD
LOCAL caH :DWORD
LOCAL hTbar :DWORD
LOCAL hSbar :DWORD
LOCAL tl :DWORD
LOCAL hDC :DWORD
LOCAL lpTxt :DWORD
LOCAL nmh :NMHDR
LOCAL Rct :RECT
LOCAL Ps :PAINTSTRUCT
LOCAL tbab :TBADDBITMAP
LOCAL tbb :TBBUTTON
LOCAL buffer1[128]:BYTE
LOCAL FileBuffer[260]:BYTE
.if uMsg == WM_COMMAND
;======== toolbar commands ========
.if wParam == 50
jmp NewFile
.elseif wParam == 51
jmp FileOpen
.elseif wParam == 52
jmp FileSave
.elseif wParam == 53
jmp mnu_Cut
.elseif wParam == 54
jmp mnu_Copy
.elseif wParam == 55
jmp mnu_Paste
.elseif wParam == 56
jmp mnu_Undo
.elseif wParam == 57
jmp mnu_FindText
.elseif wParam == 58
jmp new_instance
.elseif wParam == 59
jmp QuitApp
;======== menu commands ========
.elseif wParam == 1000 ; **** New ****
NewFile:
invoke Confirmation,hRichEd
.if eax == IDYES
jmp FileSave
.elseif eax == IDNO
jmp @F
.elseif eax == IDCANCEL
return 0
.endif
@@:
invoke SendMessage,hWin,WM_SETTEXT,0,ADDR Untitled
invoke SendMessage,hRichEd,WM_SETTEXT,0,0
invoke SendMessage,hRichEd,EM_SETMODIFY,0,0
; -------------------------
; Reset status bar message
; -------------------------
szText nStr,0
invoke SendMessage,hStatus,SB_SETTEXT,3,ADDR nStr
.elseif wParam == 1001 ; **** New Instance ****
new_instance:
invoke GetModuleFileName,NULL,ADDR buffer1,128
invoke WinExec,ADDR buffer1,SW_SHOW
.elseif wParam == 1002 ; **** Open ****
FileOpen:
invoke Confirmation,hRichEd
.if eax == IDYES
jmp FileSave
.elseif eax == IDCANCEL
return 0
.endif
jmp @F
szTitleO db "Open A File",0
szFilterO db "All files",0,"*.*",0,
"Text files",0,"*.TEXT",0,0
@@:
mov szFileName[0],0
invoke GetFileName,hWin,ADDR szTitleO,ADDR szFilterO
cmp szFileName[0],0 ;<< zero if cancel pressed in dlgbox
je @F
invoke StreamFileIn,hRichEd,ADDR szFileName
invoke SetWindowText,hWin,ADDR szFileName
@@:
.elseif wParam == 1003 ; **** Save ****
FileSave:
invoke SendMessage,hWin,WM_GETTEXTLENGTH,0,0
mov tl, eax
inc tl ; 1 extra for zero terminator
invoke GetWindowText,hWin,ADDR buffer1,tl
invoke lstrcmp,ADDR buffer1,ADDR Untitled
cmp eax, 0 ; eax is zero is strings are equal
jne @F
jmp FileSaveAs
@@:
invoke StreamFileOut,hRichEd,ADDR buffer1
invoke SendMessage,hRichEd,EM_SETMODIFY,0,0
.elseif wParam == 1004 ; **** Save As ****
FileSaveAs:
jmp @F
szTitleS db "Save file as",0
szFilterS db "All files",0,"*.*",0,
"Text files",0,"*.TEXT",0,0
@@:
mov szFileName[0],0
invoke SaveFileName,hWin,ADDR szTitleS,ADDR szFilterS
cmp szFileName[0],0 ;<< zero if cancel pressed in dlgbox
je @F
invoke StreamFileOut,hRichEd,ADDR szFileName
invoke SendMessage,hRichEd,EM_SETMODIFY,0,0
invoke SendMessage,hWin,WM_SETTEXT,0,ADDR szFileName
@@:
.elseif wParam == 1005
invoke MergeFile,hRichEd
.elseif wParam == 1010 ; **** Exit ****
QuitApp:
invoke SendMessage,hWin,WM_SYSCOMMAND,SC_CLOSE,NULL
; ----------
; Edit Menu
; ----------
.elseif wParam == 1100
mnu_Undo:
invoke SendMessage,hRichEd,EM_UNDO,0,0
.elseif wParam == 1101
mnu_Cut:
invoke SendMessage,hRichEd,WM_CUT,0,0
.elseif wParam == 1102
mnu_Copy:
invoke SendMessage,hRichEd,WM_COPY,0,0
.elseif wParam == 1103
mnu_Paste:
invoke SendMessage,hRichEd,EM_PASTESPECIAL,CF_TEXT,0
.elseif wParam == 1104
invoke SendMessage,hRichEd,WM_CLEAR,0,0
.elseif wParam == 1105
invoke SendMessage,hRichEd,EM_SETOPTIONS,ECOOP_XOR,ECO_SELECTIONBAR
.elseif wParam == 1106
mnu_FindText:
invoke CallSearchDlg
.elseif wParam == 1107
mnu_FindNext:
invoke TextFind,ADDR SearchText,TextLen
.elseif wParam == 1108
invoke Select_All,hRichEd
.elseif wParam == 1900 ; **** About ****
szText RichEd,"MASM RichEdit"
szText AboutMsg,"Rich Text Editor",13,10,\
"Copyright
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -