📄 popup.asm
字号:
; #########################################################################
.386
.model flat, stdcall
option casemap :none ; case sensitive
; #########################################################################
include \masm32\include\windows.inc
include \masm32\include\gdi32.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\gdi32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
; #########################################################################
;=============
; Local macros
;=============
szText MACRO Name, Text:VARARG
LOCAL lbl
jmp lbl
Name db Text,0
lbl:
ENDM
m2m MACRO M1, M2
push M2
pop M1
ENDM
return MACRO arg
mov eax, arg
ret
ENDM
;=================
; Local prototypes
;=================
WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
TopXY PROTO :DWORD,:DWORD
.data
szDisplayName db "Popup ListBox",0
CommandLine dd 0
hWnd dd 0
hInstance dd 0
lpfnWndProc dd 0
.code
start:
invoke GetModuleHandle, NULL
mov hInstance, eax
invoke GetCommandLine
mov CommandLine, eax
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 msg :MSG
LOCAL Wwd :DWORD
LOCAL Wht :DWORD
LOCAL Wtx :DWORD
LOCAL Wty :DWORD
mov Wwd, 150
mov Wht, 150
invoke GetSystemMetrics,SM_CXSCREEN
invoke TopXY,Wwd,eax
mov Wtx, eax
invoke GetSystemMetrics,SM_CYSCREEN
invoke TopXY,Wht,eax
mov Wty, eax
szText szClassName,"LISTBOX"
invoke CreateWindowEx,WS_EX_PALETTEWINDOW or WS_EX_CLIENTEDGE,
ADDR szClassName,
ADDR szDisplayName,
WS_OVERLAPPEDWINDOW or WS_VSCROLL or \
LBS_HASSTRINGS or LBS_NOINTEGRALHEIGHT or \
LBS_DISABLENOSCROLL, \
Wtx,Wty,Wwd,Wht,
NULL,NULL,
hInst,NULL
mov hWnd,eax
invoke SetWindowLong,hWnd,GWL_WNDPROC,ADDR WndProc
mov lpfnWndProc, eax
invoke GetStockObject,ANSI_FIXED_FONT
invoke SendMessage,hWnd,WM_SETFONT,eax,0
jmp @123
item1 db "This is item 1",0
item2 db "This is item 2",0
item3 db "This is item 3",0
item4 db "This is item 4",0
item5 db "This is item 5",0
item6 db "This is item 6",0
item7 db "This is item 7",0
item8 db "This is item 8",0
item9 db "This is item 9",0
item0 db "This is item 0",0
@123:
invoke SendMessage,hWnd,LB_ADDSTRING,0,ADDR item1
invoke SendMessage,hWnd,LB_ADDSTRING,0,ADDR item2
invoke SendMessage,hWnd,LB_ADDSTRING,0,ADDR item3
invoke SendMessage,hWnd,LB_ADDSTRING,0,ADDR item4
invoke SendMessage,hWnd,LB_ADDSTRING,0,ADDR item5
invoke SendMessage,hWnd,LB_ADDSTRING,0,ADDR item6
invoke SendMessage,hWnd,LB_ADDSTRING,0,ADDR item7
invoke SendMessage,hWnd,LB_ADDSTRING,0,ADDR item8
invoke SendMessage,hWnd,LB_ADDSTRING,0,ADDR item9
invoke SendMessage,hWnd,LB_ADDSTRING,0,ADDR item0
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
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
.if uMsg == WM_CLOSE
.elseif uMsg == WM_DESTROY
invoke PostQuitMessage,NULL
return 0
.endif
invoke CallWindowProc,lpfnWndProc,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
; ########################################################################
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -