hi,
this seems to work:
;============================================
; -- Trackbar tests (messages, etc.) --
;
;============================================
include \masm32\include\masm32rt.inc
;============================================
; Defines, macros, prototypes, etc.
;============================================
WinMain PROTO :DWORD
$mainWindowWidth EQU 500
$mainWindowHeight EQU 300
$X EQU 100
$Y EQU 100
$Width EQU 150
$Height EQU 40
;===== Window styles: =====
$mainWinStyles EQU WS_OVERLAPPEDWINDOW OR WS_CLIPCHILDREN OR WS_VISIBLE
$trackbarStyles EQU TBS_AUTOTICKS OR TBS_BOTTOM OR TBS_HORZ OR WS_CHILD OR WS_VISIBLE
;===== Window background colors: =====
$bkRED EQU 254
$bkGRN EQU 243
$bkBLUE EQU 199
$BkColor EQU $bkRED OR ($bkGRN SHL 8) OR ($bkBLUE SHL 16)
;============================================
; HERE BE DATA
;============================================
.data
InstanceHandle HWND ?
MainWinHandle HWND ?
BackgroundBrush HBRUSH ?
MainClassName DB "test", 0
TrackbarClassName DB "msctls_trackbar32", 0
MainTitleText DB "Trackbar Test", 0
;============================================
; CODE LIVES HERE
;============================================
.code
start:
INVOKE GetModuleHandle, NULL
MOV InstanceHandle, EAX
INVOKE WinMain, EAX
INVOKE ExitProcess, EAX
SubClass proc uses esi edi ebx hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
mov edi,rv(GetProp,hWnd,"pOrgWndProc")
.if uMsg == WM_SETFOCUS
invoke SendMessage,hWnd,WM_UPDATEUISTATE,UIS_SET OR (UISF_HIDEFOCUS SHL 16),0
.endif
invoke CallWindowProc,edi,hWnd,uMsg,wParam,lParam
ret
SubClass endp
;====================================================================
; Mainline proc
;====================================================================
WinMain PROC hInst:DWORD
LOCAL wc:WNDCLASSEX, msg:MSG, wX:DWORD, wY:DWORD
; Create brush to set background color:
INVOKE CreateSolidBrush, $BkColor
MOV BackgroundBrush, EAX
; Register class for parent window:
MOV wc.cbSize, SIZEOF WNDCLASSEX
MOV wc.style, CS_HREDRAW or CS_VREDRAW or CS_BYTEALIGNWINDOW
MOV wc.lpfnWndProc, OFFSET MainWindowProc
MOV wc.cbClsExtra, NULL
MOV wc.cbWndExtra, NULL
MOV EAX, hInst
MOV wc.hInstance, EAX
MOV EAX, BackgroundBrush
MOV wc.hbrBackground, EAX
MOV wc.lpszMenuName, NULL
MOV wc.lpszClassName, OFFSET MainClassName
MOV wc.hIcon, NULL
INVOKE LoadCursor, NULL, IDC_ARROW
MOV wc.hCursor, EAX
MOV wc.hIconSm, 0
INVOKE RegisterClassEx, ADDR wc
INVOKE GetSystemMetrics, SM_CXSCREEN
MOV EDX, $mainWindowWidth
CALL CenterDim
MOV wX, EAX
INVOKE GetSystemMetrics, SM_CYSCREEN
MOV EDX, $mainWindowHeight
CALL CenterDim
MOV wY, EAX
; Create our main window:
INVOKE CreateWindowEx, WS_EX_OVERLAPPEDWINDOW, ADDR MainClassName,
ADDR MainTitleText, $mainWinStyles, wX, wY, $mainWindowWidth,
$mainWindowHeight, NULL, NULL, hInst, NULL
MOV MainWinHandle, EAX
; Create trackbar:
INVOKE CreateWindowEx, WS_EX_LEFT, ADDR TrackbarClassName,
NULL, $trackbarStyles, $X, $Y, $Width,
$Height, MainWinHandle, NULL, hInst, NULL
mov edi,eax
fn SetProp,edi,"pOrgWndProc",rv(GetWindowLong,edi,GWL_WNDPROC)
invoke SetWindowLong,edi,GWL_WNDPROC,ADDR SubClass
;============= Message loop ===================
msgloop:
INVOKE GetMessage, ADDR msg, NULL, 0, 0
OR EAX, EAX ;EAX = 0 = exit
JZ ex
INVOKE TranslateMessage, ADDR msg
INVOKE DispatchMessage, ADDR msg
JMP msgloop
ex: MOV EAX, msg.wParam
RET
;===== This code doesn't actually need to be executed: =====
INVOKE InitCommonControls
WinMain ENDP
;====================================================================
; Main Window Proc
;====================================================================
MainWindowProc PROC hWin:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD
MOV EAX, uMsg
CMP EAX, WM_CTLCOLORSTATIC
JE do_bkgnd
CMP EAX, WM_CLOSE
JE do_close
dodefault:
; use DefWindowProc for all other messages:
INVOKE DefWindowProc, hWin, uMsg, wParam, lParam
RET
; All we need to do here (on receipt of a WM_CTLCOLORSTATIC message)
; is return a handle to the desired brush for the background:
do_bkgnd:
MOV EAX, BackgroundBrush
RET
do_close:
INVOKE PostQuitMessage, NULL
MOV EAX, TRUE
RET
MainWindowProc ENDP
;====================================================================
; CenterDim
;
; Returns half screen dimension (X or Y) minus half window dimension
;
; On entry,
; EAX = screen dimension
; EDX = window dimension
;
; Returns:
; sdim/2 - wdim/2
;====================================================================
CenterDim PROC
SHR EAX, 1 ;divide screen dimension by 2
SHR EDX, 1 ;divide window dimension by 2
SUB EAX, EDX
RET ;Return w/# in EAX
CenterDim ENDP
END start