引自: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​