.386 .MODEL flat,stdcall OPTION casemap:none include c:\masm32\include\windows.inc include c:\masm32\include\user32.inc include c:\masm32\include\kernel32.inc include c:\masm32\include\gdi32.inc includelib c:\masm32\lib\user32.lib includelib c:\masm32\lib\kernel32.lib includelib c:\masm32\lib\gdi32.lib WndProc PROTO :dword, :dword, :dword, :dword initControls PROTO :dword PushButton PROTO :dword,:dword,:dword,:dword,:dword .CONST IDM_EXIT EQU 40005 .DATA szCaption db "Buttons, Rahmen und Font © 2006 Heinz - Volker Viehof",0 szClassName db "My_Class",0 cButtonClass db "button",0 FontName db "futura",0 cLabel db "** Titel 1 **",0 cLabel2 db "** Titel 2 **",0 cLabel3 db "** Titel 3 **",0 LabelShop dd offset cLabel,offset cLabel2,offset cLabel3 Exit db "Beenden",0 Knopf1 db "1te Option",0 Knopf2 db "2te Option",0 Knopf3 db "3te Option",0 ButtonShop dd offset Knopf1, offset Knopf2, offset Knopf3, .DATA? ;uninitialisierte Daten hInstance HINSTANCE ? hIcon HANDLE ? hCursor HANDLE ? hWnd HWND ? cCmdline LPSTR ? hEdit HANDLE ? logfont LOGFONT hEnde dd ? hFont1 dd ? .CODE start: call mymain invoke ExitProcess,0 mymain PROC LOCAL wwd:dword,wht:dword,wtx:dword,wty:dword,wc:WNDCLASSEX invoke GetModuleHandle,NULL mov hInstance,eax invoke GetCommandLine mov cCmdline,eax mov wtx,CW_USEDEFAULT ;oder konkrete Angaben: 0 mov wty,CW_USEDEFAULT ;0 mov wwd,400 mov wht,180 mov wc.cbSize,SIZEOF WNDCLASSEX mov wc.style,CS_HREDRAW OR CS_VREDRAW ;OR CS_BYTEALIGNCLIENT OR CS_BYTEALIGNWINDOW mov wc.lpfnWndProc,OFFSET WndProc mov wc.cbClsExtra,NULL mov wc.cbWndExtra,NULL push hInstance pop wc.hInstance mov wc.hbrBackground,COLOR_BTNFACE+1 mov wc.lpszMenuName,NULL mov wc.lpszClassName,OFFSET szClassName invoke LoadIcon,NULL,IDI_APPLICATION mov hIcon,eax mov wc.hIcon,eax mov wc.hIconSm,eax invoke LoadCursor,NULL,IDC_ARROW mov hCursor,eax mov wc.hCursor,eax invoke RegisterClassEx,ADDR wc invoke CreateWindowEx,WS_EX_LEFT,ADDR szClassName,ADDR szCaption, WS_OVERLAPPEDWINDOW,wtx,wty,wwd,wht,NULL,NULL,hInstance,NULL mov hWnd,eax invoke CreateFont, 12, 8, 0, 0, FW_MEDIUM, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, DEFAULT_PITCH or FF_DECORATIVE, addr FontName mov hFont1, eax invoke PushButton, hWnd, addr Exit,280,110,711 mov hEnde,eax invoke SendMessage,eax,WM_SETFONT,hFont1,0 invoke ShowWindow,hWnd,SW_SHOWNORMAL invoke UpdateWindow,hWnd call MsgLoop ret mymain ENDP MsgLoop PROC LOCAL msg:MSG Startloop: invoke GetMessage,ADDR msg,NULL,0,0 or eax,eax je Exitloop invoke TranslateMessage, ADDR msg invoke DispatchMessage,ADDR msg jmp Startloop Exitloop: mov eax,msg.wParam ret MsgLoop ENDP WndProc PROC hWin:dword,uMsg:dword,wParam:dword,lParam:dword .IF uMsg == WM_DESTROY invoke PostQuitMessage,NULL .ELSEIF uMsg == WM_CREATE invoke initControls,hWin .ELSEIF uMsg == WM_SIZE invoke SetFocus,hEdit .ELSEIF uMsg == WM_COMMAND mov eax,wParam .IF ax==IDM_EXIT invoke DestroyWindow,hWnd .ELSEIF wParam == 711 invoke DestroyWindow,hWnd .ENDIF .ELSE invoke DefWindowProc,hWin,uMsg,wParam,lParam ret .ENDIF xor eax,eax ret WndProc ENDP initControls PROC USES eax ecx edx esi, hWin:dword LOCAL hFont: HFONT,IndivID:dword, xStart:dword, yStart:dword, HelpCounter:dword LOCAL ButtonCount:dword,XDefault:dword,YDefault:dword,ButtonID:dword invoke GetStockObject,ANSI_VAR_FONT ;Font aus dem Systemvorrat holen invoke GetObject,eax,SIZEOF LOGFONT,ADDR logfont ;Font-Infos nach logfont schreiben invoke CreateFontIndirect,ADDR logfont ;daraus eine log. Schrift erzeugen mov hFont,eax mov IndivID,501 mov xStart,10 mov yStart,5 mov ecx,0 mov HelpCounter, 3 mov ButtonID,720 mov XDefault,20 GroupLoop: mov esi,[offset LabelShop+ecx*4] push ecx invoke CreateWindowEx,0,ADDR cButtonClass,esi,\ BS_GROUPBOX or WS_CHILD OR WS_VISIBLE, xStart, yStart,120,145,hWin,IndivID,hInstance,NULL invoke SendMessage,eax,WM_SETFONT,hFont,0 add xStart, 130 inc IndivID mov ecx,0 mov YDefault,20 mov ButtonCount,3 TreeButton: mov esi,[offset ButtonShop+ecx*4] push ecx invoke PushButton, hWin, esi,XDefault,YDefault,ButtonID add YDefault,30 inc ButtonID pop ecx inc ecx dec ButtonCount jnz TreeButton add XDefault,130 pop ecx inc ecx dec HelpCounter jnz GroupLoop ret initControls ENDP PushButton proc hWin:dword,Titel:dword,BxStart:dword,ByStart:dword,IndivID:dword invoke CreateWindowEx,0,ADDR cButtonClass,Titel,\ BS_PUSHBUTTON or WS_CHILD OR WS_VISIBLE, BxStart, ByStart,100,25,hWin,IndivID,hInstance,NULL ret PushButton endp END start