Results 1 to 9 of 9

Thread: WOOHOO! I successfully made a program that does something in Assembly!

Threaded View

  1. #1

    Thread Starter
    Frenzied Member numtel's Avatar
    Join Date
    Apr 2000
    Location
    CA
    Posts
    1,163

    WOOHOO! I successfully made a program that does something in Assembly!

    Here it is! I'm very proud of myself!

    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.
    Attached Files Attached Files

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  



Click Here to Expand Forum to Full Width