引自:http://blog.yesky.com/Blog/tiantian911/archive/2005/06/19/150163.html
.586 ; create 32 bit code
.model flat, stdcall ; 32 bit memory model
option casemap :none ; case sensitive
; include files
; ~~~~~~~~~~~~~
include /masm32/include/windows.inc
include /masm32/include/masm32.inc
include /masm32/include/gdi32.inc
include /masm32/include/user32.inc
include /masm32/include/kernel32.inc
include /masm32/include/Comctl32.inc
include /masm32/include/comdlg32.inc
include /masm32/include/shell32.inc
include /masm32/include/oleaut32.inc
include /masm32/macros/macros.asm
; libraries
; ~~~~~~~~~
includelib /masm32/lib/masm32.lib
includelib /masm32/lib/gdi32.lib
includelib /masm32/lib/user32.lib
includelib /masm32/lib/kernel32.lib
includelib /masm32/lib/Comctl32.lib
includelib /masm32/lib/comdlg32.lib
includelib /masm32/lib/shell32.lib
includelib /masm32/lib/oleaut32.lib
includelib /masm32/lib/wsock32.lib
WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
TopXY PROTO :DWORD,:DWORD
RegisterWinClass PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
MsgLoop PROTO
Main PROTO
Select_All PROTO :DWORD
ReEntryPoint PROTO
AutoScale MACRO swidth, sheight
invoke GetPercent,sWid,swidth
mov Wwd, eax
invoke GetPercent,sHgt,sheight
mov Wht, eax
invoke TopXY,Wwd,sWid
mov Wtx, eax
invoke TopXY,Wht,sHgt
mov Wty, eax
ENDM
DisplayWindow MACRO handl, ShowStyle
invoke ShowWindow,handl, ShowStyle
invoke UpdateWindow,handl
ENDM
.data?
hInstance dd ?
CommandLine dd ?
hIcon dd ?
hCursor dd ?
sWid dd ?
sHgt dd ?
hWnd dd ?
hEdit dd ?
hMenu dd ?
hfMnu dd ?
heMnu dd ?
haMnu dd ?
dwTickCount dd ?
dwTSC dd ?,?
szBuffer db 256 dup (?)
.code
; ?
ReEntryPoint proc ;; <<<< This is the entry point
; ------------------
; set global values
; ------------------
mov hInstance, FUNC(GetModuleHandle, NULL)
mov CommandLine, FUNC(GetCommandLine)
mov hIcon, FUNC(LoadIcon,NULL,IDI_APPLICATION)
mov hCursor, FUNC(LoadCursor,NULL,IDC_ARROW)
mov sWid, FUNC(GetSystemMetrics,SM_CXSCREEN)
mov sHgt, FUNC(GetSystemMetrics,SM_CYSCREEN)
call Main
invoke ExitProcess,eax
ReEntryPoint endp
; ?
Main proc
LOCAL Wwd:DWORD,Wht:DWORD,Wtx:DWORD,Wty:DWORD
STRING szClassName,"riched_Class"
invoke RegisterWinClass,ADDR WndProc,ADDR szClassName,
hIcon,hCursor,NULL
AutoScale 75, 70
invoke CreateWindowEx,WS_EX_LEFT or WS_EX_ACCEPTFILES,
ADDR szClassName,
chr$("Tiantian-Untitled"),
WS_OVERLAPPEDWINDOW,
Wtx,Wty,Wwd,Wht,
NULL,NULL,
hInstance,NULL
mov hWnd,eax
mov hMenu, FUNC(CreateMenu) ; main menu
mov hfMnu, FUNC(CreateMenu) ; file menu
mov heMnu, FUNC(CreateMenu) ; edit menu
mov haMnu, FUNC(CreateMenu) ; about menu
; file menu
invoke AppendMenu,hMenu,MF_POPUP,hfMnu,chr$("&File")
invoke AppendMenu,hfMnu,MF_STRING,1000,chr$("&New",9,"Ctrl+N")
invoke AppendMenu,hfMnu,MF_SEPARATOR,0,0
invoke AppendMenu,hfMnu,MF_STRING,1001,chr$("&Open",9,"Ctrl+O")
invoke AppendMenu,hfMnu,MF_SEPARATOR,0,0
invoke AppendMenu,hfMnu,MF_STRING,1002,chr$("&Save",9,"Ctrl+S")
invoke AppendMenu,hfMnu,MF_STRING,1003,chr$("Save &As")
invoke AppendMenu,hfMnu,MF_SEPARATOR,0,0
invoke AppendMenu,hfMnu,MF_STRING,1010,chr$("&Exit",9,"Alt+F4")
; edit menu
invoke AppendMenu,hMenu,MF_POPUP,heMnu,chr$("&Edit")
invoke AppendMenu,heMnu,MF_STRING,1100,chr$("&Undo",9,"Ctrl+Z")
invoke AppendMenu,heMnu,MF_SEPARATOR,0,0
invoke AppendMenu,heMnu,MF_STRING,1101,chr$("&Cut",9,"Ctrl+X")
invoke AppendMenu,heMnu,MF_STRING,1102,chr$("C&opy",9,"Ctrl+C")
invoke AppendMenu,heMnu,MF_STRING,1103,chr$("&Paste",9,"Ctrl+V")
invoke AppendMenu,heMnu,MF_SEPARATOR,0,0
invoke AppendMenu,heMnu,MF_STRING,1104,chr$("&Clear",9,"Del")
invoke AppendMenu,heMnu,MF_SEPARATOR,0,0
invoke AppendMenu,heMnu,MF_STRING,1105,chr$("&Copy All",9,"Ctrl+A")
; help menu
invoke AppendMenu,hMenu,MF_POPUP,haMnu,chr$("&Help")
invoke AppendMenu,haMnu,MF_STRING,1106,chr$("&About",9)
invoke SetMenu,hWnd,hMenu
DisplayWindow hWnd,SW_SHOWNORMAL
call MsgLoop
ret
Main endp
; ?
RegisterWinClass proc lpWndProc:DWORD, lpClassName:DWORD,
Icon:DWORD, Cursor:DWORD, bColor:DWORD
LOCAL wc:WNDCLASSEX
mov wc.cbSize, sizeof WNDCLASSEX
mov wc.style, CS_BYTEALIGNCLIENT or /
CS_BYTEALIGNWINDOW
m2m wc.lpfnWndProc, lpWndProc
mov wc.cbClsExtra, NULL
mov wc.cbWndExtra, NULL
m2m wc.hInstance, hInstance
m2m wc.hbrBackground, bColor
mov wc.lpszMenuName, NULL
m2m wc.lpszClassName, lpClassName
m2m wc.hIcon, hIcon
m2m wc.hCursor, Cursor
m2m wc.hIconSm, Icon
invoke RegisterClassEx, ADDR wc
ret
RegisterWinClass endp
; ?
MsgLoop proc
LOCAL rv :DWORD
LOCAL msg :MSG
StartLoop:
invoke GetMessage,ADDR msg,NULL,0,0
cmp eax, 0
je ExitLoop
Switch msg.message
; ------------------------------------
; menu hot key processing CTRL+Hotkey
; ------------------------------------
Case WM_KEYDOWN
mov rv, FUNC(GetAsyncKeyState,VK_CONTROL)
cmp WORD PTR rv[2], 1111111111111111b
jne @F
Switch msg.wParam
Case VK_A
invoke Select_All,hEdit
invoke SendMessage,hEdit,WM_COPY,0,0
jmp StartLoop
Case VK_C
invoke SendMessage,hEdit,WM_COPY,0,0
jmp StartLoop
Case VK_N
invoke SendMessage,hWnd,WM_COMMAND,1000,0
jmp StartLoop
Case VK_O
invoke SendMessage,hWnd,WM_COMMAND,1001,0
jmp StartLoop
Case VK_S
invoke SendMessage,hWnd,WM_COMMAND,1002,0
jmp StartLoop
Case VK_V
invoke SendMessage,hEdit,EM_PASTESPECIAL,CF_TEXT,0
jmp StartLoop
Case VK_X
invoke SendMessage,hEdit,WM_CUT,0,0
jmp StartLoop
Case VK_Z
invoke SendMessage,hEdit,EM_UNDO,0,0
jmp StartLoop
Case VK_B
jmp StartLoop
Endsw
@@:
Endsw
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
jmp StartLoop
ExitLoop:
mov eax, msg.wParam
ret
MsgLoop endp
; ?
WndProc proc hWin :DWORD,
uMsg :DWORD,
wParam :DWORD,
lParam :DWORD
LOCAL fname :DWORD
LOCAL patn :DWORD
LOCAL Rct :RECT
LOCAL buffer[MAX_PATH]:BYTE
Switch uMsg
Case WM_COMMAND
;======== menu commands ========
Switch wParam
Case 1000
invoke SetWindowText,hEdit,0
fn SetWindowText,hWin,"Untitled"
Case 1001
sas patn, "All files",0,"*.*",0
mov fname, OpenFileDlg(hWin,hInstance,"Open File",patn)
cmp BYTE PTR [eax], 0
jne @F
return 0
@@:
invoke Read_File_In,hEdit,fname
invoke SetWindowText,hWin,fname
Case 1002
invoke GetWindowText,hWin,ADDR buffer,MAX_PATH
fn szCmp,ADDR buffer,"Untitled"
test eax, eax
jnz Save_As
invoke Write_To_Disk,hEdit,ADDR buffer
Case 1003
Save_As:
sas patn, "All files",0,"*.*",0
mov fname, SaveFileDlg(hWin,hInstance,"Save File As ...",patn)
cmp BYTE PTR [eax], 0
jne @F
return 0
@@:
invoke Write_To_Disk,hEdit,fname
invoke SetWindowText,hWin,fname
Case 1010
invoke SendMessage,hWin,WM_SYSCOMMAND,SC_CLOSE,NULL
;====== edit menu commands ======
Case 1100
invoke SendMessage,hEdit,EM_UNDO,0,0
Case 1101
invoke SendMessage,hEdit,WM_CUT,0,0
Case 1102
invoke SendMessage,hEdit,WM_COPY,0,0
Case 1103
invoke SendMessage,hEdit,EM_PASTESPECIAL,CF_TEXT,0
Case 1104
invoke SendMessage,hEdit,WM_CLEAR,0,0
Case 1105
invoke Select_All,hEdit
invoke SendMessage,hEdit,WM_COPY,0,0
Case 1106
szText RichEd,"Tiantian's Editor"
szText AboutMsg,"Tiantian's Editor",13,10,/
"Copyright ?Tiantian 2005"
invoke ShellAbout,hWin,ADDR RichEd,ADDR AboutMsg,hIcon
Endsw
;====== end menu commands ======
Case WM_SETFOCUS
invoke SetFocus,hEdit
Case WM_DROPFILES
invoke Read_File_In,hEdit,DropFileName(wParam)
Case WM_CREATE
fn LoadLibrary,"RICHED32.DLL"
mov hEdit, FUNC(RichEd1,0,0,100,100,hWin,hInstance,555,0)
invoke SendMessage,hEdit,WM_SETFONT,FUNC(GetStockObject,ANSI_FIXED_FONT),0
invoke SendMessage,hEdit,EM_EXLIMITTEXT,0,500000000
invoke SendMessage,hEdit,EM_SETOPTIONS,ECOOP_XOR,ECO_SELECTIONBAR
Case WM_SIZE
invoke GetClientRect,hWin,ADDR Rct
invoke MoveWindow,hEdit,0,0,Rct.right,Rct.bottom,TRUE
Case WM_CLOSE
Case WM_DESTROY
invoke PostQuitMessage,NULL
return 0
Endsw
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
; ?
Select_All Proc Edit:DWORD
LOCAL tl :DWORD
LOCAL Cr :CHARRANGE
mov Cr.cpMin,0
invoke GetWindowTextLength,Edit
inc eax
mov Cr.cpMax, eax
invoke SendMessage,Edit,EM_EXSETSEL,0,ADDR Cr
ret
Select_All endp
; ?
end
上面是一个MASM32版的记事本,具备基本的功能,而且很小很快,(至少比Pspice带的TextEditor要强好多),ASM真是个好东东,要是能掌握的再深入些就好了。
#########################################################################################
purpleendurer注:
非常高兴遇到喜欢ASM的朋友
我用masm32作的reader--一个用MASM32写的免费的文本阅读/编辑器,其特点是你可以设置当前行的字体,颜色,风格。方便阅读。
下载地址: http://www.hcny.gov.cn/netres/download/reader.rar