; ######################################################################### .386 .model flat, stdcall ; 32 bit memory model option casemap :none ; case sensitive include bmbutton.inc ; local includes for this file ; ######################################################################### .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 wc :WNDCLASSEX LOCAL msg :MSG LOCAL Wwd :DWORD LOCAL Wht :DWORD LOCAL Wtx :DWORD LOCAL Wty :DWORD ;================================================== ; Fill WNDCLASSEX structure with required variables ;================================================== invoke LoadIcon,hInst,1 ; icon ID mov hIcon, eax szText szClassName,"bmbtn_Class" mov wc.cbSize, sizeof WNDCLASSEX mov wc.style, CS_HREDRAW or CS_VREDRAW \ or CS_BYTEALIGNWINDOW mov wc.lpfnWndProc, offset WndProc mov wc.cbClsExtra, NULL mov wc.cbWndExtra, NULL m2m wc.hInstance, hInst mov wc.hbrBackground, COLOR_BTNFACE+1 mov wc.lpszMenuName, NULL mov wc.lpszClassName, offset szClassName m2m wc.hIcon, hIcon invoke LoadCursor,NULL,IDC_ARROW mov wc.hCursor, eax m2m wc.hIconSm, hIcon invoke RegisterClassEx, ADDR wc ;================================ ; Centre window at following size ;================================ mov Wwd, 250 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 invoke CreateWindowEx,WS_EX_LEFT, ADDR szClassName, ADDR szDisplayName, WS_OVERLAPPED or WS_SYSMENU, Wtx,Wty,Wwd,Wht, NULL,NULL, hInst,NULL mov hWnd,eax invoke LoadMenu,hInst,600 ; menu ID invoke SetMenu,hWnd,eax 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 LOCAL var :DWORD LOCAL caW :DWORD LOCAL caH :DWORD LOCAL Rct :RECT LOCAL hDC :DWORD LOCAL Ps :PAINTSTRUCT LOCAL buffer1[128]:BYTE ; these are two spare buffers LOCAL buffer2[128]:BYTE ; for text manipulation etc.. .if uMsg == WM_COMMAND .if wParam == 400 szText icoMsg1,"Single Icon Button" invoke MessageBox,hWin,ADDR icoMsg1, ADDR szDisplayName,MB_OK .elseif wParam == 401 szText icoMsg2,"Two Icon Button" invoke MessageBox,hWin,ADDR icoMsg2, ADDR szDisplayName,MB_OK .elseif wParam == 402 szText bmpMsg1,"Single Bitmap Button" invoke MessageBox,hWin,ADDR bmpMsg1, ADDR szDisplayName,MB_OK .elseif wParam == 403 szText bmpMsg2,"Two Bitmap Button" invoke MessageBox,hWin,ADDR bmpMsg2, ADDR szDisplayName,MB_OK .endif ;======== menu commands ======== .elseif uMsg == WM_CREATE invoke IconButton,hWin,20,20,36,36,400 mov hBtn1, eax invoke LoadIcon,hInstance,2 invoke SendMessage,hBtn1,BM_SETIMAGE,1,eax invoke IconButton,hWin,20,60,36,36,401 mov hBtn2, eax invoke SetWindowLong,hBtn2,GWL_WNDPROC,BtnProc mov lpBtnProc, eax invoke LoadIcon,hInstance,2 invoke SendMessage,hBtn2,BM_SETIMAGE,1,eax invoke LoadBitmap,hInstance,10 mov hBmp1, eax invoke SetBmpColor,hBmp1 mov hBmp1,eax invoke LoadBitmap,hInstance,11 mov hBmp2, eax invoke SetBmpColor,hBmp2 mov hBmp2,eax invoke BmpButton,hWin,120,20,100,36,402 mov hBtn3, eax invoke SendMessage,hBtn3,BM_SETIMAGE,0,hBmp1 invoke BmpButton,hWin,120,60,100,36,403 mov hBtn4, eax invoke SendMessage,hBtn4,BM_SETIMAGE,0,hBmp1 invoke SetWindowLong,hBtn4,GWL_WNDPROC,bmpProc mov lpfnbmpProc, eax .elseif uMsg == WM_SIZE .elseif uMsg == WM_PAINT invoke BeginPaint,hWin,ADDR Ps mov hDC, eax invoke Paint_Proc,hWin,hDC invoke EndPaint,hWin,ADDR Ps return 0 .elseif uMsg == WM_CLOSE .elseif uMsg == WM_DESTROY invoke PostQuitMessage,NULL return 0 .endif invoke DefWindowProc,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 ; ######################################################################### Paint_Proc proc hWin:DWORD, hDC:DWORD LOCAL btn_hi :DWORD LOCAL btn_lo :DWORD LOCAL Rct :RECT invoke GetSysColor,COLOR_BTNHIGHLIGHT mov btn_hi, eax invoke GetSysColor,COLOR_BTNSHADOW mov btn_lo, eax return 0 Paint_Proc endp ; ######################################################################## IconButton proc hParent:DWORD,a:DWORD,b:DWORD,wd:DWORD,ht:DWORD,ID:DWORD ; IconButton PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD ; invoke IconButton,hWnd,20,20,100,25,500 szText icoBtnCl,"BUTTON" szText blnk1,0 invoke CreateWindowEx,0, ADDR icoBtnCl,ADDR blnk1, WS_CHILD or WS_VISIBLE or BS_ICON, a,b,wd,ht,hParent,ID, hInstance,NULL ret IconButton endp ; ######################################################################## BmpButton proc hParent:DWORD,a:DWORD,b:DWORD,wd:DWORD,ht:DWORD,ID:DWORD ; BmpButton PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD ; invoke BmpButton,hWnd,20,20,100,25,500 szText bmpBtnCl,"BUTTON" szText blnk2,0 invoke CreateWindowEx,0, ADDR bmpBtnCl,ADDR blnk2, WS_CHILD or WS_VISIBLE or BS_BITMAP, a,b,wd,ht,hParent,ID, hInstance,NULL ret BmpButton endp ; ######################################################################### BtnProc proc hCtl :DWORD, uMsg :DWORD, wParam :DWORD, lParam :DWORD .if uMsg == WM_KEYDOWN jmp lbd .elseif uMsg == WM_KEYUP jmp lbu .elseif uMsg == WM_LBUTTONDOWN lbd: invoke LoadIcon,hInstance,3 invoke SendMessage,hBtn2,BM_SETIMAGE,1,eax .elseif uMsg == WM_LBUTTONUP lbu: invoke LoadIcon,hInstance,2 invoke SendMessage,hBtn2,BM_SETIMAGE,1,eax .endif invoke CallWindowProc,lpBtnProc,hCtl,uMsg,wParam,lParam ret BtnProc endp ; ######################################################################### SetBmpColor proc hBitmap:DWORD LOCAL mDC :DWORD LOCAL hBrush :DWORD LOCAL hOldBmp :DWORD LOCAL hReturn :DWORD LOCAL hOldBrush :DWORD invoke CreateCompatibleDC,NULL mov mDC,eax invoke SelectObject,mDC,hBitmap mov hOldBmp,eax invoke GetSysColor,COLOR_BTNFACE invoke CreateSolidBrush,eax mov hBrush,eax invoke SelectObject,mDC,hBrush mov hOldBrush,eax invoke GetPixel,mDC,1,1 invoke ExtFloodFill,mDC,1,1,eax,FLOODFILLSURFACE invoke SelectObject,mDC,hOldBrush invoke DeleteObject,hBrush invoke SelectObject,mDC,hBitmap mov hReturn,eax invoke DeleteDC,mDC mov eax,hReturn ret SetBmpColor endp ; ######################################################################### bmpProc proc hCtl :DWORD, uMsg :DWORD, wParam :DWORD, lParam :DWORD .if uMsg == WM_KEYDOWN jmp lbda .elseif uMsg == WM_KEYUP jmp lbua .elseif uMsg == WM_LBUTTONDOWN lbda: invoke SendMessage,hBtn4,BM_SETIMAGE,0,hBmp2 .elseif uMsg == WM_LBUTTONUP lbua: invoke SendMessage,hBtn4,BM_SETIMAGE,0,hBmp1 .endif invoke CallWindowProc,lpfnbmpProc,hCtl,uMsg,wParam,lParam ret bmpProc endp ; ######################################################################### end start