⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 richedit.asm

📁 这是一个数字图像处理的matlab仿真程序
💻 ASM
字号:
; #########################################################################

      .386
      .model flat, stdcall      ; 32 bit memory model
      option casemap :none      ; case sensitive

      include Richedit.inc      ; local includes for this file

    ; ---------------------------------------
    ; Select rich edit version here, leave
    ; uncomment for richedit version 1 or
    ; comment out for richedit version 2
    ; ---------------------------------------
      riched1 equ <anytext>

    ; -----------------------------------
    ; Select right click menu popup here
    ; -----------------------------------
      menu_popup equ 0  ; 0 = File, 1 = Edit etc ....

    ; --------------------------
    ; Select either system font
    ; --------------------------
      edit_font equ <SYSTEM_FIXED_FONT>
      ; edit_font equ <ANSI_FIXED_FONT>

; #########################################################################

.code

start:
      invoke GetModuleHandle, NULL
      mov hInstance, eax

      invoke GetCommandLine
      mov CommandLine, eax

      invoke InitCommonControls

    ; --------------------------
    ; preset GLOBAL scope flags 
    ; --------------------------
      mov CaseFlag, 1
      mov WholeWord, 0
      mov CtrlFlag, 0

      invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT
      invoke ExitProcess,eax

; #########################################################################

WinMain proc hInst     :DWORD,
             hPrevInst :DWORD,
             CmdLine   :DWORD,
             CmdShow   :DWORD

      ;====================
      ; Put LOCALs on stack
      ;====================

      LOCAL Wwd  :DWORD
      LOCAL Wht  :DWORD
      LOCAL Wtx  :DWORD
      LOCAL Wty  :DWORD
      LOCAL lpArg:DWORD
      LOCAL sWid :DWORD
      LOCAL sHgt :DWORD
      LOCAL wc   :WNDCLASSEX
      LOCAL msg  :MSG

    ; --------------------------------------------------
    ; Fill WNDCLASSEX structure with required variables
    ; --------------------------------------------------
      invoke LoadIcon,hInst,500     ; icon ID
      mov hIcon, eax

      szText szClassName,"Rich_Edit_Class"

      mov wc.cbSize,         sizeof WNDCLASSEX
      mov wc.style,          CS_BYTEALIGNWINDOW
      mov wc.lpfnWndProc,    offset WndProc
      mov wc.cbClsExtra,     NULL
      mov wc.cbWndExtra,     NULL
      m2m wc.hInstance,      hInst
      mov wc.hbrBackground,  NULL
      m2m wc.lpszMenuName,   NULL
      mov wc.lpszClassName,  offset szClassName
      m2m wc.hIcon,          hIcon
        invoke LoadCursor,NULL,IDC_ARROW
      mov wc.hCursor,        eax
      m2m wc.hIconSm,        hIcon

      invoke RegisterClassEx, ADDR wc

    ; -------------------------------------------------
    ; Size & centre window at 75% x 75% of screen size
    ; -------------------------------------------------
      invoke GetSystemMetrics,SM_CXSCREEN
      mov sWid, eax
      push sWid

      shr eax, 2
      sub sWid, eax
      m2m Wwd, sWid

      invoke GetSystemMetrics,SM_CYSCREEN
      mov sHgt, eax
      push sHgt

      shr eax, 2
      sub sHgt, eax
      m2m Wht, sHgt

      pop sHgt
      invoke TopXY,Wht,sHgt
      mov Wty, eax

      pop sWid
      invoke TopXY,Wwd,sWid
      mov Wtx, eax
    ; ----------------------------------

      invoke CreateWindowEx,WS_EX_LEFT or WS_EX_ACCEPTFILES,
                            ADDR szClassName,
                            ADDR Untitled,
                            WS_OVERLAPPEDWINDOW,
                            Wtx,Wty,Wwd,Wht,
                            NULL,NULL,
                            hInst,NULL
      mov   hWnd,eax

    ; ------------------------------
    ; get any command line filename
    ; ------------------------------
      invoke PathGetArgs,CommandLine
      mov lpArg, eax

      mov esi, eax
      lodsb
      cmp al, 0
      je noArgs       ; jump if no arg
      cmp al, 34
      jne @F          ; jump if no quote

      invoke PathUnquoteSpaces,lpArg
      mov lpArg, eax

      @@:

      invoke exist,lpArg
      .if eax == 1
        invoke StreamFileIn,hRichEd,lpArg
        invoke SetWindowText,hWnd,lpArg
        invoke SendMessage,hRichEd,EM_SETMODIFY,0,0
      .else
        szText cantfind,"Sorry, cannot find that file."
        invoke MessageBox,hWnd,lpArg,ADDR cantfind,MB_OK
      .endif

      noArgs:
    ; ------------------------------

      invoke LoadMenu,hInst,600     ; menu ID
      mov hMnu, eax
      invoke SetMenu,hWnd,eax

      invoke ShowWindow,hWnd,SW_SHOWNORMAL
      invoke UpdateWindow,hWnd

  ; -----------------------------------
  ; Loop until PostQuitMessage is sent
  ; -----------------------------------

    StartLoop:
      invoke GetMessage,ADDR msg,NULL,0,0
      cmp eax, 0
      je ExitLoop

    ; ------------------------------------------------
    ; process keystrokes directly in the message loop
    ; ------------------------------------------------
      .if msg.message == WM_KEYDOWN
        .if msg.wParam == VK_ESCAPE
          invoke SendMessage,hWnd,WM_SYSCOMMAND,SC_CLOSE,NULL
        .elseif msg.wParam == VK_CONTROL
          mov CtrlFlag, 1                   ; flag set
        .endif
      .endif

      .if msg.message == WM_KEYUP
        .if msg.wParam == VK_CONTROL
          mov CtrlFlag, 0                   ; flag clear
        .elseif msg.wParam == 54h           ; Ctrl + T
          .if CtrlFlag == 1
            invoke SendMessage,hWnd,WM_COMMAND,1105,0
          .endif
        .elseif msg.wParam == 4Eh           ; Ctrl + N
          .if CtrlFlag == 1
            invoke SendMessage,hWnd,WM_COMMAND,1000,0
          .endif
        .elseif msg.wParam == 57h           ; Ctrl + W
          .if CtrlFlag == 1
            invoke SendMessage,hWnd,WM_COMMAND,1001,0
            jmp StartLoop
          .endif
        .elseif msg.wParam == 4Fh           ; Ctrl + O
          .if CtrlFlag == 1
            invoke SendMessage,hWnd,WM_COMMAND,1002,0
          .endif
        .elseif msg.wParam == 53h           ; Ctrl + S
          .if CtrlFlag == 1
            invoke SendMessage,hWnd,WM_COMMAND,1003,0
          .endif
        .elseif msg.wParam == 42h           ; Ctrl + B
          .if CtrlFlag == 1
            invoke SendMessage,hWnd,WM_COMMAND,1004,0
          .endif
        .endif
      .endif
    ; ------------------------------------------------

      invoke TranslateMessage, ADDR msg
      invoke DispatchMessage,  ADDR msg
      jmp StartLoop
    ExitLoop:

      return msg.wParam

