home *** CD-ROM | disk | FTP | other *** search
- TITLE 32-Bit Skeleton Application
-
- OPTION CASEMAP:NONE
-
- .486 ;32-Bit when .486 before .MODEL
- .MODEL FLAT, STDCALL
-
- INCLUDE WINDOWS.INC
-
- PUBLIC _start ;application startup routine
-
- WinMain PROTO STDCALL :HINSTANCE, :HINSTANCE, :LPSTR, :UINT
- InitApplication PROTO STDCALL :HINSTANCE, :UINT
- WndProc PROTO STDCALL :HWND, :UINT, :WPARAM, :LPARAM
- About PROTO STDCALL :HWND, :UINT, :WPARAM, :LPARAM
-
- IDM_EXIT EQU 100 ;menu-identifiers
- IDM_ABOUT EQU 101
-
- ID_STATUS EQU 400
-
-
- .DATA
- hPrev HINSTANCE 0h ;WinMain parameters
- hInst HINSTANCE 0h
- lpszCmd LPSTR 0h
- cmdShow UINT SW_SHOWDEFAULT
- dwExitCode DWORD 0h
- hMainWnd HWND 0h
-
- szClassName SBYTE "Skeleton",0h
- szWindowName SBYTE "Skeleton",0h
- szMenuName SBYTE "Skeleton",0h
- szIcon SBYTE "Skeleton",0h
-
- szStatusText SBYTE "Status Bar ",0h
- hStatusWnd HWND 0h
-
- wNotifyCode WORD 0h ;for WM_COMMAND message
- wID WORD 0h
- hWndCtl HANDLE 0h
-
- uItem UINT 0h ;for WM_MENUSELECT message
- fuFlags UINT 0h
- hMenu HMENU 0h
- nStringID DWORD 0h
-
- hdc HDC 0h ;for WM_PAINT message
- ps PAINTSTRUCT < >
-
- cxScreen DWORD 0h ;for WM_CREATE
- cyScreen DWORD 0h
- rc RECT < >
- szAboutName SBYTE "AboutBox",0h ;for ABOUT BOX
- rcDlg RECT < >
-
- .CODE
- WinMain PROC STDCALL, hInstance:HINSTANCE, hPrevInstance:HINSTANCE, lpszCmdLine:LPSTR, nCmdShow:UINT
- LOCAL wm:MSG
-
- cmp hPrevInstance,0h
- jne @F
-
- INVOKE InitApplication, hInstance, nCmdShow
- or EAX,EAX
- jz WMquit
-
- MsgLoop LABEL NEAR
- xor EAX,EAX
- push EAX
- push EAX
- push NULL
- lea EAX,wm
- push EAX
- call GetMessageA
- or EAX,EAX ;GetMessage() returns FALSE (EAX=0)
- je @F ;if a WM_QUIT message...
-
- lea EAX,wm
- push EAX
- call TranslateMessage
-
- lea EAX,wm
- push EAX
- call DispatchMessageA
-
- jmp MsgLoop
-
- @@: mov EAX,wm.wParam ;return wParam to Windows
- WMquit: ret
- WinMain ENDP
-
-
- InitApplication PROC STDCALL, hInstance:HINSTANCE, nCmdShow:UINT
- LOCAL wc:WNDCLASSEX
-
- mov wc.cbSize,SIZEOF(WNDCLASSEX)
-
- mov wc.style,CS_HREDRAW + CS_VREDRAW
-
- lea EDI,wc.lpfnWndProc
- mov [EDI],OFFSET WndProc
-
- mov wc.cbClsExtra,0h
- mov wc.cbWndExtra,0h
-
- mov EAX,hInstance
- mov wc.hInstance,EAX
-
- INVOKE LoadIconA, hInstance, ADDR szIcon
- mov wc.hIcon,EAX
-
- INVOKE LoadCursorA, NULL, IDC_ARROW
- mov wc.hCursor,EAX
-
- mov wc.hbrBackground,COLOR_WINDOW + 1
-
- mov wc.lpszMenuName,OFFSET szMenuName
- mov wc.lpszClassName,OFFSET szClassName
-
- INVOKE LoadImageA, hInstance, ADDR szIcon, IMAGE_ICON, 16, 16, NULL
- mov wc.hIconSm,EAX
-
- lea EAX,wc
- push EAX
- call RegisterClassExA
- or EAX,EAX
- jz @F
-
- INVOKE CreateWindowExA, WS_EX_OVERLAPPEDWINDOW, ADDR szClassName, ADDR szWindowName,\
- WS_OVERLAPPEDWINDOW,\
- 80, 16, 400, 300, NULL, NULL, hInstance, NULL
-
- or EAX,EAX
- jz @F
- mov hMainWnd,EAX
-
- INVOKE InitCommonControls
- INVOKE CreateStatusWindow, WS_CHILD + WS_BORDER + WS_VISIBLE,\
- OFFSET szStatusText, hMainWnd, ID_STATUS
- mov hStatusWnd,EAX
- INVOKE SendMessageA, hStatusWnd, SB_SIMPLE, TRUE, 0
-
- INVOKE ShowWindow, hMainWnd, nCmdShow
- INVOKE UpdateWindow, hMainWnd
- mov EAX,TRUE
-
- @@: ret
- InitApplication ENDP
-
-
- WndProc PROC STDCALL, hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
- mov EAX,uMsg
-
- cmp EAX,WM_PAINT
- je caseWM_PAINT
-
- cmp EAX,WM_COMMAND
- je caseWM_COMMAND
-
- cmp EAX,WM_MENUSELECT
- je caseWM_MENUSELECT
-
- cmp EAX,WM_SIZE
- je caseWM_SIZE
-
- cmp EAX,WM_DESTROY
- je caseWM_DESTROY
-
- cmp EAX,WM_CREATE
- je caseWM_CREATE
-
- caseDEFAULT: INVOKE DefWindowProcA, hWnd, uMsg, wParam, lParam
- jmp caseRETURN
-
- caseWM_PAINT: INVOKE BeginPaint, hWnd, ADDR ps
- mov hdc,EAX
-
- INVOKE lstrlenA, lpszCmd ;put string length in EAX
- INVOKE TextOutA, hdc, 0h, 0h, lpszCmd, EAX ;Command Line
-
- INVOKE EndPaint, hWnd, ADDR ps
- jmp caseBREAK
-
- caseWM_DESTROY: INVOKE PostQuitMessage, 0h
- jmp caseBREAK
-
- caseWM_CREATE: INVOKE GetSystemMetrics, SM_CXSCREEN
- mov cxScreen,EAX
- shr EAX,1h
- mov rc.right,EAX ;width = 1/2 screen width
- shr EAX,1h
- mov rc.left,EAX ;xPos = 1/4 across screen
- INVOKE GetSystemMetrics, SM_CYSCREEN
- mov cyScreen,EAX
- shr EAX,1h
- mov rc.bottom,EAX ;heigth = 1/2 screen heigth
- shr EAX,1h
- mov rc.top,EAX ;yPos = 1/4 down screen
-
- INVOKE SetWindowPos, hWnd, HWND_TOP,\
- rc.left, rc.top, rc.right, rc.bottom, NULL
- jmp caseBREAK
-
- caseWM_SIZE: INVOKE SendMessageA, hStatusWnd, uMsg, wParam, lParam
- jmp caseBREAK
-
- caseWM_COMMAND: mov EAX,lParam
- mov hWndCtl,EAX ;NULL or handle of control
- mov EAX,wParam
- mov wID,AX ;item, control, or accelerator identifier
- shr EAX,10h
- mov wNotifyCode,AX ;notification code
-
- cmp wID,IDM_ABOUT
- je caseABOUT
-
- cmp wID,IDM_EXIT
- je caseWM_DESTROY
-
- jmp caseDEFAULT
-
- caseABOUT: INVOKE DialogBoxParamA, hInst, OFFSET szAboutName, hWnd, OFFSET About, NULL
- jmp caseBREAK
-
- caseWM_MENUSELECT:
- mov EAX,lParam ;handle of menu clicked
- mov hMenu,EAX
- mov EAX,wParam ;menu item or pop-up menu index
- and EAX,0FFFFh
- mov uItem,EAX
- mov EAX,wParam ;menu flags
- shr EAX,10h
- mov fuFlags,EAX
-
- mov EAX,uItem
- cmp EAX,IDM_EXIT
- jb @F
- cmp EAX,IDM_ABOUT
- ja @F
- mov nStringID,EAX
- INVOKE LoadStringA, hInst, nStringID, OFFSET szStatusText, 21h
- INVOKE SendMessageA, hStatusWnd, SB_SETTEXT, 255, OFFSET szStatusText
- jmp caseBREAK
-
- @@: mov EAX," " ;clear status text
- mov EDI, OFFSET szStatusText
- mov ECX,8h
- rep stosd
- INVOKE SendMessageA, hStatusWnd, SB_SETTEXT, 255, OFFSET szStatusText
-
- caseBREAK: xor EAX,EAX ;return 0 if message is processed
-
- caseRETURN: ret
- WndProc ENDP
-
-
- About PROC STDCALL, hDlg:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
- mov EAX,uMsg
- cmp EAX,WM_INITDIALOG
- jne @F
-
- INVOKE GetWindowRect, hMainWnd, OFFSET rc
- INVOKE GetWindowRect, hDlg, OFFSET rcDlg
-
- mov EAX,rc.right ;center About Box in Main Window
- sub EAX,rc.left
- sub EAX,rcDlg.right
- add EAX,rcDlg.left
- shr EAX,1h
- add EAX,rc.left
- mov rcDlg.left,EAX
-
- mov EAX,rc.bottom
- sub EAX,rc.top
- sub EAX,rcDlg.bottom
- add EAX,rcDlg.top
- shr EAX,1h
- add EAX,rc.top
- mov rcDlg.right,EAX
-
- INVOKE SetWindowPos, hDlg, HWND_TOP,\
- rcDlg.left, rcDlg.right, 0, 0, SWP_NOSIZE
- mov EAX,TRUE
- jmp SHORT xAbout
-
- @@: cmp AX,WM_COMMAND
- je @F
- mov EAX,FALSE ;message not processed
- jmp SHORT xAbout
-
- @@: cmp wParam,IDOK
- je @F
- cmp wParam,IDCANCEL
- je @F
- mov EAX,FALSE ;message not processed
- jmp SHORT xAbout
-
- @@: INVOKE EndDialog, hDlg, TRUE
- mov EAX,TRUE ;message processed
-
- xAbout: ret
- About ENDP
-
-
- _start LABEL NEAR
-
- INVOKE GetModuleHandleA, NULL
- mov hInst,EAX
- INVOKE GetCommandLineA
- mov lpszCmd,EAX
-
- INVOKE WinMain, hInst, NULL, lpszCmd, SW_SHOWDEFAULT
- mov dwExitCode,EAX
-
- INVOKE ExitProcess, dwExitCode
-
- END _start
-