Hi
A quick 64 bit interpretation of the two functions from BmpButton.asm, BmpButton proc
and its window procedure BmpButnProc proc.
Remember to replace the _UTF_16 macro with what ever string generation macro you use.
TITLE BmpButton in x64.
.code
;#############################################################################################################
BmpButton proc public hParent:qword, topX:dword, topY:dword, rnum1:dword, rnum2:DWORD, ID:DWORD
; parameters are,
; 1. Parent handle
; 2/3 top X & Y co-ordinates
; 4/5 resource ID numbers or identifiers for UP & DOWN bitmaps
; 6 ID number for control
local hButn1:qword
local hImage :qword
local hModule:qword
local wid:dword
local hgt:dword
local hBmpU:qword
local hBmpD:qword
local Rct:RECT
local wc:WNDCLASSEX
mov hParent, rcx
mov topX, edx
mov topY, r8d
mov rnum1, r9d
add rsp,-068h
and rsp,-10h
invoke GetModuleHandle, null
mov hModule, rax
invoke LoadBitmap, hModule, rnum1
mov hBmpU, rax
invoke LoadBitmap, hModule, rnum2
mov hBmpD, rax
_UTF_16 Bmp_Button_Class, "Bmp_Button_Class"
mov wc.cbSize, sizeof(WNDCLASSEX)
mov wc.style, CS_BYTEALIGNWINDOW
lea rax, BmpButnProc
mov wc.lpfnWndProc, rax
mov wc.cbClsExtra, null
mov wc.cbWndExtra, 16
mov rax, hModule
mov wc.hInstance, rax
mov wc.hbrBackground, COLOR_BTNFACE+1
mov wc.lpszMenuName, null
lea rax, Bmp_Button_Class
mov wc.lpszClassName, rax
mov wc.hIcon, null
invoke LoadCursor, null, IDC_ARROW
mov wc.hCursor, rax
mov wc.hIconSm, null
invoke RegisterClassEx, &wc
mov qword ptr[rsp+58h], null
mov rdx, hModule
mov qword ptr[rsp+50h], rdx
mov edx, ID
mov qword ptr[rsp+48h], rdx
mov rdx, hParent
mov qword ptr[rsp+40h], rdx
mov qword ptr[rsp+38h], 100
mov qword ptr[rsp+30h], 100
mov edx, topY
mov qword ptr[rsp+28h], rdx
mov edx, topX
mov qword ptr[rsp+20h], rdx
mov r9, WS_CHILD or WS_VISIBLE
mov r8, null
lea rdx, Bmp_Button_Class
mov rcx, WS_EX_TRANSPARENT
invoke CreateWindowEx
mov hButn1, rax
invoke SetWindowLong, hButn1, 0, hBmpU
invoke SetWindowLong, hButn1, 4, hBmpD
_UTF_16 ButnImageClass, "STATIC"
mov qword ptr[rsp+58h], null
mov rdx, hModule
mov qword ptr[rsp+50h], rdx
mov edx, ID
mov qword ptr[rsp+48h], rdx
mov rdx, hButn1
mov qword ptr[rsp+40h], rdx
mov qword ptr[rsp+38h], 0
mov qword ptr[rsp+30h], 0
mov qword ptr[rsp+28h], 0
mov qword ptr[rsp+20h], 0
mov r9, WS_CHILD or WS_VISIBLE or SS_BITMAP
mov r8, null
lea rdx, ButnImageClass
mov rcx, 0
invoke CreateWindowEx
mov hImage, rax
invoke SendMessage, hImage, STM_SETIMAGE, IMAGE_BITMAP, hBmpU
invoke GetWindowRect, hImage, &Rct
invoke SetWindowLong, hButn1, 8, hImage
mov eax, Rct.bottom
mov edx, Rct.top
sub eax, edx
mov hgt, eax
mov eax, Rct.right
mov edx, Rct.left
sub eax, edx
mov wid, eax
invoke SetWindowPos, hButn1, HWND_TOP, 0, 0, wid, hgt, SWP_NOMOVE
invoke ShowWindow, hButn1, SW_SHOW
mov rax, hButn1
ret
BmpButton endp
;#############################################################################################################
BmpButnProc proc hWin:qword, uMsg:qword, wParam:qword, lParam:qword
local hBmpU :qword
local hBmpD :qword
local hImage:qword
local hParent:qword
local ID:sdword
local ptX:dword
local ptY:dword
local bWid:dword
local bHgt:dword
local Rct:RECT
mov hWin, rcx
mov uMsg, rdx
mov wParam, r8
mov lParam, r9
add rsp,-38h
and rsp,-10h
.data
cFlag dd 0 ; a GLOBAL variable for the "clicked" setting
.code
cmp uMsg, WM_LBUTTONDOWN
jne @B0020
invoke GetWindowLong, hWin, 4
mov hBmpD, rax
invoke GetWindowLong, hWin, 8
mov hImage, rax
invoke SendMessage, hImage, STM_SETIMAGE, IMAGE_BITMAP, hBmpD
invoke SetCapture, hWin
mov cFlag, true
jmp @C0010
@B0020:
cmp uMsg, WM_LBUTTONUP
jne @C0010
cmp cFlag, false
jne @B0022
ret
@B0022:
mov cFlag, false
invoke GetWindowLong, hWin, 0
mov hBmpU, rax
invoke GetWindowLong, hWin, 8
mov hImage, rax
invoke SendMessage, hImage, STM_SETIMAGE, IMAGE_BITMAP, hBmpU
mov rax, lParam
cwde
mov ptX, eax
mov rax, lParam
rol eax, 16
cwde
mov ptY, eax
invoke GetWindowRect, hWin, &Rct
mov eax, Rct.right
mov edx, Rct.left
sub eax, edx
mov bWid, eax
mov eax, Rct.bottom
mov edx, Rct.top
sub eax, edx
mov bHgt, eax
; --------------------------------
; exclude button releases outside of the button
; rectangle from sending message back to parent
; --------------------------------
cmp ptX, 0
jle @B0040
cmp ptY, 0
jle @B0040
mov eax, bWid
cmp ptX, eax
jge @B0040
mov eax, bHgt
cmp ptY, eax
jge @B0040
invoke GetParent, hWin
mov hParent, rax
invoke GetDlgCtrlID, hWin
mov ID, eax
invoke SendMessage, hParent, WM_COMMAND, ID, hWin
@B0040:
invoke ReleaseCapture
@C0010:
invoke DefWindowProc, hWin, uMsg, wParam, lParam
ret
BmpButnProc endp
;#############################################################################################################