WinMain endp

; #########################################################################

WndProc proc hWin   :DWORD,
             uMsg   :DWORD,
             wParam :DWORD,
             lParam :DWORD

    LOCAL var    :DWORD
    LOCAL caW    :DWORD
    LOCAL caH    :DWORD
    LOCAL hTbar  :DWORD
    LOCAL hSbar  :DWORD
    LOCAL tl     :DWORD
    LOCAL hDC    :DWORD
    LOCAL lpTxt  :DWORD
    LOCAL nmh    :NMHDR    
    LOCAL Rct    :RECT
    LOCAL Ps     :PAINTSTRUCT
    LOCAL tbab   :TBADDBITMAP
    LOCAL tbb    :TBBUTTON
    LOCAL buffer1[128]:BYTE
    LOCAL FileBuffer[260]:BYTE

    .if uMsg == WM_COMMAND
    ;======== toolbar commands ========

        .if wParam == 50
            jmp NewFile

        .elseif wParam == 51
            jmp FileOpen

        .elseif wParam == 52
            jmp FileSave

        .elseif wParam == 53
            jmp mnu_Cut

        .elseif wParam == 54
            jmp mnu_Copy

        .elseif wParam == 55
            jmp mnu_Paste

        .elseif wParam == 56
            jmp mnu_Undo

        .elseif wParam == 57
            jmp mnu_FindText

        .elseif wParam == 58
            jmp new_instance

        .elseif wParam == 59
            jmp QuitApp

    ;======== menu commands ========

        .elseif wParam == 1000  ; **** New ****
            NewFile:
            invoke Confirmation,hRichEd

              .if eax == IDYES
                  jmp FileSave
              .elseif eax == IDNO
                  jmp @F
              .elseif eax == IDCANCEL
                  return 0
              .endif

              @@:
                invoke SendMessage,hWin,WM_SETTEXT,0,ADDR Untitled
                invoke SendMessage,hRichEd,WM_SETTEXT,0,0
                invoke SendMessage,hRichEd,EM_SETMODIFY,0,0
              ; -------------------------
              ; Reset status bar message
              ; -------------------------
                szText nStr,0
                invoke SendMessage,hStatus,SB_SETTEXT,3,ADDR nStr

        .elseif wParam == 1001  ; **** New Instance ****
            new_instance:

            invoke GetModuleFileName,NULL,ADDR buffer1,128
            invoke WinExec,ADDR buffer1,SW_SHOW

        .elseif wParam == 1002  ; **** Open ****
            FileOpen:

            invoke Confirmation,hRichEd
              .if eax == IDYES
                  jmp FileSave
              .elseif eax == IDCANCEL
                  return 0
              .endif

           jmp @F
             szTitleO   db "Open A File",0
             szFilterO  db "All files",0,"*.*",0,
                           "Text files",0,"*.TEXT",0,0
           @@:

           mov szFileName[0],0
           invoke GetFileName,hWin,ADDR szTitleO,ADDR szFilterO
    
           cmp szFileName[0],0  ;<< zero if cancel pressed in dlgbox
           je @F
             invoke StreamFileIn,hRichEd,ADDR szFileName
             invoke SetWindowText,hWin,ADDR szFileName
           @@:

        .elseif wParam == 1003  ; **** Save ****

            FileSave:

            invoke SendMessage,hWin,WM_GETTEXTLENGTH,0,0
            mov tl, eax
            inc tl              ; 1 extra for zero terminator

            invoke GetWindowText,hWin,ADDR buffer1,tl
            invoke lstrcmp,ADDR buffer1,ADDR Untitled

            cmp eax, 0          ; eax is zero is strings are equal
              jne @F
              jmp FileSaveAs
            @@:

            invoke StreamFileOut,hRichEd,ADDR buffer1
            invoke SendMessage,hRichEd,EM_SETMODIFY,0,0

        .elseif wParam == 1004  ; **** Save As ****

            FileSaveAs:

           jmp @F
             szTitleS   db "Save file as",0
             szFilterS  db "All files",0,"*.*",0,
                           "Text files",0,"*.TEXT",0,0
           @@:

           mov szFileName[0],0
           invoke SaveFileName,hWin,ADDR szTitleS,ADDR szFilterS
    
           cmp szFileName[0],0  ;<< zero if cancel pressed in dlgbox
           je @F
            invoke StreamFileOut,hRichEd,ADDR szFileName
            invoke SendMessage,hRichEd,EM_SETMODIFY,0,0
            invoke SendMessage,hWin,WM_SETTEXT,0,ADDR szFileName
           @@:

        .elseif wParam == 1005
            invoke MergeFile,hRichEd

        .elseif wParam == 1010  ; **** Exit ****
            QuitApp:
            invoke SendMessage,hWin,WM_SYSCOMMAND,SC_CLOSE,NULL

        ; ----------
        ; Edit Menu 
        ; ----------
        .elseif wParam == 1100
            mnu_Undo:
            invoke SendMessage,hRichEd,EM_UNDO,0,0
        .elseif wParam == 1101
            mnu_Cut:
            invoke SendMessage,hRichEd,WM_CUT,0,0
        .elseif wParam == 1102
            mnu_Copy:
            invoke SendMessage,hRichEd,WM_COPY,0,0
        .elseif wParam == 1103
            mnu_Paste:
            invoke SendMessage,hRichEd,EM_PASTESPECIAL,CF_TEXT,0
        .elseif wParam == 1104
            invoke SendMessage,hRichEd,WM_CLEAR,0,0
        .elseif wParam == 1105
            invoke SendMessage,hRichEd,EM_SETOPTIONS,ECOOP_XOR,ECO_SELECTIONBAR
        .elseif wParam == 1106
            mnu_FindText:
            invoke CallSearchDlg
        .elseif wParam == 1107
            mnu_FindNext:
            invoke TextFind,ADDR SearchText,TextLen
        .elseif wParam == 1108
            invoke Select_All,hRichEd

        .elseif wParam == 1900  ; **** About ****
            szText RichEd,"MASM RichEdit"
            szText AboutMsg,"Rich Text Editor",13,10,\
            "Copyright 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -