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

📄 tooltest22.asm

📁 用masm写的TOOBar生成器
💻 ASM
📖 第 1 页 / 共 2 页
字号:
         title   ToolTemplate

         .586
         .model flat, stdcall
         option casemap:none   ; Case sensitive

            include  \MASM32V1\PROGRAMS\AsmEdit\include\Windows.inc
            include  \MASM32V1\PROGRAMS\AsmEdit\include\user32.inc
            include  \MASM32V1\PROGRAMS\AsmEdit\include\kernel32.inc
            include  \MASM32V1\PROGRAMS\AsmEdit\include\gdi32.inc
            include  \MASM32V1\PROGRAMS\AsmEdit\include\comctl32.inc
            include  \MASM32V1\PROGRAMS\AsmEdit\include\comdlg32.inc

   include  \MASM32V1\PROGRAMS\AsmEdit\include\DSPMACRO.asm

         includelib  \MASM32V1\PROGRAMS\AsmEdit\lib\user32.lib
         includelib  \MASM32V1\PROGRAMS\AsmEdit\lib\kernel32.lib
         includelib  \MASM32V1\PROGRAMS\AsmEdit\lib\gdi32.lib
         includelib  \MASM32V1\PROGRAMS\AsmEdit\lib\comctl32.lib
         includelib  \MASM32V1\PROGRAMS\AsmEdit\lib\comdlg32.lib

;===================================================
; PROTO, MACRO, and Data section
;===================================================
WinMain         PROTO  :DWORD, :DWORD, :DWORD, :DWORD
RichEditProc    PROTO  :DWORD, :DWORD, :DWORD, :DWORD
;Insert between
;++++ Proto & Macros ++++++++++++++++++++++++++++++++++++++++++++++++++
ChgBmpColor      PROTO :DWORD

;---------- [Toolbar structure macros] ----------
TBSep    MACRO hTool
           mov     tbb.iBitmap, 0
           mov     tbb.idCommand, 0
           mov     tbb.fsState, TBSTATE_ENABLED
           mov     tbb.fsStyle, TBSTYLE_SEP
        INVOKE     SendMessage, hTool, TB_ADDBUTTONS, 1, addr tbb
          ENDM

TBButt   MACRO hTool, BmpID, CmdID, Text
           mov     tbb.iBitmap, BmpID    ; Button image number
           mov     tbb.idCommand, CmdID  ; Command ID number
           mov     tbb.fsState, TBSTATE_ENABLED
           mov     tbb.fsStyle, TBSTYLE_BUTTON
           mov     tbb.dwData, 0
           mov     tbb.iString, Text
        INVOKE     SendMessage, hTool, TB_ADDBUTTONS, 1, addr tbb
          ENDM
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

.const
;Insert between
;++++ Constants +++++++++++++++++++++++++++++++++++++++++++++++++++++++
IDM_NEW            equ 1001
IDM_OPEN           equ 1002
IDM_SAVE           equ 1003
IDM_CUT            equ 1004
IDM_COPY           equ 1005
IDM_PASTE          equ 1006
IDM_DELETE         equ 1007
IDM_FIND           equ 1008
IDM_FINDNEXT       equ 1009
IDM_FINDPREV       equ 1010
IDM_REPLACE        equ 1011
IDM_EXIT           equ 1012
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
IDM_SELALL         equ 2009

.data
RichEdit       db  'RichEdit20A',0
RichEdDLL      db  'RICHED20.DLL',0
FontNameCN     db  'Courier New',0
PopupMenu      db  'PopupMenu',0
FontHeight     dd  -12
FontW          dd  400
StatClass      db  'msctls_statusbar32',0
szPart1        db  'Part 1',0
szPart3        db  'Part 3',0
ToolClass      db  'ToolbarWindow32',0
ClassName      db  'ToolTemplate',0
AppName        db  'ToolTemplate',0
MenuName       db  'MainMenu',0
szNull         db  0

;Insert between
;++++ .data +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
TextC01        db  'New',0
TextC02        db  'Open',0
TextC03        db  'Save',0
TextC04        db  'Save All',0
TextC05        db  'Cut',0
TextC06        db  'Copy',0
TextC07        db  'Paste',0
TextC08        db  'Delete',0
TextC09        db  'Undo',0
TextC10        db  'Redo',0
TextC11        db  'Find',0
TextC12        db  'FindN',0
TextC13        db  'FindP',0
TextC14        db  'Rep',0
TextC15        db  'MultiI',0
TextC16        db  'Exit',0
szTextC        dd  TextC01,TextC02,TextC03,TextC04,TextC05,TextC06,
                   TextC07,TextC08,TextC09,TextC10,TextC11,TextC12,
                   TextC13,TextC14,TextC15,TextC16

szSpace        db  ' ',0
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

