home *** CD-ROM | disk | FTP | other *** search
/ Windows 95 Shareware (Platinum Edition) / QUEPLAT95.ISO / files / programm / skeleton / skeleton.asm < prev    next >
Encoding:
Assembly Source File  |  1995-09-30  |  7.3 KB  |  319 lines

  1.     TITLE    32-Bit Skeleton Application
  2.  
  3.         OPTION    CASEMAP:NONE
  4.  
  5.     .486                ;32-Bit when .486 before .MODEL
  6.     .MODEL  FLAT, STDCALL
  7.  
  8.         INCLUDE WINDOWS.INC
  9.  
  10. PUBLIC          _start                  ;application startup routine
  11.  
  12. WinMain         PROTO   STDCALL :HINSTANCE, :HINSTANCE, :LPSTR, :UINT
  13. InitApplication PROTO   STDCALL :HINSTANCE, :UINT
  14. WndProc        PROTO   STDCALL :HWND, :UINT, :WPARAM, :LPARAM
  15. About           PROTO   STDCALL :HWND, :UINT, :WPARAM, :LPARAM
  16.  
  17. IDM_EXIT        EQU     100             ;menu-identifiers
  18. IDM_ABOUT       EQU     101
  19.  
  20. ID_STATUS       EQU     400
  21.  
  22.  
  23.         .DATA
  24. hPrev           HINSTANCE    0h    ;WinMain parameters
  25. hInst       HINSTANCE    0h
  26. lpszCmd     LPSTR    0h
  27. cmdShow         UINT    SW_SHOWDEFAULT
  28. dwExitCode      DWORD    0h
  29. hMainWnd    HWND    0h
  30.  
  31. szClassName     SBYTE    "Skeleton",0h
  32. szWindowName    SBYTE    "Skeleton",0h
  33. szMenuName    SBYTE    "Skeleton",0h
  34. szIcon          SBYTE    "Skeleton",0h
  35.  
  36. szStatusText    SBYTE    "Status Bar                      ",0h
  37. hStatusWnd    HWND    0h
  38.  
  39. wNotifyCode     WORD    0h          ;for WM_COMMAND message
  40. wID             WORD    0h
  41. hWndCtl         HANDLE  0h
  42.  
  43. uItem           UINT    0h          ;for WM_MENUSELECT message
  44. fuFlags         UINT    0h
  45. hMenu           HMENU   0h
  46. nStringID       DWORD   0h
  47.  
  48. hdc        HDC    0h        ;for WM_PAINT message
  49. ps        PAINTSTRUCT    < >
  50.  
  51. cxScreen    DWORD    0h        ;for WM_CREATE
  52. cyScreen    DWORD    0h
  53. rc        RECT    < >
  54. szAboutName     SBYTE    "AboutBox",0h    ;for ABOUT BOX
  55. rcDlg        RECT    < >
  56.  
  57.         .CODE
  58. WinMain     PROC    STDCALL, hInstance:HINSTANCE, hPrevInstance:HINSTANCE, lpszCmdLine:LPSTR, nCmdShow:UINT
  59.         LOCAL    wm:MSG
  60.  
  61.         cmp    hPrevInstance,0h
  62.         jne    @F
  63.  
  64.         INVOKE    InitApplication, hInstance, nCmdShow
  65.         or    EAX,EAX
  66.         jz    WMquit
  67.  
  68. MsgLoop        LABEL    NEAR
  69.         xor    EAX,EAX
  70.         push    EAX
  71.         push    EAX
  72.         push    NULL
  73.         lea    EAX,wm
  74.         push    EAX
  75.         call    GetMessageA
  76.         or    EAX,EAX         ;GetMessage() returns FALSE (EAX=0)
  77.         je    @F              ;if a WM_QUIT message...
  78.  
  79.         lea    EAX,wm
  80.         push    EAX
  81.         call    TranslateMessage
  82.  
  83.         lea    EAX,wm
  84.         push    EAX
  85.         call    DispatchMessageA
  86.  
  87.         jmp    MsgLoop
  88.  
  89. @@:        mov    EAX,wm.wParam    ;return wParam to Windows
  90. WMquit:        ret
  91. WinMain        ENDP
  92.  
  93.  
  94. InitApplication PROC    STDCALL, hInstance:HINSTANCE, nCmdShow:UINT
  95.             LOCAL    wc:WNDCLASSEX
  96.  
  97.             mov    wc.cbSize,SIZEOF(WNDCLASSEX)
  98.  
  99.             mov    wc.style,CS_HREDRAW + CS_VREDRAW
  100.  
  101.         lea    EDI,wc.lpfnWndProc
  102.             mov    [EDI],OFFSET WndProc
  103.  
  104.             mov    wc.cbClsExtra,0h
  105.             mov    wc.cbWndExtra,0h
  106.  
  107.         mov    EAX,hInstance
  108.         mov    wc.hInstance,EAX
  109.  
  110.             INVOKE    LoadIconA, hInstance, ADDR szIcon
  111.         mov    wc.hIcon,EAX
  112.  
  113.             INVOKE    LoadCursorA, NULL, IDC_ARROW
  114.         mov    wc.hCursor,EAX
  115.  
  116.             mov    wc.hbrBackground,COLOR_WINDOW + 1
  117.  
  118.             mov    wc.lpszMenuName,OFFSET szMenuName
  119.             mov    wc.lpszClassName,OFFSET szClassName
  120.  
  121.             INVOKE    LoadImageA, hInstance, ADDR szIcon, IMAGE_ICON, 16, 16, NULL
  122.             mov    wc.hIconSm,EAX
  123.  
  124.         lea    EAX,wc
  125.         push    EAX
  126.             call    RegisterClassExA
  127.         or    EAX,EAX
  128.                jz    @F
  129.  
  130.             INVOKE    CreateWindowExA, WS_EX_OVERLAPPEDWINDOW, ADDR szClassName, ADDR szWindowName,\
  131.                     WS_OVERLAPPEDWINDOW,\
  132.                     80, 16, 400, 300, NULL, NULL, hInstance, NULL
  133.  
  134.         or     EAX,EAX
  135.             jz    @F
  136.         mov    hMainWnd,EAX
  137.  
  138.             INVOKE    InitCommonControls
  139.             INVOKE    CreateStatusWindow, WS_CHILD + WS_BORDER + WS_VISIBLE,\
  140.                     OFFSET szStatusText, hMainWnd, ID_STATUS
  141.             mov    hStatusWnd,EAX
  142.             INVOKE    SendMessageA, hStatusWnd, SB_SIMPLE, TRUE, 0
  143.  
  144.             INVOKE    ShowWindow, hMainWnd, nCmdShow
  145.             INVOKE    UpdateWindow, hMainWnd
  146.             mov    EAX,TRUE
  147.  
  148. @@:        ret
  149. InitApplication ENDP
  150.  
  151.  
  152. WndProc        PROC    STDCALL, hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
  153.         mov    EAX,uMsg
  154.  
  155.         cmp    EAX,WM_PAINT
  156.         je    caseWM_PAINT
  157.  
  158.         cmp    EAX,WM_COMMAND
  159.         je    caseWM_COMMAND
  160.  
  161.         cmp    EAX,WM_MENUSELECT
  162.         je    caseWM_MENUSELECT
  163.  
  164.             cmp    EAX,WM_SIZE
  165.             je    caseWM_SIZE
  166.  
  167.         cmp    EAX,WM_DESTROY
  168.             je    caseWM_DESTROY
  169.  
  170.         cmp    EAX,WM_CREATE
  171.             je    caseWM_CREATE
  172.  
  173. caseDEFAULT:    INVOKE    DefWindowProcA, hWnd, uMsg, wParam, lParam
  174.         jmp    caseRETURN
  175.  
  176. caseWM_PAINT:    INVOKE    BeginPaint, hWnd, ADDR ps
  177.         mov    hdc,EAX
  178.  
  179.         INVOKE    lstrlenA, lpszCmd    ;put string length in EAX
  180.         INVOKE    TextOutA, hdc, 0h, 0h, lpszCmd, EAX    ;Command Line
  181.  
  182.         INVOKE    EndPaint, hWnd, ADDR ps
  183.         jmp    caseBREAK
  184.  
  185. caseWM_DESTROY:    INVOKE    PostQuitMessage, 0h
  186.         jmp    caseBREAK
  187.  
  188. caseWM_CREATE:    INVOKE    GetSystemMetrics, SM_CXSCREEN
  189.         mov    cxScreen,EAX
  190.         shr    EAX,1h
  191.         mov    rc.right,EAX        ;width = 1/2 screen width
  192.         shr    EAX,1h
  193.         mov    rc.left,EAX        ;xPos = 1/4 across screen
  194.             INVOKE    GetSystemMetrics, SM_CYSCREEN
  195.         mov    cyScreen,EAX
  196.         shr    EAX,1h
  197.         mov    rc.bottom,EAX        ;heigth = 1/2 screen heigth
  198.         shr    EAX,1h
  199.         mov    rc.top,EAX        ;yPos = 1/4 down screen
  200.  
  201.         INVOKE    SetWindowPos, hWnd, HWND_TOP,\
  202.             rc.left, rc.top, rc.right, rc.bottom, NULL
  203.         jmp    caseBREAK
  204.  
  205. caseWM_SIZE:    INVOKE    SendMessageA, hStatusWnd, uMsg, wParam, lParam
  206.         jmp    caseBREAK
  207.  
  208. caseWM_COMMAND:    mov    EAX,lParam
  209.         mov    hWndCtl,EAX    ;NULL or handle of control
  210.         mov    EAX,wParam
  211.         mov    wID,AX        ;item, control, or accelerator identifier
  212.         shr    EAX,10h
  213.         mov    wNotifyCode,AX    ;notification code
  214.  
  215.         cmp    wID,IDM_ABOUT
  216.         je    caseABOUT
  217.  
  218.         cmp    wID,IDM_EXIT
  219.         je    caseWM_DESTROY
  220.  
  221.         jmp    caseDEFAULT
  222.  
  223. caseABOUT:    INVOKE    DialogBoxParamA, hInst, OFFSET szAboutName, hWnd, OFFSET About, NULL
  224.         jmp    caseBREAK
  225.  
  226. caseWM_MENUSELECT:
  227.         mov    EAX,lParam    ;handle of menu clicked
  228.         mov    hMenu,EAX
  229.         mov    EAX,wParam    ;menu item or pop-up menu index
  230.         and    EAX,0FFFFh
  231.         mov    uItem,EAX
  232.         mov    EAX,wParam    ;menu flags
  233.         shr    EAX,10h
  234.         mov    fuFlags,EAX
  235.  
  236.         mov    EAX,uItem
  237.         cmp    EAX,IDM_EXIT
  238.         jb    @F
  239.         cmp    EAX,IDM_ABOUT
  240.         ja    @F
  241.         mov    nStringID,EAX
  242.         INVOKE    LoadStringA, hInst, nStringID, OFFSET szStatusText, 21h
  243.         INVOKE    SendMessageA, hStatusWnd, SB_SETTEXT, 255, OFFSET szStatusText
  244.         jmp    caseBREAK
  245.  
  246. @@:        mov    EAX,"    "    ;clear status text
  247.         mov    EDI, OFFSET szStatusText
  248.         mov    ECX,8h
  249.         rep    stosd
  250.         INVOKE    SendMessageA, hStatusWnd, SB_SETTEXT, 255, OFFSET szStatusText
  251.  
  252. caseBREAK:    xor    EAX,EAX        ;return 0 if message is processed
  253.  
  254. caseRETURN:    ret
  255. WndProc        ENDP
  256.  
  257.  
  258. About        PROC    STDCALL, hDlg:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
  259.         mov    EAX,uMsg
  260.         cmp    EAX,WM_INITDIALOG
  261.         jne    @F
  262.  
  263.         INVOKE    GetWindowRect, hMainWnd, OFFSET rc
  264.         INVOKE    GetWindowRect, hDlg, OFFSET rcDlg
  265.  
  266.         mov    EAX,rc.right        ;center About Box in Main Window
  267.         sub    EAX,rc.left
  268.         sub    EAX,rcDlg.right
  269.         add    EAX,rcDlg.left
  270.         shr    EAX,1h
  271.         add    EAX,rc.left
  272.         mov    rcDlg.left,EAX
  273.  
  274.         mov    EAX,rc.bottom
  275.         sub    EAX,rc.top
  276.         sub    EAX,rcDlg.bottom
  277.         add    EAX,rcDlg.top
  278.         shr    EAX,1h
  279.         add    EAX,rc.top
  280.         mov    rcDlg.right,EAX
  281.  
  282.         INVOKE    SetWindowPos, hDlg, HWND_TOP,\
  283.             rcDlg.left, rcDlg.right, 0, 0, SWP_NOSIZE
  284.         mov     EAX,TRUE
  285.         jmp    SHORT xAbout
  286.  
  287. @@:        cmp    AX,WM_COMMAND
  288.         je    @F
  289.         mov    EAX,FALSE    ;message not processed
  290.         jmp    SHORT xAbout
  291.  
  292. @@:        cmp    wParam,IDOK
  293.         je    @F
  294.         cmp    wParam,IDCANCEL
  295.         je    @F
  296.         mov    EAX,FALSE    ;message not processed
  297.         jmp    SHORT xAbout
  298.  
  299. @@:        INVOKE    EndDialog, hDlg, TRUE
  300.         mov    EAX,TRUE    ;message processed
  301.  
  302. xAbout:        ret
  303. About       ENDP
  304.  
  305.  
  306. _start        LABEL     NEAR
  307.  
  308.         INVOKE    GetModuleHandleA, NULL
  309.         mov    hInst,EAX
  310.         INVOKE    GetCommandLineA
  311.         mov    lpszCmd,EAX
  312.  
  313.         INVOKE    WinMain, hInst, NULL, lpszCmd, SW_SHOWDEFAULT
  314.         mov    dwExitCode,EAX
  315.  
  316.         INVOKE    ExitProcess, dwExitCode
  317.  
  318.         END    _start
  319.