; ««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««« .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 ? .data szClassName db "My_Class",0 slStatic db "STATIC",0 btnClass db "BUTTON",0 slEdit db "EDIT",0 szEnde db "--Ende--",0 szAction db "erste Option",0 szPlus db "zweite Option",0 szMinus db "dritte Option",0 szCancel db "Auswahl löschen",0 szState1 db "- mit der 'CheckDlgButton' Methode werden die beiden anderen Buttons gelösst...",0 szState2 db "- ebenso hier, Taste 1 und 3 werden gelöst.",0 szState3 db "- so können Tastensätze in beliebiger Konstellation erzeugt werden.",0 szNeutral db "Auswahl gelöscht ...",0 szCaption db "Tastensatz mit Verriegelung - 2006 H.V.Viehof ",0 szExplain db "Ein Beispiel für einen Tastensatz mit gegenseitiger Veriegelung ...",10,13,"drücke bitte die Tasten in beliebiger Reihenfolge und sieh was passiert ..." ,0 szFiller db "Platzhalter",0 .code start: call Main invoke ExitProcess,eax ;----------------------------------------------------------------- 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,190,180,24,720 mov hEnde,eax invoke ToggleSwitch,ADDR szAction,hWnd,20,100,100,24,721 mov hAction, eax invoke ToggleSwitch,ADDR szPlus,hWnd,20,130,100,24,722 mov hPlus,eax invoke ToggleSwitch,ADDR szMinus,hWnd,20,160,100,24,723 mov hMinus, eax invoke PushButton,ADDR szCancel,hWnd,20,190,120,24,724 mov hCancel, eax ;invoke GetCommandLine invoke Static,addr szExplain,20,10,320,80,hWnd,730 mov hBearbeiten,eax invoke Static,addr szFiller,140,100,200,80,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 UpdateWindow ,hWnd 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 invoke CheckDlgButton, hWin, 723,BST_UNCHECKED .elseif wParam == 722 invoke SendMessage, hAusgabe, WM_SETTEXT, NULL, addr szState2 invoke UpdateWindow, hAusgabe invoke CheckDlgButton, hWin, 721,BST_UNCHECKED invoke CheckDlgButton, hWin, 723,BST_UNCHECKED .elseif wParam == 723 invoke SendMessage, hAusgabe, WM_SETTEXT, NULL, addr szState3 invoke UpdateWindow, hAusgabe invoke CheckDlgButton, hWin, 721,BST_UNCHECKED invoke CheckDlgButton, hWin, 722,BST_UNCHECKED .elseif wParam == 724 invoke SendMessage, hAusgabe, WM_SETTEXT, NULL, addr szNeutral invoke UpdateWindow, hAusgabe invoke CheckDlgButton, hWin, 721,BST_UNCHECKED invoke CheckDlgButton, hWin, 722,BST_UNCHECKED invoke CheckDlgButton, hWin, 723,BST_UNCHECKED .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