szError1       db  'The RICHED20.DLL was not found!',0
.data?
hInst          dd  ?
CommandLine    dd  ?
MainExit       dd  ?
hWnd           dd  ?
hREdDll        dd  ?
hREdit         dd  ?
hSMenu         dd  ?
lpRichEdit     dd  ?
hFont          dd  ?
FontName       db  64  dup(?)
hWndStat       dd  ?
sbParts        dd  4   dup(?)
MenuCnt        dd  ?

;Insert between
;++++ .data? ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
hWndTool       dd  ?
hImageList     dd  ?

LeftOn         dd  ?
TopOn          dd  ?
RightOn        dd  ?
BottomOn       dd  ?
TBLeft         dd  ?
TBTop          dd  ?
TBWth          dd  ?
TBHgt          dd  ?

SavID          dd  ?
szTextA        db  32  dup(?)

tbi            TBBUTTONINFO <>
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

;---------- [Structures] ----------

.code

;===================================================
; Program initialization section
;===================================================
start:
      INVOKE     GetModuleHandle, NULL
         mov     hInst, eax
      INVOKE     GetCommandLine
         mov     CommandLine, eax

        call     InitCommonControls
      INVOKE     LoadLibrary, addr RichEdDLL ; Load the Riched20.dll
         mov     hREdDll, eax
      .if !eax
         INVOKE     MessageBox, NULL, addr szError1, addr AppName, MB_OK or MB_ICONERROR
            jmp     NoGo
      .endif

      INVOKE     WinMain, hInst ,NULL, CommandLine, SW_SHOWDEFAULT
         mov     MainExit, eax
      INVOKE     FreeLibrary, hREdDll

NoGo:
      INVOKE     ExitProcess, MainExit

;===================================================
; WinMain procedure
;===================================================
WinMain proc  uses ebx  hinst:DWORD, hPrevInst, CmdLine, CmdShow
LOCAL    wc:WNDCLASSEX
LOCAL    msg:MSG

         mov     wc.cbSize, sizeof WNDCLASSEX
         mov     wc.style, CS_HREDRAW or CS_VREDRAW
         mov     wc.lpfnWndProc, offset WndProc
         mov     wc.cbClsExtra, NULL
         mov     wc.cbWndExtra, NULL
        push     hInst
         pop     wc.hInstance
         mov     wc.hbrBackground, COLOR_BTNFACE+1
         mov     wc.lpszMenuName, offset MenuName
         mov     wc.lpszClassName, offset ClassName
      INVOKE     LoadIcon, NULL, IDI_APPLICATION
         mov     wc.hIcon, eax
         mov     wc.hIconSm, eax
      INVOKE     LoadCursor, NULL, IDC_ARROW
         mov     wc.hCursor, eax
      INVOKE     RegisterClassEx, addr wc

;---------- [Center the window] ----------
      INVOKE     GetSystemMetrics, SM_CXSCREEN
         sub     eax, 350
         shr     eax, 1
        push     eax
      INVOKE     GetSystemMetrics, SM_CYSCREEN
         sub     eax, 300
         shr     eax, 1
         pop     ebx

;---------- [Create the Main Window] ----------
      INVOKE     CreateWindowEx, WS_EX_CLIENTEDGE, addr ClassName,\
                 addr AppName, WS_OVERLAPPEDWINDOW,\
                 ebx, eax, 350, 300, NULL, NULL, hInst, NULL
         mov     hWnd, eax

      INVOKE     ShowWindow, hWnd, SW_SHOWNORMAL
      INVOKE     UpdateWindow, hWnd

;---------- [Message loop] ----------
      .while TRUE
         INVOKE     GetMessage, addr msg, NULL, 0, 0
            .break .if (!eax)
            INVOKE     TranslateMessage, addr msg
            INVOKE     DispatchMessage, addr msg
      .endw
         mov     eax, msg.wParam
         ret
WinMain endp

;===================================================
; WinProc procedure
;===================================================
WndProc proc  uses ebx  hwnd:DWORD, wMsg, wParam, lParam
LOCAL    rect:RECT
LOCAL    lf:LOGFONT
LOCAL    charF:CHARFORMAT2

;Insert between
;++++ Locals ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
LOCAL    tbb:TBBUTTON
LOCAL    tbab:TBADDBITMAP
LOCAL    bSize:DWORD, hTbBmp, ID, Cnt, Len, Incr, xPos, yPos, WWth, WHgt
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
LOCAL    szBuff[64]:BYTE
;---------- [Create the Control(s) and one time stuff] ----------
      .if wMsg == WM_CREATE

;---------- [Create the status bar window] ----------
         INVOKE     CreateWindowEx, 0, addr StatClass, 0,\
                    WS_CHILD or WS_BORDER or WS_VISIBLE or SBS_SIZEGRIP,\
                    0, 0, 0, 0, hwnd, 0, hInst, 0  
         .if !eax
;Do message
               jmp     Ret0
         .endif
            mov     hWndStat, eax

