home *** CD-ROM | disk | FTP | other *** search
/ Reverse Code Engineering RCE CD +sandman 2000 / ReverseCodeEngineeringRceCdsandman2000.iso / RCE / Hutch / DOWNLOAD / Example1.exe / BMBUTTON / BMBUTTON.ASM next >
Encoding:
Assembly Source File  |  1999-05-21  |  9.7 KB  |  380 lines

  1. ; #########################################################################
  2.  
  3.       .386
  4.       .model flat, stdcall  ; 32 bit memory model
  5.       option casemap :none  ; case sensitive
  6.  
  7.       include bmbutton.inc     ; local includes for this file
  8.  
  9. ; #########################################################################
  10.  
  11. .code
  12.  
  13. start:
  14.       invoke GetModuleHandle, NULL
  15.       mov hInstance, eax
  16.  
  17.       invoke GetCommandLine
  18.       mov CommandLine, eax
  19.  
  20.       invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT
  21.       invoke ExitProcess,eax
  22.  
  23. ; #########################################################################
  24.  
  25. WinMain proc hInst     :DWORD,
  26.              hPrevInst :DWORD,
  27.              CmdLine   :DWORD,
  28.              CmdShow   :DWORD
  29.  
  30.       ;====================
  31.       ; Put LOCALs on stack
  32.       ;====================
  33.  
  34.       LOCAL wc   :WNDCLASSEX
  35.       LOCAL msg  :MSG
  36.       LOCAL Wwd  :DWORD
  37.       LOCAL Wht  :DWORD
  38.       LOCAL Wtx  :DWORD
  39.       LOCAL Wty  :DWORD
  40.  
  41.       ;==================================================
  42.       ; Fill WNDCLASSEX structure with required variables
  43.       ;==================================================
  44.  
  45.       invoke LoadIcon,hInst,1    ; icon ID
  46.       mov hIcon, eax
  47.  
  48.       szText szClassName,"bmbtn_Class"
  49.  
  50.       mov wc.cbSize,         sizeof WNDCLASSEX
  51.       mov wc.style,          CS_HREDRAW or CS_VREDRAW \
  52.                              or CS_BYTEALIGNWINDOW
  53.       mov wc.lpfnWndProc,    offset WndProc
  54.       mov wc.cbClsExtra,     NULL
  55.       mov wc.cbWndExtra,     NULL
  56.       m2m wc.hInstance,      hInst
  57.       mov wc.hbrBackground,  COLOR_BTNFACE+1
  58.       mov wc.lpszMenuName,   NULL
  59.       mov wc.lpszClassName,  offset szClassName
  60.       m2m wc.hIcon,          hIcon
  61.         invoke LoadCursor,NULL,IDC_ARROW
  62.       mov wc.hCursor,        eax
  63.       m2m wc.hIconSm,        hIcon
  64.  
  65.       invoke RegisterClassEx, ADDR wc
  66.  
  67.       ;================================
  68.       ; Centre window at following size
  69.       ;================================
  70.  
  71.       mov Wwd, 250
  72.       mov Wht, 150
  73.  
  74.       invoke GetSystemMetrics,SM_CXSCREEN
  75.       invoke TopXY,Wwd,eax
  76.       mov Wtx, eax
  77.  
  78.       invoke GetSystemMetrics,SM_CYSCREEN
  79.       invoke TopXY,Wht,eax
  80.       mov Wty, eax
  81.  
  82.       invoke CreateWindowEx,WS_EX_LEFT,
  83.                             ADDR szClassName,
  84.                             ADDR szDisplayName,
  85.                             WS_OVERLAPPED or WS_SYSMENU,
  86.                             Wtx,Wty,Wwd,Wht,
  87.                             NULL,NULL,
  88.                             hInst,NULL
  89.       mov   hWnd,eax
  90.  
  91.       invoke LoadMenu,hInst,600  ; menu ID
  92.       invoke SetMenu,hWnd,eax
  93.  
  94.       invoke ShowWindow,hWnd,SW_SHOWNORMAL
  95.       invoke UpdateWindow,hWnd
  96.  
  97.       ;===================================
  98.       ; Loop until PostQuitMessage is sent
  99.       ;===================================
  100.  
  101.     StartLoop:
  102.       invoke GetMessage,ADDR msg,NULL,0,0
  103.       cmp eax, 0
  104.       je ExitLoop
  105.       invoke TranslateMessage, ADDR msg
  106.       invoke DispatchMessage,  ADDR msg
  107.       jmp StartLoop
  108.     ExitLoop:
  109.  
  110.       return msg.wParam
  111.  
  112. WinMain endp
  113.  
  114. ; #########################################################################
  115.  
  116. WndProc proc hWin   :DWORD,
  117.              uMsg   :DWORD,
  118.              wParam :DWORD,
  119.              lParam :DWORD
  120.  
  121.     LOCAL var    :DWORD
  122.     LOCAL caW    :DWORD
  123.     LOCAL caH    :DWORD
  124.     LOCAL Rct    :RECT
  125.     LOCAL hDC    :DWORD
  126.     LOCAL Ps     :PAINTSTRUCT
  127.     LOCAL buffer1[128]:BYTE  ; these are two spare buffers
  128.     LOCAL buffer2[128]:BYTE  ; for text manipulation etc..
  129.  
  130.     .if uMsg == WM_COMMAND
  131.  
  132.         .if wParam == 400
  133.         szText icoMsg1,"Single Icon Button"
  134.             invoke MessageBox,hWin,ADDR icoMsg1,
  135.                               ADDR szDisplayName,MB_OK
  136.         .elseif wParam == 401
  137.         szText icoMsg2,"Two Icon Button"
  138.             invoke MessageBox,hWin,ADDR icoMsg2,
  139.                               ADDR szDisplayName,MB_OK
  140.  
  141.         .elseif wParam == 402
  142.         szText bmpMsg1,"Single Bitmap Button"
  143.             invoke MessageBox,hWin,ADDR bmpMsg1,
  144.                               ADDR szDisplayName,MB_OK
  145.  
  146.         .elseif wParam == 403
  147.         szText bmpMsg2,"Two Bitmap Button"
  148.             invoke MessageBox,hWin,ADDR bmpMsg2,
  149.                               ADDR szDisplayName,MB_OK
  150.  
  151.         .endif
  152.  
  153.     ;======== menu commands ========
  154.     .elseif uMsg == WM_CREATE
  155.         invoke IconButton,hWin,20,20,36,36,400
  156.         mov hBtn1, eax
  157.         invoke LoadIcon,hInstance,2
  158.         invoke SendMessage,hBtn1,BM_SETIMAGE,1,eax
  159.  
  160.         invoke IconButton,hWin,20,60,36,36,401
  161.         mov hBtn2, eax
  162.         invoke SetWindowLong,hBtn2,GWL_WNDPROC,BtnProc
  163.         mov lpBtnProc, eax
  164.  
  165.         invoke LoadIcon,hInstance,2
  166.         invoke SendMessage,hBtn2,BM_SETIMAGE,1,eax
  167.  
  168.         invoke LoadBitmap,hInstance,10
  169.         mov hBmp1, eax
  170.         invoke SetBmpColor,hBmp1
  171.         mov hBmp1,eax
  172.  
  173.         invoke LoadBitmap,hInstance,11
  174.         mov hBmp2, eax
  175.         invoke SetBmpColor,hBmp2
  176.         mov hBmp2,eax
  177.  
  178.         invoke BmpButton,hWin,120,20,100,36,402
  179.         mov hBtn3, eax
  180.         invoke SendMessage,hBtn3,BM_SETIMAGE,0,hBmp1
  181.  
  182.         invoke BmpButton,hWin,120,60,100,36,403
  183.         mov hBtn4, eax
  184.         invoke SendMessage,hBtn4,BM_SETIMAGE,0,hBmp1
  185.  
  186.         invoke SetWindowLong,hBtn4,GWL_WNDPROC,bmpProc
  187.         mov lpfnbmpProc, eax
  188.  
  189.  
  190.     .elseif uMsg == WM_SIZE
  191.  
  192.     .elseif uMsg == WM_PAINT
  193.         invoke BeginPaint,hWin,ADDR Ps
  194.           mov hDC, eax
  195.           invoke Paint_Proc,hWin,hDC
  196.         invoke EndPaint,hWin,ADDR Ps
  197.         return 0
  198.  
  199.     .elseif uMsg == WM_CLOSE
  200.  
  201.     .elseif uMsg == WM_DESTROY
  202.         invoke PostQuitMessage,NULL
  203.         return 0 
  204.     .endif
  205.  
  206.     invoke DefWindowProc,hWin,uMsg,wParam,lParam
  207.  
  208.     ret
  209.  
  210. WndProc endp
  211.  
  212. ; ########################################################################
  213.  
  214. TopXY proc wDim:DWORD, sDim:DWORD
  215.  
  216.     shr sDim, 1      ; divide screen dimension by 2
  217.     shr wDim, 1      ; divide window dimension by 2
  218.     mov eax, wDim    ; copy window dimension into eax
  219.     sub sDim, eax    ; sub half win dimension from half screen dimension
  220.  
  221.     return sDim
  222.  
  223. TopXY endp
  224.  
  225. ; #########################################################################
  226.  
  227. Paint_Proc proc hWin:DWORD, hDC:DWORD
  228.  
  229.     LOCAL btn_hi   :DWORD
  230.     LOCAL btn_lo   :DWORD
  231.     LOCAL Rct      :RECT
  232.  
  233.     invoke GetSysColor,COLOR_BTNHIGHLIGHT
  234.     mov btn_hi, eax
  235.  
  236.     invoke GetSysColor,COLOR_BTNSHADOW
  237.     mov btn_lo, eax
  238.  
  239.     return 0
  240.  
  241. Paint_Proc endp
  242.  
  243. ; ########################################################################
  244.  
  245. IconButton proc hParent:DWORD,a:DWORD,b:DWORD,wd:DWORD,ht:DWORD,ID:DWORD
  246.  
  247. ; IconButton PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD
  248. ; invoke IconButton,hWnd,20,20,100,25,500
  249.  
  250.     szText icoBtnCl,"BUTTON"
  251.     szText blnk1,0
  252.  
  253.     invoke CreateWindowEx,0,
  254.             ADDR icoBtnCl,ADDR blnk1,
  255.             WS_CHILD or WS_VISIBLE or BS_ICON,
  256.             a,b,wd,ht,hParent,ID,
  257.             hInstance,NULL
  258.  
  259.     ret
  260.  
  261. IconButton endp
  262.  
  263. ; ########################################################################
  264.  
  265. BmpButton proc hParent:DWORD,a:DWORD,b:DWORD,wd:DWORD,ht:DWORD,ID:DWORD
  266.  
  267. ; BmpButton PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD
  268. ; invoke BmpButton,hWnd,20,20,100,25,500
  269.  
  270.     szText bmpBtnCl,"BUTTON"
  271.     szText blnk2,0
  272.  
  273.     invoke CreateWindowEx,0,
  274.             ADDR bmpBtnCl,ADDR blnk2,
  275.             WS_CHILD or WS_VISIBLE or BS_BITMAP,
  276.             a,b,wd,ht,hParent,ID,
  277.             hInstance,NULL
  278.  
  279.     ret
  280.  
  281. BmpButton endp
  282.  
  283. ; #########################################################################
  284.  
  285. BtnProc proc hCtl   :DWORD,
  286.              uMsg   :DWORD,
  287.              wParam :DWORD,
  288.              lParam :DWORD
  289.  
  290.     .if uMsg == WM_KEYDOWN
  291.         jmp lbd
  292.     .elseif uMsg == WM_KEYUP
  293.         jmp lbu
  294.     .elseif uMsg == WM_LBUTTONDOWN
  295.         lbd:
  296.         invoke LoadIcon,hInstance,3
  297.         invoke SendMessage,hBtn2,BM_SETIMAGE,1,eax
  298.     .elseif uMsg == WM_LBUTTONUP
  299.         lbu:
  300.         invoke LoadIcon,hInstance,2
  301.         invoke SendMessage,hBtn2,BM_SETIMAGE,1,eax
  302.     .endif
  303.  
  304.     invoke CallWindowProc,lpBtnProc,hCtl,uMsg,wParam,lParam
  305.  
  306.     ret
  307.  
  308. BtnProc endp
  309.  
  310. ; #########################################################################
  311.  
  312. SetBmpColor proc hBitmap:DWORD
  313.  
  314.     LOCAL mDC       :DWORD
  315.     LOCAL hBrush    :DWORD
  316.     LOCAL hOldBmp   :DWORD
  317.     LOCAL hReturn   :DWORD
  318.     LOCAL hOldBrush :DWORD
  319.  
  320.       invoke CreateCompatibleDC,NULL
  321.       mov mDC,eax
  322.  
  323.       invoke SelectObject,mDC,hBitmap
  324.       mov hOldBmp,eax
  325.  
  326.       invoke GetSysColor,COLOR_BTNFACE
  327.       invoke CreateSolidBrush,eax
  328.       mov hBrush,eax
  329.  
  330.       invoke SelectObject,mDC,hBrush
  331.       mov hOldBrush,eax
  332.  
  333.       invoke GetPixel,mDC,1,1
  334.       invoke ExtFloodFill,mDC,1,1,eax,FLOODFILLSURFACE
  335.  
  336.       invoke SelectObject,mDC,hOldBrush
  337.       invoke DeleteObject,hBrush
  338.  
  339.       invoke SelectObject,mDC,hBitmap
  340.       mov hReturn,eax
  341.       invoke DeleteDC,mDC
  342.  
  343.       mov eax,hReturn
  344.  
  345.     ret
  346.  
  347. SetBmpColor endp
  348.  
  349. ; #########################################################################
  350.  
  351. bmpProc proc hCtl   :DWORD,
  352.              uMsg   :DWORD,
  353.              wParam :DWORD,
  354.              lParam :DWORD
  355.  
  356.     .if uMsg == WM_KEYDOWN
  357.         jmp lbda
  358.     .elseif uMsg == WM_KEYUP
  359.         jmp lbua
  360.     .elseif uMsg == WM_LBUTTONDOWN
  361.         lbda:
  362.         invoke SendMessage,hBtn4,BM_SETIMAGE,0,hBmp2
  363.     .elseif uMsg == WM_LBUTTONUP
  364.         lbua:
  365.         invoke SendMessage,hBtn4,BM_SETIMAGE,0,hBmp1
  366.     .endif
  367.  
  368.     invoke CallWindowProc,lpfnbmpProc,hCtl,uMsg,wParam,lParam
  369.  
  370.     ret
  371.  
  372. bmpProc endp
  373.  
  374. ; #########################################################################
  375.  
  376.  
  377.     
  378.  
  379. end start
  380.