📄 winmain.asm
字号:
DEBUG equ 1
include WinMain.inc
.code
if DEBUG
include \masm32\debug\Debug.asm
endif
include TabAdd.asm
include kFormatDateTime.asm
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
LOCAL hwnd:HWND
LOCAL ScreenX :DWORD
LOCAL ScreenY_tmp :DWORD
LOCAL ScreenY :DWORD
LOCAL hDC :HWND
LOCAL stRectWin:RECT
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 hInstance
pop wc.hInstance
mov wc.hbrBackground,COLOR_BTNFACE+1
mov wc.lpszMenuName,NULL
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
;**********************************************************
invoke CreateDC, ADDR szDisplay, NULL, NULL, NULL
mov hDC,eax
invoke GetDeviceCaps, hDC, HORZRES
mov ScreenX, eax
invoke GetDeviceCaps, hDC, VERTRES
mov ScreenY,eax
invoke DeleteDC, hDC
;**********************************************************
INVOKE CreateWindowEx,NULL,ADDR ClassName,ADDR AppNameMain,\
WS_POPUP or WS_VISIBLE,\
0, 0, ScreenX,ScreenY,NULL,NULL,\
hInst,NULL
mov hwnd,eax
invoke ShowWindow, hwnd,SW_SHOWNORMAL
invoke UpdateWindow, hwnd
.WHILE TRUE
invoke GetMessage, ADDR msg,NULL,0,0
.BREAK .IF (!eax)
invoke TranslateAccelerator,hwnd,hAccel,ADDR msg
.IF (!eax)
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
.endif
.ENDW
mov eax,msg.wParam
ret
WinMain endp
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
LOCAL @stRectDeskTop :RECT
LOCAL tci:TCITEM
.IF uMsg==WM_DESTROY
invoke KillTimer, hWnd, 1
invoke PostQuitMessage,NULL
.ELSEIF uMsg==WM_CREATE
invoke SetTimer,hWnd,1,1000,NULL ;设置timer
invoke CreateWindowEx,NULL, ADDR StaticClassName,addr szTittleLabel,\
WS_VISIBLE or WS_CHILD or BS_LEFTTEXT ,0,0,640,25,\
hWnd,ID_Tittle_Lable,hInstance,NULL
invoke CreateWindowEx,NULL, ADDR StaticClassName,addr szTimeFormat,\
WS_VISIBLE or WS_CHILD or BS_LEFTTEXT ,0,460,640,20,\
hWnd,ID_Time_Format,hInstance,NULL
mov hTimeFormat,eax
;invoke BmpButton,hWnd,300,400,203,204,600
invoke CreateWindowEx,0,CTXT("AniGIF"),0,WS_VISIBLE or WS_CHILD or WAGS_AUTOSIZE,700,10,10,10,hWnd,1000,hInstance,0
invoke SendDlgItemMessage,hWnd,1000,WAGM_LOADGIFFROMFILE,0,CTXT(".\test.gif")
invoke GetSysColor,COLOR_BTNFACE
invoke SendDlgItemMessage,hWnd,1000,WAGM_SETBKCOLOR,0,eax
szText bTxt1,"退出程序"
invoke PushButton,ADDR bTxt1,hWnd,120,420,150,25,500 ; 数字意义 按钮位置, 按钮位置,按钮长,按钮高 ,按钮消息号
;例如 .if wParam == 500
invoke CreateWindowEx,NULL, ADDR ButtonClassName,addr RadioButtonText2,\
WS_VISIBLE or WS_CHILD or BS_AUTORADIOBUTTON or BS_TOP ,\
150,495,75,20,hWnd,ID_BUTTON_RADIO1,hInstance,NULL
mov hwndButtonRadio,eax
invoke CreateWindowEx,WS_EX_CLIENTEDGE,offset szSysTabClass,NULL,\
LVS_REPORT or WS_CHILD or WS_VISIBLE or WS_BORDER,\
10,30,530,350,\
hWnd,IDC_SysTab,hInstance,NULL
mov hTab,eax
;----------------- [Fill the Tab Control Item structure and insert the item] --------------------
mov tci.imask, TCIF_TEXT or TCIF_PARAM ; Text
mov tci.lpReserved1, 0 ; Reserved
mov tci.lpReserved2, 0 ; Reserved
mov tci.pszText, offset szTabLabel1 ; pointer to string containing tab text
mov tci.cchTextMax, sizeof szTabLabel1 ; Size of szTabLabel1
mov tci.iImage, -1 ; Index to tab control's image
mov tci.lParam, 0 ; Extra info
INVOKE SendMessage, hTab, TCM_INSERTITEM, 0, addr tci
mov tci.pszText,offset szTabLabel2
mov tci.cchTextMax, sizeof szTabLabel2
invoke SendMessage,hTab,TCM_INSERTITEM,1,addr tci
mov tci.pszText,offset szTabLabel3
mov tci.cchTextMax, sizeof szTabLabel3
invoke SendMessage,hTab,TCM_INSERTITEM,2,addr tci
mov tci.pszText,offset szTabLabel4
mov tci.cchTextMax, sizeof szTabLabel4
invoke SendMessage,hTab,TCM_INSERTITEM,3,addr tci
; invoke SendMessage,hTab,TCM_SETCURSEL,eax,0
.ELSEIF uMsg == WM_TIMER
.IF wParam==1
invoke kFormatDateTime,addr szBuf,addr szTimeFormat,NULL
invoke SetWindowText,hTimeFormat,addr szBuf
invoke MessageBeep, 0
.endif
.ELSEIF uMsg == WM_COMMAND
.if wParam == 500
invoke SendMessage,hWnd,WM_DESTROY,0,0
.ENDIF
invoke SetFocus ,hWnd;测试成功,可以响应wm_char啦,必须放在最后!!!
.ELSEIF uMsg==WM_CHAR
invoke MessageBeep, 0
_Debug "显示寄存器或 double word 变量","EAX的值为",wParam
.ELSE
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.ENDIF
xor eax,eax
ret
WndProc endp
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -