📄 resed.asm
字号:
.386
.model flat,stdcall
option casemap:none
include ResEd.inc
include Misc.asm
include About.asm
include Opt\MenuOption.asm
include Opt\TabOptions.asm
.code
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke LoadLibrary,offset szRichEdit
mov hRichEd,eax
invoke ResEdInstall,hInstance
invoke GridInstall,hInstance
invoke GetCommandLine
mov CommandLine,eax
;Get command line filename
invoke PathGetArgs,CommandLine
mov CommandLine,eax
@@:
mov dl,[eax]
.if dl==VK_SPACE
inc eax
jmp @b
.elseif dl=='"'
invoke PathUnquoteSpaces,eax
.endif
mov CommandLine,eax
invoke InitCommonControls
;prepare common control structure
mov icex.dwSize,sizeof INITCOMMONCONTROLSEX
mov icex.dwICC,ICC_DATE_CLASSES or ICC_USEREX_CLASSES or ICC_INTERNET_CLASSES or ICC_ANIMATE_CLASS or ICC_HOTKEY_CLASS or ICC_PAGESCROLLER_CLASS or ICC_COOL_CLASSES
invoke InitCommonControlsEx,addr icex
invoke RegCreateKeyEx,HKEY_CURRENT_USER,addr szResEd,0,addr szREG_SZ,0,KEY_WRITE or KEY_READ,0,addr hReg,addr lpdwDisp
.if lpdwDisp==REG_OPENED_EXISTING_KEY
mov lpcbData,sizeof wpos
invoke RegQueryValueEx,hReg,addr szWinPos,0,addr lpType,addr wpos,addr lpcbData
.if wpos.wtpro<5
mov wpos.wtpro,150
.endif
.if wpos.htpro<5
mov wpos.htpro,200
.endif
mov lpcbData,sizeof nmeexp
invoke RegQueryValueEx,hReg,addr szNmeExp,0,addr lpType,addr nmeexp,addr lpcbData
mov lpcbData,sizeof grdsize
invoke RegQueryValueEx,hReg,addr szGrid,0,addr lpType,addr grdsize,addr lpcbData
.endif
invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT
invoke RegSetValueEx,hReg,addr szWinPos,0,REG_BINARY,addr wpos,sizeof wpos
invoke RegCloseKey,hReg
invoke ResEdUninstall
.if hRichEd
invoke FreeLibrary,hRichEd
.endif
invoke ExitProcess,eax
SetWinCaption proc lpFileName:DWORD
LOCAL buffer[sizeof szAppName+3+MAX_PATH]:BYTE
LOCAL buffer1[4]:BYTE
;Add filename to windows caption
invoke lstrcpy,addr buffer,offset szAppName
.if lpFileName
mov eax,' - '
mov dword ptr buffer1,eax
invoke lstrcat,addr buffer,addr buffer1
invoke lstrcat,addr buffer,lpFileName
.endif
invoke SetWindowText,hWnd,addr buffer
ret
SetWinCaption endp
LoadProjectFile proc lpFileName:DWORD
LOCAL hFile:DWORD
LOCAL hMem:DWORD
LOCAL dwRead:DWORD
;Open the file
invoke CreateFile,lpFileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0
.if eax!=INVALID_HANDLE_VALUE
mov hFile,eax
invoke GetFileSize,hFile,NULL
push eax
inc eax
invoke GlobalAlloc,GMEM_FIXED or GMEM_ZEROINIT,eax
mov hMem,eax
invoke GlobalLock,hMem
pop edx
invoke ReadFile,hFile,hMem,edx,addr dwRead,NULL
invoke CloseHandle,hFile
;Copy buffer to ProjectFileName
invoke lstrcpy,offset ProjectFileName,lpFileName
invoke SendMessage,hProject,PRO_OPEN,offset ProjectFileName,hMem
invoke SetWinCaption,offset ProjectFileName
.else
invoke MessageBox,hWnd,offset szOpenFileFail,offset szAppName,MB_OK or MB_ICONERROR
mov eax,FALSE
.endif
ret
LoadProjectFile endp
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
mov wc.cbSize,SIZEOF WNDCLASSEX
mov wc.style,CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc,OFFSET WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,DLGWINDOWEXTRA
push hInst
pop wc.hInstance
mov wc.hbrBackground,COLOR_BTNFACE+1
mov wc.lpszMenuName,10000
mov wc.lpszClassName,OFFSET szDlgClass
invoke LoadIcon,hInst,IDI_ICON
mov hIcon,eax
mov wc.hIcon,eax
mov wc.hIconSm,eax
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
invoke RegisterClassEx,addr wc
invoke CreateDialogParam,hInstance,IDD_DIALOG,NULL,addr WndProc,NULL
.if wpos.fMax
mov eax,SW_MAXIMIZE
.else
mov eax,SW_SHOWNORMAL
.endif
invoke ShowWindow,hWnd,eax
invoke UpdateWindow,hWnd
;Get command line filename
mov eax,CommandLine
.if byte ptr [eax]
invoke LoadProjectFile,eax
.endif
.while TRUE
invoke GetMessage,addr msg,NULL,0,0
.BREAK .if !eax
invoke TranslateAccelerator,hWnd,hAccel,addr msg
.if !eax
invoke TranslateMessage,addr msg
invoke DispatchMessage,addr msg
.endif
.endw
mov eax,msg.wParam
ret
WinMain endp
DoToolBar proc hToolBar:HWND
LOCAL tbab:TBADDBITMAP
;Set toolbar struct size
invoke SendMessage,hToolBar,TB_BUTTONSTRUCTSIZE,sizeof TBBUTTON,0
;Set toolbar bitmap
push hInstance
pop tbab.hInst
mov tbab.nID,IDB_TOOLBAR
invoke SendMessage,hToolBar,TB_ADDBITMAP,9,addr tbab
;Set toolbar buttons
invoke SendMessage,hToolBar,TB_ADDBUTTONS,ntbrbtns,addr tbrbtns
ret
DoToolBar endp
OpenProject proc
LOCAL ofn:OPENFILENAME
LOCAL buffer[MAX_PATH]:BYTE
;Zero out the ofn struct
invoke RtlZeroMemory,addr ofn,sizeof ofn
;Setup the ofn struct
mov ofn.lStructSize,sizeof ofn
push hWnd
pop ofn.hwndOwner
push hInstance
pop ofn.hInstance
mov ofn.lpstrFilter,offset szRCFilterString
mov buffer[0],0
lea eax,buffer
mov ofn.lpstrFile,eax
mov ofn.nMaxFile,sizeof buffer
mov ofn.lpstrDefExt,NULL
mov ofn.Flags,OFN_FILEMUSTEXIST or OFN_HIDEREADONLY or OFN_PATHMUSTEXIST
;Show the Open dialog
invoke GetOpenFileName,addr ofn
.if eax
invoke LoadProjectFile,addr buffer
.endif
ret
OpenProject endp
SaveProject proc lpFileName:DWORD
LOCAL hMem:DWORD
LOCAL hFile:DWORD
LOCAL nSize:DWORD
invoke GlobalAlloc,GMEM_FIXED or GMEM_ZEROINIT,256*1024
mov hMem,eax
invoke SendMessage,hProject,PRO_EXPORT,0,hMem
invoke lstrlen,hMem
mov nSize,eax
invoke CreateFile,lpFileName,GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL
.if eax!=INVALID_HANDLE_VALUE
mov hFile,eax
invoke WriteFile,hFile,hMem,nSize,addr nSize,NULL
invoke CloseHandle,hFile
invoke SendMessage,hProject,PRO_SETMODIFY,FALSE,0
xor eax,eax
.endif
push eax
invoke GlobalFree,hMem
pop eax
ret
SaveProject endp
SaveProjectFileAs proc lpFileName:DWORD
LOCAL ofn:OPENFILENAME
LOCAL buffer[MAX_PATH]:BYTE
invoke GetWindowLong,hProject,0
.if eax
;Zero out the ofn struct
invoke RtlZeroMemory,addr ofn,sizeof ofn
;Setup the ofn struct
mov ofn.lStructSize,sizeof ofn
push hWnd
pop ofn.hwndOwner
push hInstance
pop ofn.hInstance
mov ofn.lpstrFilter,offset szRCFilterString
invoke lstrcpy,addr buffer,lpFileName
lea eax,buffer
mov ofn.lpstrFile,eax
mov ofn.nMaxFile,sizeof buffer
mov ofn.Flags,OFN_FILEMUSTEXIST or OFN_HIDEREADONLY or OFN_PATHMUSTEXIST or OFN_OVERWRITEPROMPT
mov ofn.lpstrDefExt,offset szDefRCExt
;Show save as dialog
invoke GetSaveFileName,addr ofn
.if eax
invoke SaveProject,addr buffer
.if !eax
invoke lstrcpy,offset ProjectFileName,addr buffer
invoke SetWinCaption,offset ProjectFileName
invoke lstrlen,offset ProjectFileName
lea edx,buffer
.while byte ptr [edx+eax]!='\' && eax
dec eax
.endw
mov byte ptr [edx+eax],0
lea edx,[edx+eax+1]
invoke SendMessage,hProject,PRO_SETNAME,edx,addr buffer
.endif
.endif
.endif
ret
SaveProjectFileAs endp
SaveProjectFile proc lpFileName:DWORD
invoke GetWindowLong,hProject,0
.if eax
invoke lstrcmp,offset ProjectFileName,offset szNewFile
.if !eax
invoke SaveProjectFileAs,lpFileName
.else
invoke SaveProject,lpFileName
.endif
.endif
ret
SaveProjectFile endp
WantToSaveProject proc lpFileName:DWORD
LOCAL buffer[512]:BYTE
LOCAL buffer1[2]:BYTE
invoke SetFocus,hWnd
invoke SendMessage,hProject,PRO_GETMODIFY,0,0
.if eax
invoke lstrcpy,addr buffer,offset szWannaSave
invoke lstrcat,addr buffer,lpFileName
mov ax,'?'
mov word ptr buffer1,ax
invoke lstrcat,addr buffer,addr buffer1
invoke MessageBox,hWnd,addr buffer,offset szAppName,MB_YESNOCANCEL or MB_ICONQUESTION
.if eax==IDYES
invoke SaveProjectFile,lpFileName
.elseif eax==IDNO
mov eax,FALSE
.else
mov eax,TRUE
.endif
.endif
ret
WantToSaveProject endp
Do_ImageList proc phInst:HINSTANCE,pidBmp:DWORD,nSize:DWORD,nImg:DWORD,fMap:DWORD,fBack:DWORD,fFore:DWORD
LOCAL lhIml:DWORD
LOCAL cm[2]:COLORMAP
invoke ImageList_Create,nSize,nSize,ILC_COLOR8 or ILC_MASK,nImg,0
mov lhIml,eax
.if fMap
mov cm.From,0FFFFFFh
mov eax,fBack
mov cm.To,eax
mov cm[sizeof COLORMAP].From,0h
mov eax,fFore
mov cm[sizeof COLORMAP].To,eax
invoke CreateMappedBitmap,phInst,pidBmp,NULL,addr cm,fMap
.else
invoke LoadBitmap,phInst,pidBmp
.endif
invoke ImageList_AddMasked,lhIml,eax,fBack
mov eax,lhIml
ret
Do_ImageList endp
ToolBarEnable proc uses ebx,hTbr:HWND
mov ebx,hTbr
invoke SendMessage,hResEd,DEM_CANUNDO,0,0
invoke SendMessage,ebx,TB_ENABLEBUTTON,IDM_EDIT_UNDO,eax
invoke SendMessage,hResEd,DEM_ISSELECTION,0,0
push eax
push eax
invoke SendMessage,ebx,TB_ENABLEBUTTON,IDM_EDIT_DELETE,eax
pop eax
invoke SendMessage,ebx,TB_ENABLEBUTTON,IDM_EDIT_CUT,eax
pop eax
invoke SendMessage,ebx,TB_ENABLEBUTTON,IDM_EDIT_COPY,eax
invoke SendMessage,hResEd,DEM_CANPASTE,0,0
invoke SendMessage,ebx,TB_ENABLEBUTTON,IDM_EDIT_PASTE,eax
mov eax,wpos.fView
and eax,1
invoke SendMessage,ebx,TB_CHECKBUTTON,IDM_VIEW_OUTPUT,eax
ret
ToolBarEnable endp
WndProc proc uses ebx,hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
LOCAL hFont:DWORD
LOCAL pt:POINT
LOCAL rect:RECT
LOCAL hMem:DWORD
LOCAL nInx:DWORD
LOCAL buffer[MAX_PATH]:BYTE
LOCAL buffer1[MAX_PATH]:BYTE
LOCAL mnu:MENU
mov eax,uMsg
.if eax==WM_INITDIALOG
push hWin
pop hWnd
invoke GetModuleFileName,0,addr buffer,sizeof buffer
invoke lstrlen,addr buffer
.while byte ptr buffer[eax]!='\' && eax
dec eax
.endw
mov buffer[eax],0
invoke SetCurrentDirectory,addr buffer
invoke GetDlgItem,hWin,IDC_SBR1
invoke SendMessage,eax,WM_GETFONT,0,0
mov hFont,eax
invoke MoveWindow,hWin,wpos.x,wpos.y,wpos.wt,wpos.ht,TRUE
invoke LoadAccelerators,hInstance,IDR_ACCEL
mov hAccel,eax
invoke GetMenu,hWin
mov hMnu,eax
invoke SetToolMenu
invoke SetHelpMenu
invoke LoadMenu,hInstance,IDR_CONTEXT
mov hContextMenu,eax
invoke GetSubMenu,eax,0
mov hContextMenuPopup,eax
invoke GetDlgItem,hWin,IDC_TBR1
invoke DoToolBar,eax
invoke GetDlgItem,hWin,IDC_EDT1
mov hOut,eax
mov edx,52300000h
.if grdsize.show
or edx,DES_GRID
.endif
.if grdsize.snap
or edx,DES_SNAPTOGRID
.endif
.if grdsize.tips
or edx,DES_TOOLTIP
.endif
invoke CreateWindowEx,200h,addr szDlgEditClass,0,edx,0,0,0,0,hWin,IDC_DLGEDIT,hInstance,0
mov hResEd,eax
invoke SendMessage,eax,WM_SETFONT,hFont,0
invoke CreateWindowEx,200h,addr szProjectClass,0,56000000h,0,0,0,0,hWin,IDC_PROJECT,hInstance,0
mov hProject,eax
invoke SendMessage,eax,WM_SETFONT,hFont,0
mov edx,nmeexp.nOutput
shl edx,16
add edx,nmeexp.nType
invoke SendMessage,hProject,PRO_SETEXPORT,edx,addr nmeexp.szFileName
invoke CreateWindowEx,0h,addr szPropertyClass,0,56000000h,0,0,0,0,hWin,IDC_PROPERTY,hInstance,0
invoke SendMessage,eax,WM_SETFONT,hFont,0
invoke CreateWindowEx,0h,addr szToolBoxClass,0,56000000h,0,0,0,0,hWin,IDC_TOOLBOX,hInstance,0
invoke SendMessage,eax,WM_SETFONT,hFont,0
invoke GetDlgItem,hWin,IDC_SBR1
invoke SendMessage,hResEd,DEM_SETPOSSTATUS,eax,0
mov eax,grdsize.y
shl eax,16
add eax,grdsize.x
mov edx,grdsize.line
shl edx,24
add edx,grdsize.color
invoke SendMessage,hResEd,DEM_SETGRIDSIZE,eax,edx
invoke ImageList_Create,16,16,ILC_COLOR8 or ILC_MASK,2,0
mov hIml,eax
invoke LoadBitmap,hInstance,IDB_ARROW
push eax
invoke ImageList_AddMasked,hIml,eax,0C0C0C0h
pop eax
invoke DeleteObject,eax
invoke LoadCursor,hInstance,IDC_HSPLIT
mov hHSplit,eax
invoke LoadCursor,hInstance,IDC_VSPLIT
mov hVSplit,eax
invoke GetDlgItem,hWin,IDC_TBR1
invoke ToolBarEnable,eax
;Add custom controls
mov nInx,1
mov ebx,offset hCustDll
.while nInx<=32
invoke MakeKey,addr szCust,nInx,addr buffer1
mov lpcbData,MAX_PATH
mov buffer,0
invoke RegQueryValueEx,hReg,addr buffer1,0,addr lpType,addr buffer,addr lpcbData
.if buffer
invoke SendMessage,hResEd,DEM_ADDCONTROL,0,addr buffer
.if eax
mov [ebx],eax
add ebx,4
.endif
.endif
inc nInx
.endw
.elseif eax==WM_NCACTIVATE
.if hResEd
invoke GetWindowLong,hResEd,DEWM_DIALOG
.if eax
invoke SendMessage,eax,WM_NCACTIVATE,wParam,0
.endif
.endif
jmp ExDef
.elseif eax==WM_NCMOUSEMOVE
invoke GetDlgItem,hWin,IDC_SBR1
invoke SendMessage,eax,SB_SETTEXT,0,offset szNULL
.elseif eax==WM_MOUSEMOVE
invoke GetClientRect,hWin,addr rect
invoke GetDlgItem,hWin,IDC_SBR1
invoke SendMessage,eax,SB_SETTEXT,0,offset szNULL
mov eax,lParam
movzx eax,ax
cwde
mov pt.x,eax
mov eax,lParam
shr eax,16
cwde
mov pt.y,eax
invoke GetCapture
.if eax==hWin
.if fSize==1
mov eax,rect.right
mov edx,eax
sub edx,80+53
sub eax,pt.x
.if sdword ptr eax<80
mov eax,80
.elseif sdword ptr eax>edx
mov eax,edx
.endif
.if eax!=wpos.wtpro
mov wpos.wtpro,eax
mov eax,rect.bottom
shl eax,16
add eax,rect.right
invoke SendMessage,hWin,WM_SIZE,0,eax
.endif
.elseif fSize==2
mov eax,rect.bottom
mov edx,eax
sub edx,80+25
mov eax,pt.y
sub eax,25
.if sdword ptr eax<80-25
mov eax,80-25
.elseif sdword ptr eax>edx
mov eax,edx
.endif
.if eax!=wpos.htpro
mov wpos.htpro,eax
mov eax,rect.bottom
shl eax,16
add eax,rect.right
invoke SendMessage,hWin,WM_SIZE,0,eax
.endif
.elseif fSize==3
mov edx,rect.bottom
sub edx,80
mov eax,pt.y
.if sdword ptr eax<80
mov eax,80
.elseif sdword ptr eax>edx
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -