📄 qikpad.asm
字号:
invoke MoveWindow,hEdit,0,tbh,wWid,wHgt,TRUE
.elseif uMsg == WM_CLOSE
invoke SendMessage,hEdit,EM_GETMODIFY,0,0
.if eax == TRUE
invoke Confirmation,hWin
.if eax == IDYES
invoke SaveFile
.elseif eax == IDCANCEL
mov eax, 0
ret
.endif
.endif
.elseif uMsg == WM_DESTROY
invoke PostQuitMessage,NULL
return 0
.endif
invoke DefWindowProc,hWin,uMsg,wParam,lParam
ret
WndProc endp
; ########################################################################
TopXY proc wDim:DWORD, sDim:DWORD
shr sDim, 1 ; divide screen dimension by 2
shr wDim, 1 ; divide window dimension by 2
mov eax, wDim ; copy window dimension into eax
sub sDim, eax ; sub half win dimension from half screen dimension
return sDim
TopXY endp
; ########################################################################
EditML proc szMsg:DWORD,tx:DWORD,ty:DWORD,wd:DWORD,ht:DWORD,
hParent:DWORD,ID:DWORD,Wrap:DWORD
LOCAL hCtl :DWORD
LOCAL hFnt :DWORD
LOCAL eStyle :DWORD
szText CtlStyle,"EDIT"
mov eStyle, WS_VISIBLE or WS_CHILDWINDOW or \
WS_VSCROLL or ES_NOHIDESEL or \
ES_AUTOVSCROLL or ES_MULTILINE
.if Wrap == 0
or eStyle,WS_HSCROLL or ES_AUTOHSCROLL
.endif
invoke CreateWindowEx,WS_EX_CLIENTEDGE,ADDR CtlStyle,szMsg,
eStyle,tx,ty,wd,ht,hParent,ID,hInstance,NULL
mov hCtl, eax
invoke GetStockObject,SYSTEM_FIXED_FONT
mov hFnt, eax
invoke SendMessage,hCtl,WM_SETFONT,hFnt,TRUE
mov eax, hCtl
ret
EditML endp
; ########################################################################
Read_File_In proc lpszDiskFile:DWORD, hEditControl:DWORD
LOCAL hFile :DWORD
LOCAL hMem$ :DWORD
LOCAL ln :DWORD
LOCAL br :DWORD
LOCAL txtBuffer[64]:BYTE
invoke CreateFile,lpszDiskFile,GENERIC_READ,FILE_SHARE_READ,
NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL
mov hFile, eax
invoke GetFileSize,hFile,NULL
mov ln, eax
.if ln > 32767
invoke CloseHandle,hFile
szText tooBig,"Sorry, file is too large for QIKPAD"
invoke MessageBox,hWnd,ADDR tooBig,ADDR szDisplayName,MB_OK
xor eax, eax
ret
.endif
invoke SysAllocStringByteLen,0,ln
mov hMem$, eax
invoke ReadFile,hFile,hMem$,ln,ADDR br,NULL
invoke SetWindowText,hEditControl,hMem$
invoke SysFreeString,hMem$
invoke CloseHandle,hFile
invoke lnstr,ADDR szOpenedAt
inc eax
invoke MemCopy,ADDR szOpenedAt,ADDR txtBuffer,eax
invoke dwtoa,ln,ADDR sizeBuffer
invoke lstrcat,ADDR txtBuffer,ADDR sizeBuffer
invoke lstrcat,ADDR txtBuffer,ADDR bytes
invoke SendMessage,hStatus,SB_SETTEXT,2,ADDR txtBuffer
ret
Read_File_In endp
; ########################################################################
Confirmation proc hMain:DWORD
szText ConfirmMsg,"File not saved, save it now ?"
invoke MessageBox,hMain,ADDR ConfirmMsg,ADDR szDisplayName,
MB_YESNOCANCEL or MB_ICONQUESTION
ret
Confirmation endp
; ########################################################################
Write_2_Disk proc lpszFile_Name:DWORD
LOCAL ln :DWORD
LOCAL hMem$ :DWORD
LOCAL hFile :DWORD
LOCAL bw :DWORD
LOCAL txtBuffer[64]
; -----------------------------------------
; truncate file to zero length if it exists
; -----------------------------------------
invoke CreateFile,lpszFile_Name, ; pointer to name of the file
GENERIC_WRITE, ; access (read-write) mode
NULL, ; share mode
NULL, ; pointer to security attributes
CREATE_ALWAYS, ; how to create
FILE_ATTRIBUTE_NORMAL, ; file attributes
NULL
mov hFile,eax
invoke GetWindowTextLength,hEdit
mov ln, eax
inc ln
invoke SysAllocStringByteLen,0,ln
mov hMem$, eax
invoke GetWindowText,hEdit,hMem$,ln
invoke WriteFile,hFile,hMem$,ln,ADDR bw,NULL
invoke SysFreeString,hMem$
invoke CloseHandle,hFile
invoke SendMessage,hEdit,EM_SETMODIFY,FALSE,0
invoke lnstr,ADDR szSavedAt
inc eax
invoke MemCopy,ADDR szSavedAt,ADDR txtBuffer,eax
invoke dwtoa,ln,ADDR sizeBuffer
invoke lstrcat,ADDR txtBuffer,ADDR sizeBuffer
invoke lstrcat,ADDR txtBuffer,ADDR bytes
invoke SendMessage,hStatus,SB_SETTEXT,2,ADDR txtBuffer
ret
Write_2_Disk endp
; ########################################################################
SaveFileAs proc
jmp @F
szTitleS db "Save file as",0
szFilterS db "All files",0,"*.*",0,
"Text files",0,"*.TEXT",0,0
@@:
invoke FillBuffer,ADDR szFileName,length szFileName,0
invoke SaveFileName,hWnd,ADDR szTitleS,ADDR szFilterS
cmp szFileName[0],0 ;<< zero if cancel pressed in dlgbox
je @F
invoke Write_2_Disk,ADDR szFileName
invoke SetWindowText,hWnd,ADDR szFileName
@@:
ret
SaveFileAs endp
; #########################################################################
SaveFile proc
LOCAL buffer[128]:BYTE
; ---------------------------
; test if title is "Untitled"
; ---------------------------
invoke GetWindowText,hWnd,ADDR buffer,128
invoke lstrcmp,ADDR buffer,ADDR szUntitled
.if eax == 0
invoke SaveFileAs
ret
.endif
invoke Write_2_Disk,ADDR buffer
ret
SaveFile endp
; #########################################################################
WordWrap proc
LOCAL mFlag:DWORD
LOCAL ln :DWORD
LOCAL hMem$:DWORD
invoke SendMessage,hEdit,EM_GETMODIFY,0,0
mov mFlag, eax
invoke GetWindowTextLength,hEdit
mov ln, eax
inc ln
invoke SysAllocStringByteLen,0,ln
mov hMem$, eax
invoke GetWindowText,hEdit,hMem$,ln
invoke DestroyWindow,hEdit
.if WrapFlag == 0
mov WrapFlag, 1
szText WrapON," Wrap ON"
invoke SendMessage,hStatus,SB_SETTEXT,1,ADDR WrapON
.elseif WrapFlag == 1
mov WrapFlag, 0
szText WrapOFF," Wrap OFF"
invoke SendMessage,hStatus,SB_SETTEXT,1,ADDR WrapOFF
.endif
invoke EditML,NULL,0,30,300,200,hWnd,700,WrapFlag
mov hEdit, eax
invoke SetWindowLong,hEdit,GWL_WNDPROC,EditProc
mov lpEditProc, eax
invoke SendMessage,hWnd,WM_SIZE,0,0
invoke SetWindowText,hEdit,hMem$
invoke SysFreeString,hMem$
invoke SendMessage,hEdit,EM_SETMODIFY,mFlag,0
invoke SetFocus,hEdit
ret
WordWrap endp
; #########################################################################
EditProc proc hCtl :DWORD,
uMsg :DWORD,
wParam :DWORD,
lParam :DWORD
.if uMsg == WM_KEYUP
.if wParam == VK_F1
invoke About
.elseif wParam == VK_F9
invoke WordWrap
.elseif wParam == VK_ESCAPE
invoke SendMessage,hWnd,WM_SYSCOMMAND,SC_CLOSE,NULL
return 0
.endif
.endif
invoke CallWindowProc,lpEditProc,hCtl,uMsg,wParam,lParam
ret
EditProc endp
; #########################################################################
About proc
szText AboutMsg,"QikPad Text Editor",13,10,\
"Copyright
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -