Hi, seasea!
asm-file
; GUI #
include win64a.inc
IDM_SAYHELLO equ 0
IDM_GETTEXT equ 1
IDM_CLEAR equ 2
IDM_EXIT equ 3
IDC_EDIT equ 0
IDC_BUTTON equ 1
IDC_EXIT equ 2
IDC_MENU equ 100
IDC_DIALOG equ 200
;-----------------------------------------
.code
WinMain proc
local hMem:QWORD
invoke GlobalAlloc,GMEM_FIXED or GMEM_ZEROINIT,1024 ; memory buffer size
mov hMem,rax; hDialogTemplate
mov edi,eax
mov esi,offset temp
mov ecx,len/8
rep movsq
;mov [rsp+20h],rcx; dwInitParam=0
mov r9d,offset DialogFunc
invoke DialogBoxIndirectParam,IMAGE_BASE,eax,0,,0
invoke GlobalFree,hMem
leave
retn
WinMain endp
DialogFunc proc hDlg:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
size_of_buffer equ 96
local buffer[size_of_buffer]:BYTE
cmp edx,WM_CLOSE
je wmCLOSE
cmp edx,WM_INITDIALOG
je wmINITDIALOG
cmp edx,WM_COMMAND
jne wmBYE
wmCOMMAND:movzx eax,r8w ;movzx eax,word ptr wParam
or r9,r9 ;cmp lParam,0
jnz @f
jmp [menu_handlers+rax*8]
@@: dec eax ;cmp eax,IDC_BUTTON=1
jne @f
SAYHELLO:mov r8d,offset expTxt
jmp @0
@@: dec eax ;cmp eax,IDC_EXIT=2
jne wmBYE
invoke SendMessage,,WM_CLOSE,0,0
jmp wmBYE
wmINITDIALOG:invoke GetDlgItem,,0
invoke SetFocus,eax
jmp wmBYE
CLEAR:xor r8d,r8d
@0: invoke SetDlgItemText,,0
jmp wmBYE
GETTEXT:lea r8d,buffer
invoke GetDlgItemText,,0,,size_of_buffer
mov r8d,offset AppName
lea edx,buffer
invoke MessageBox,0,,,MB_OK
jmp wmBYE
wmCLOSE:invoke EndDialog,,0
wmBYE:xor eax,eax
leave
retn
menu_handlers dq SAYHELLO,GETTEXT,CLEAR,wmCLOSE
DialogFunc endp
.data
expTxt db "Wow! I'm in an edit box now",0
AppName db 'Our First Dialog Box',0
align 16
temp:
dd DS_CENTER or WS_CAPTION or WS_MINIMIZEBOX or WS_SYSMENU \
or WS_VISIBLE or WS_OVERLAPPED or DS_MODALFRAME or DS_3DLOOK,0
dw 3,10,10,205,60,-1,IDC_MENU,0
du <Tutorial 10g: DialogBoxIndirectParam+DlgProc>
dw 0
dd WS_VISIBLE or WS_CHILD or ES_LEFT or ES_AUTOHSCROLL or WS_BORDER or WS_TABSTOP,0
dw 15,17,111,13,IDC_EDIT, -1,81h
dw 0,0,0
dd WS_VISIBLE or WS_CHILD or WS_TABSTOP or BS_DEFPUSHBUTTON,0
dw 141,10,52,13,IDC_BUTTON,-1,80h
du <Say Hello>
dw 0
dd WS_VISIBLE or WS_CHILD or WS_TABSTOP,0
dw 141,26,52,13,IDC_EXIT, -1,80h
du <E&xit>
dw 0
len = $ - temp
end
rc-file#include "resource.h"
#define IDM_SAYHELLO 0
#define IDM_GETTEXT 1
#define IDM_CLEAR 2
#define IDM_EXIT 3
#define IDC_EDIT 0
#define IDC_BUTTON 1
#define IDC_EXIT 2
#define IDC_MENU 100
#define IDC_DIALOG 200
IDC_MENU MENU
BEGIN
POPUP "Test Controls"
BEGIN
MENUITEM "Say Hello",IDM_SAYHELLO
MENUITEM "Get Text",IDM_GETTEXT
MENUITEM "Clear Edit Box",IDM_CLEAR
MENUITEM SEPARATOR
MENUITEM "E&xit",IDM_EXIT
END
END