; ««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««« .486 ; create 32 bit code .model flat, stdcall ; 32 bit memory model option casemap :none ; case sensitive include \masm32\include\windows.inc include \masm32\include\masm32.inc include \masm32\include\gdi32.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc include \masm32\include\Comctl32.inc include \masm32\include\comdlg32.inc include \masm32\include\shell32.inc include \masm32\include\oleaut32.inc include \masm32\include\msvcrt.inc includelib \masm32\lib\masm32.lib includelib \masm32\lib\gdi32.lib includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib includelib \masm32\lib\Comctl32.lib includelib \masm32\lib\comdlg32.lib includelib \masm32\lib\shell32.lib includelib \masm32\lib\oleaut32.lib includelib \masm32\lib\msvcrt.lib WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD RegisterWinClass PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD Static PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD PushButton PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD ToggleSwitch PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD MsgLoop PROTO :DWORD,:DWORD EditSl PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD CheckDlgButton PROTO :DWORD,:DWORD,:DWORD .data? hInstance dd ? hIcon dd ? hCursor dd ? hWnd dd ? hEnde dd ? hAction dd ? hPlus dd ? hMinus dd ? hCancel dd ? hBearbeiten dd ? hAusgabe dd ? dezimal dd ? ThreadID dd ? ThreadParam dd ? .data szClassName db "My_Class",0 slStatic db "STATIC",0 btnClass db "BUTTON",0 slEdit db "EDIT",0 szEnde db "--Ende--",0 szAction db "Start",0 szPlus db "Abbruch",0 szState2 db "- Vorzeitiger Abbruch durch Benutzer!",0 szState1 db "- Die Zeit läuft ab ...",0 szCaption db "SelfTimer - 2006 H.V.Viehof ",0 szExplain db "Ein Beispiel für eine Art Zeitrelais: Wird der Button 1 gedrückt wird eine ThreadProcedur gestartet die nach kurzer Zeit ein Signal an Button zwei sendet, dieser entriegelt Button eins und sendet wiederum ein Signal den Thread zu stoppen",0 szFiller db "Platzhalter",0 .code start: call Main invoke ExitProcess,eax ThreadProc proc invoke Sleep,5000 ;invoke CheckDlgButton, ThreadParam, 721,BST_UNCHECKED invoke CheckDlgButton, ThreadParam, 722,BST_CHECKED ThreadProc endp ;----------------------------------------------------------------- Main proc LOCAL Wwd:DWORD,Wht:DWORD,Wtx:DWORD,Wty:DWORD mov Wtx,10 ;x koordinate oben links mov Wty,10 ;y koordinate oben links mov Wwd,360 ;+x= unten rechts mov Wht,260 ;+y= unten rechts invoke RegisterWinClass,ADDR WndProc,ADDR szClassName,hIcon,hCursor,COLOR_BTNFACE+1 invoke CreateWindowEx,WS_EX_TOOLWINDOW,ADDR szClassName,ADDR szCaption, WS_OVERLAPPEDWINDOW,Wtx,Wty,Wwd,Wht,NULL,NULL,hInstance,NULL mov hWnd,eax invoke PushButton,ADDR szEnde,hWnd,160,200,180,24,720 mov hEnde,eax invoke ToggleSwitch,ADDR szAction,hWnd,20,170,100,24,721 mov hAction, eax invoke ToggleSwitch,ADDR szPlus,hWnd,20,200,100,24,722 mov hPlus,eax invoke Static,addr szExplain,20,10,320,130,hWnd,730 mov hBearbeiten,eax invoke Static,addr szFiller,140,170,200,24,hWnd,731 mov hAusgabe,eax invoke ShowWindow,hWnd, SW_SHOWNORMAL invoke UpdateWindow,hWnd invoke MsgLoop,0,hEnde invoke ExitProcess,eax ret Main endp ;--------------------------------------------------------------- m2m MACRO M1, M2 push M2 pop M1 ENDM ;--------------------------------------------------------------- RegisterWinClass proc lpWndProc:DWORD,lpClassName:DWORD,Icon:DWORD,Cursor:DWORD, bColor:DWORD LOCAL wc:WNDCLASSEX mov wc.cbSize, sizeof WNDCLASSEX mov wc.style, CS_BYTEALIGNCLIENT or CS_BYTEALIGNWINDOW or CS_NOCLOSE m2m wc.lpfnWndProc, lpWndProc mov wc.cbClsExtra, NULL mov wc.cbWndExtra, NULL m2m wc.hInstance, hInstance m2m wc.hbrBackground, bColor mov wc.lpszMenuName, NULL m2m wc.lpszClassName, lpClassName m2m wc.hIcon, Icon m2m wc.hCursor, Cursor m2m wc.hIconSm, Icon invoke RegisterClassEx,ADDR wc ret RegisterWinClass endp MsgLoop proc hMSG:DWORD,hENDE:DWORD LOCAL msg:MSG StartLoop: invoke GetMessage,ADDR msg,0,0,0 .if eax == 0 jmp ExitLoop .elseif msg.message == 0201h mov ecx,hENDE .if msg.hwnd == ecx jmp ExitLoop .endif .endif invoke DispatchMessage ,ADDR msg jmp StartLoop ExitLoop: mov eax, msg.wParam ret MsgLoop endp WndProc proc hWin:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD,hDOIT:DWORD LOCAL msg:MSG .if uMsg == WM_DESTROY invoke PostQuitMessage,NULL mov eax, 0 ret .elseif uMsg == WM_COMMAND .if wParam == 721 invoke SendMessage, hAusgabe, WM_SETTEXT, NULL, addr szState1 invoke UpdateWindow, hAusgabe invoke CheckDlgButton, hWin, 722,BST_UNCHECKED mov eax,hWin mov ThreadParam,eax invoke CreateThread, NULL, 0, addr ThreadProc, addr ThreadParam, 0,addr ThreadID .elseif wParam == 722 invoke SendMessage, hAusgabe, WM_SETTEXT, NULL, addr szState2 invoke UpdateWindow, hAusgabe invoke CheckDlgButton, hWin, 721,BST_UNCHECKED invoke CloseHandle ,ThreadID .endif .endif invoke DefWindowProc,hWin,uMsg,wParam,lParam ret WndProc endp PushButton proc lpText:DWORD,hParent:DWORD, a:DWORD,b:DWORD,wd:DWORD,ht:DWORD,ID:DWORD invoke CreateWindowEx,0, ADDR btnClass,lpText, WS_CHILD or WS_VISIBLE or BS_PUSHBUTTON or BS_NOTIFY, a,b,wd,ht,hParent,ID, hInstance,NULL ret PushButton endp ToggleSwitch proc lpText:DWORD,hParent:DWORD, a:DWORD,b:DWORD,wd:DWORD,ht:DWORD,ID:DWORD invoke CreateWindowEx,0, ADDR btnClass,lpText, WS_CHILD or WS_VISIBLE or BS_AUTOCHECKBOX or BS_NOTIFY or BS_PUSHLIKE, a,b,wd,ht,hParent,ID, hInstance,NULL ret ToggleSwitch endp Static proc szMsg:DWORD,a:DWORD,b:DWORD, wd:DWORD,ht:DWORD,hParent:DWORD,ID:DWORD invoke CreateWindowEx,WS_EX_CLIENTEDGE,ADDR slStatic,szMsg, WS_VISIBLE or WS_CHILDWINDOW or SS_LEFT, \ a,b,wd,ht,hParent,ID,hInstance,NULL ret Static endp EditSl proc szMsg:DWORD,a:DWORD,b:DWORD, wd:DWORD,ht:DWORD,hParent:DWORD,ID:DWORD invoke CreateWindowEx,WS_EX_CLIENTEDGE,ADDR slEdit,szMsg, WS_VISIBLE or WS_CHILDWINDOW or \ ES_AUTOHSCROLL or ES_NOHIDESEL, a,b,wd,ht,hParent,ID,hInstance,NULL ret EditSl endp end start