Code:
; #########################################################################
.486 ; create 32 bit code
.model flat, stdcall ; 32 bit memory model
option casemap :none ; case sensitive
include Notepad.inc ; local includes for this file
include dbmacros.asm
include errormac.asm
.code
start:
; ------------------
; set global values
; ------------------
invoke GetModuleHandle, NULL
mov hInstance, eax
invoke GetCommandLine
mov CommandLine, eax
invoke LoadIcon,hInstance,500 ; icon ID
mov hIcon, eax
invoke LoadCursor,NULL,IDC_ARROW
mov hCursor, eax
invoke GetSystemMetrics,SM_CXSCREEN
mov sWid, eax
invoke GetSystemMetrics,SM_CYSCREEN
mov sHgt, eax
call Main
invoke ExitProcess,eax
Main proc
LOCAL Wwd:DWORD,Wht:DWORD,Wtx:DWORD,Wty:DWORD
STRING szClassName,"MsgBox_Class"
STRING szLabelName,"Static"
STRING szLabelTitle,"Message Box Text:"
STRING szTextName,"EDIT"
STRING szTextTitle,"Ben's Banana Cheese"
STRING szButtonName,"Button"
STRING szButtonTitle,"Show It"
; --------------------------------------------
; register class name for CreateWindowEx call
; --------------------------------------------
invoke RegisterWinClass,ADDR WndProc,ADDR szClassName,
hIcon,hCursor,COLOR_BTNFACE+1
; -------------------------------------------------
; macro to autoscale window co-ordinates to screen
; percentages and centre window at those sizes.
; -------------------------------------------------
AutoScale 75, 70
invoke CreateWindowEx,WS_EX_ACCEPTFILES,
ADDR szClassName,
ADDR szDisplayName,
WS_SYSMENU,
Wtx,Wty,550,120,
NULL,NULL,
hInstance,NULL
mov hWnd,eax
invoke CreateWindowEx,WS_EX_STATICEDGE or WS_EX_TRANSPARENT,
ADDR szTextName,
ADDR szTextTitle,
WS_CHILD,
10,30,500,20,
hWnd,NULL,
hInstance,NULL
mov hWndText,eax
invoke CreateWindowEx,WS_EX_TRANSPARENT,
ADDR szLabelName,
ADDR szLabelTitle,
WS_CHILD,
10,10,500,20,
hWnd,NULL,
hInstance,NULL
mov hWndLabel,eax
invoke CreateWindowEx,WS_EX_TRANSPARENT or WS_THICKFRAME,
ADDR szButtonName,
ADDR szButtonTitle,
WS_CHILD,
10,60,100,24,
hWnd,NULL,
hInstance,NULL
mov hWndButton,eax
invoke SetWindowLong,hWndButton,GWL_WNDPROC,WndButtonProc
mov lpWndButtonProc, eax
; ---------------------------
; macros for unchanging code
; ---------------------------
;DisplayMenu hWnd,600
DisplayWindow hWnd,SW_SHOWNORMAL
DisplayWindow hWndText,SW_SHOWNORMAL
DisplayWindow hWndLabel,SW_SHOWNORMAL
DisplayWindow hWndButton,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, Icon
m2m wc.hCursor, Cursor
m2m wc.hIconSm, Icon
invoke RegisterClassEx, ADDR wc
ret
RegisterWinClass endp
MsgLoop proc
; ------------------------------------------
; The following 4 equates are available for
; processing messages directly in the loop.
; m_hWnd - m_Msg - m_wParam - m_lParam
; ------------------------------------------
LOCAL msg:MSG
StartLoop:
invoke GetMessage,ADDR msg,NULL,0,0
cmp eax, 0
je ExitLoop
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 var :DWORD
LOCAL caW :DWORD
LOCAL caH :DWORD
LOCAL Rct :RECT
LOCAL buffer1[128]:BYTE ; these are two spare buffers
LOCAL buffer2[128]:BYTE ; for text manipulation etc..
LOCAL szDropFileName[260]:BYTE
.if uMsg == WM_COMMAND
;======== menu commands ========
.if wParam == 1001
; --------------------------------------
; szFileName is defined in Filedlgs.asm
; --------------------------------------
; mov szFileName[0],0 ; set 1st byte to zero
; invoke GetFileName,hWin,SADD("Open A File"),
; SADD("All files",0,"*.*",0)
; cmp szFileName[0],0 ; zero if cancel pressed in dlgbox
; je @F
; ---------------------------------
; perform your file open code here
; ---------------------------------
@@:
.elseif wParam == 1002
; --------------------------------------
; szFileName is defined in Filedlgs.asm
; --------------------------------------
mov szFileName[0],0 ; set 1st byte to zero
invoke SaveFileName,hWin,SADD("Save File As ..."),
SADD("All files",0,"*.*",0,0)
cmp szFileName[0],0 ; zero if cancel pressed in dlgbox
je @F
; ---------------------------------
; perform your file save code here
; ---------------------------------
invoke MessageBox,hWin,ADDR szFileName,ADDR szDisplayName,MB_OK
@@:
.endif
.if wParam == 1010
invoke MessageBox,hWin,SADD("See you later!"),ADDR szDisplayName,MB_OK
invoke SendMessage,hWin,WM_SYSCOMMAND,SC_CLOSE,NULL
.elseif wParam == 1900
ShellAboutBox hWin,hIcon,\
"About Message Box Displayer#Message Box Displayer",\
"Ben's Message Box Displayer",13,10,"Copyright © numtel 2002"
.endif
;====== end menu commands ======
.elseif uMsg == WM_DROPFILES
invoke DragQueryFile,wParam,0,ADDR szDropFileName,sizeof szDropFileName
; -------------------------------------------------------
; perform the action you want with "szDropFileName" here
; -------------------------------------------------------
invoke MessageBox,hWin,ADDR szDropFileName,SADD("WM_DROPFILES"),MB_OK
.elseif uMsg == WM_CREATE
.elseif uMsg == WM_SYSCOLORCHANGE
.elseif uMsg == WM_SIZE
.elseif uMsg == WM_PAINT
invoke Paint_Proc,hWin
return 0
.elseif uMsg == WM_CLOSE
.elseif uMsg == WM_DESTROY
invoke PostQuitMessage,NULL
return 0
.elseif uMsg == WM_LBUTTONUP
.endif
invoke DefWindowProc,hWin,uMsg,wParam,lParam
ret
WndProc endp
WndButtonProc proc hCtl :DWORD,
uMsg :DWORD,
wParam :DWORD,
lParam :DWORD
LOCAL len :DWORD
LOCAL txt :DWORD
LOCAL err :DWORD
; -----------------------------
; Process control messages here
; -----------------------------
.if uMsg == WM_LBUTTONUP
invoke GetWindowTextLength,hWndText
mov len,eax
add len,1
invoke GetWindowText,hWndText,txt, len
mov err,eax
invoke MessageBox,hWnd,txt,ADDR szDisplayName,MB_OK or MB_ICONASTERISK
.endif
invoke CallWindowProc,lpWndButtonProc,hCtl,uMsg,wParam,lParam
ret
WndButtonProc endp
TopXY proc wDim:DWORD, sDim:DWORD
shr sDim, 2 ; divide screen dimension by 2
shr wDim, 2 ; 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
Paint_Proc proc hWin:DWORD
LOCAL hDC :DWORD
LOCAL btn_hi :DWORD
LOCAL btn_lo :DWORD
LOCAL Rct :RECT
LOCAL Ps :PAINTSTRUCT
invoke BeginPaint,hWin,ADDR Ps
mov hDC, eax
; ----------------------------------------
invoke GetSysColor,COLOR_BTNHIGHLIGHT
mov btn_hi, eax
invoke GetSysColor,COLOR_BTNSHADOW
mov btn_lo, eax
; ----------------------------------------
invoke EndPaint,hWin,ADDR Ps
ret
Paint_Proc endp
end start
that subclassing wizard in MASM32 is the best thing ever, it saved me.