;Insert between
;++++ Toolbar code ++++++++++++++++++++++++++++++++++++++++++++++++++++
;---------- [Create the Toolbar Window] ----------
         INVOKE     CreateWindowEx, 0, addr ToolClass, 0,\
                    WS_CHILD or WS_VISIBLE or WS_BORDER or CCS_TOP or \
                    CCS_NORESIZE or CCS_ADJUSTABLE or TBSTYLE_BUTTON or TBSTYLE_TOOLTIPS or \
                    TBSTYLE_FLAT,\
                    0, -2, 1200, 26, hwnd, 0, hInst, 0
            mov     hWndTool, eax

;---------- [Create the ImageList] ----------
         INVOKE     ImageList_Create, 16, 16, ILC_COLOR32, 16, 0
            mov     hImageList, eax

;---------- [Load The Bitmaps] ----------
            mov     ID, 701           ; Bitmap ID
            mov     Cnt, 16
         .while (Cnt)
            INVOKE     LoadImage, hInst, ID, IMAGE_BITMAP, 16, 16, LR_DEFAULTCOLOR
            INVOKE     ChgBmpColor, eax
               mov     hTbBmp, eax
            INVOKE     ImageList_Add, hImageList, hTbBmp, NULL
            INVOKE     DeleteObject, hTbBmp
               inc     ID
               dec     Cnt
         .endw

         INVOKE     SendMessage, hWndTool, TB_BUTTONSTRUCTSIZE, sizeof TBBUTTON, 0
         INVOKE     SendMessage, hWndTool, TB_SETIMAGELIST, 0, hImageList

;---------- [Size the Bitmap and Button] ----------
            mov     ecx, 16  ; loword = bitmap Width
            mov     eax, 16  ; hiword = bitmap Height
            shl     eax, 16
            mov     ax, cx
            mov     bSize, eax
         INVOKE     SendMessage, hWndTool, TB_SETBITMAPSIZE, 0, bSize
            mov     ecx, 23  ; loword = button Width
            mov     eax, 22  ; hiword = button Height
            shl     ecx, 16
            mov     cx, ax
         INVOKE     SendMessage, hWndTool, TB_SETBUTTONSIZE, 0, ecx

;---------- [Create the Toolbar structures] ----------
         TBButt     hWndTool, 0,IDM_NEW,0
         TBButt     hWndTool, 1,IDM_OPEN,0
         TBButt     hWndTool, 2,IDM_SAVE,0
          TBSep     hWndTool
         TBButt     hWndTool, 4,IDM_CUT,0
         TBButt     hWndTool, 5,IDM_COPY,0
         TBButt     hWndTool, 6,IDM_PASTE,0
         TBButt     hWndTool, 7,IDM_DELETE,0
          TBSep     hWndTool
         TBButt     hWndTool, 10,IDM_FIND,0
         TBButt     hWndTool, 11,IDM_FINDNEXT,0
         TBButt     hWndTool, 12,IDM_FINDPREV,0
         TBButt     hWndTool, 13,IDM_REPLACE,0
          TBSep     hWndTool
         TBButt     hWndTool, 15,IDM_EXIT,0
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

;---------- [Create the Edit Window] ----------
         INVOKE     CreateWindowEx, NULL, addr RichEdit, NULL,\
                    WS_CHILD or WS_VISIBLE or WS_BORDER or ES_MULTILINE or\
                    ES_NOHIDESEL or ES_SAVESEL or ES_SELECTIONBAR or\
                    WS_HSCROLL or ES_AUTOHSCROLL or\
                    WS_VSCROLL or ES_AUTOVSCROLL,\
                    0, 0, 0, 0, hwnd, 4444, hInst, NULL
         .if !eax
;Do message
               jmp     Ret0
         .endif
            mov     hREdit, eax

         INVOKE     SendMessage, hREdit, EM_EXLIMITTEXT, 0, 4000000
         INVOKE     SetFocus, hREdit

;---------- [Control window subclassed] ----------
         INVOKE     SetWindowLong, hREdit, GWL_WNDPROC, RichEditProc
            mov     lpRichEdit, eax

         INVOKE     LoadMenu, hInst, addr PopupMenu   
         INVOKE     GetSubMenu, eax, 0
            mov     hSMenu, eax

;---------- [Get the character format] ----------
            mov     charF.cbSize, sizeof charF
         INVOKE     SendMessage, hREdit, EM_GETCHARFORMAT, TRUE, addr charF
            mov     eax, FontW
            mov     charF.wWeight, ax   
         INVOKE     lstrcpy, addr FontName, addr FontNameCN

         INVOKE     RtlZeroMemory, addr lf, sizeof lf
         INVOKE     lstrcpy, addr lf.lfFaceName, addr FontName
           push     FontHeight
            pop     lf.lfHeight

⌨️ 快捷键说明

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