;-popupmenu.asm-------------------------------------------------------------- ; x86 - Dos & Win32 - Assembly Language Programming ; ; ; ; Written by: John A Lyons ; ; Email : sysop@megablast.8k.com ; ; Page : http://www.asmsource.8k.com/ ; ; Compiler : Masm32 v6.13 Microsoft Macro Assembler ; ; Date : 14-Feb-2001 ; ; Purpose : Demonstrates a simple win32 program. Opens a window ; ; with a menu, and show how to accept input form the menu. ; ; Also adds on a popupmenu, accessed by the right button, and ; ; shows how to create a menu from scratch ; ; ; ;---------------------------------------------------------------------------- ; Compile with nmake ; .386 ; 32-Bit when .386 appears before .MODEL .MODEL FLAT , STDCALL include windows.inc include user32.inc include kernel32.inc include gdi32.inc includelib user32.lib includelib kernel32.lib includelib gdi32.lib EXTRN wsprintfA:PROC .const IDM_PICK1 equ 2 IDM_PICK2 equ 3 IDM_EXIT equ 1 IDM_ABOUT equ 4 .data ClassName db "SimpleWinClass",0 AppName db "Popup Menu",0 pick1 db "Pick Item 1 ",0 pick2 db "Pick Item 2 ",0 about db "About",0 exit db "Exit",0 menu db "Right click for menu item",0 MenuName db "TheMenu",0 wabout db " Menu Example",10,10," by John Lyons",10,"http://asmsource.8k.com",0 aboutcap db "Menu Example",0 menuhand HMENU 0 .data? hInstance HINSTANCE ? CommandLine LPSTR ? hwnd HWND ? hdc HDC ? temp db 100 dup(0) wtop dd ? wleft dd ? .code WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:SDWORD LOCAL wc:WNDCLASSEX LOCAL msg:MSG LOCAL hmenu:HWND mov wc.cbSize,SIZEOF WNDCLASSEX mov wc.style, CS_HREDRAW or CS_VREDRAW mov wc.lpfnWndProc, OFFSET WndProc mov wc.cbClsExtra,NULL mov wc.cbWndExtra,NULL push hInstance pop wc.hInstance mov wc.hbrBackground,COLOR_WINDOW+1 mov wc.lpszMenuName,OFFSET MenuName mov wc.lpszClassName,OFFSET ClassName invoke LoadIcon,NULL,IDI_APPLICATION mov wc.hIcon,eax mov wc.hIconSm,0 invoke LoadCursor,NULL,IDC_ARROW mov wc.hCursor,eax invoke RegisterClassEx, addr wc INVOKE CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\ WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT, ;postion 300,100, ;size NULL,NULL,\ hInst,NULL mov hwnd,eax INVOKE ShowWindow, hwnd,SW_SHOWNORMAL INVOKE UpdateWindow, hwnd .WHILE TRUE INVOKE GetMessage, ADDR msg,NULL,0,0 .BREAK .IF (!eax) INVOKE TranslateMessage, ADDR msg INVOKE DispatchMessage, ADDR msg .ENDW mov eax,msg.wParam ret WinMain endp WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM LOCAL ps:PAINTSTRUCT LOCAL rect:RECT LOCAL wmenu:DWORD mov eax,uMsg .IF eax==WM_DESTROY invoke PostQuitMessage,NULL .ELSEIF eax==WM_PAINT invoke GetWindowRect,hWnd,ADDR rect mov eax,rect.top mov wtop,eax mov eax,rect.left mov wleft,eax invoke BeginPaint,hWnd, ADDR ps mov hdc,eax invoke TextOut,hdc,0,0,ADDR menu,(SIZEOF menu) -1 invoke EndPaint,hWnd, ADDR ps .ELSEIF eax==WM_MOVE invoke GetWindowRect,hWnd,ADDR rect mov eax,rect.top mov wtop,eax mov eax,rect.left mov wleft,eax .ELSEIF eax==WM_COMMAND mov eax,wParam .IF lParam==0 .IF ax==IDM_PICK1 invoke GetDC,hWnd mov hdc,eax invoke SendMessage,hWnd,WM_ERASEBKGND,hdc,0 invoke TextOut,hdc,0,0,ADDR pick1,(SIZEOF pick1) -1 invoke EndPaint,hWnd, ADDR ps .ELSEIF ax==IDM_PICK2 invoke GetDC,hWnd mov hdc,eax invoke SendMessage,hWnd,WM_ERASEBKGND,hdc,0 invoke TextOut,hdc,0,0,ADDR pick2,(SIZEOF pick2) -1 invoke EndPaint,hWnd, ADDR ps .ELSEIF ax==IDM_ABOUT invoke MessageBox,NULL,addr wabout,addr aboutcap,MB_OK .ELSEIF ax==IDM_EXIT invoke DestroyWindow,hwnd .ENDIF .ENDIF .ELSEIF eax==WM_RBUTTONDOWN invoke CreatePopupMenu mov [wmenu],eax invoke AppendMenu,wmenu,MF_STRING,IDM_PICK1,ADDR pick1 invoke AppendMenu,wmenu,MF_STRING,IDM_PICK2,ADDR pick2 invoke AppendMenu,wmenu,MF_STRING,IDM_ABOUT,ADDR about invoke AppendMenu,wmenu,MF_STRING,IDM_EXIT,ADDR exit mov ebx,lParam mov ecx,ebx and ebx,0ffffh shr ecx,16 add ebx,wleft add ecx,wtop add ecx,20 invoke TrackPopupMenu,wmenu,TPM_CENTERALIGN +TPM_LEFTBUTTON,ebx,ecx,0,hWnd,NULL .ELSE invoke DefWindowProc,hWnd,uMsg,wParam,lParam ret .ENDIF xor eax,eax ret WndProc endp showtemp proc near lea esi,temp xor ecx,ecx loll1: inc ecx inc esi cmp [esi],byte ptr 0 jne loll1 invoke TextOut,hdc,0,ebx,ADDR temp,ecx ret showtemp endp start: invoke GetModuleHandle, NULL mov hInstance,eax invoke GetCommandLine invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT invoke ExitProcess,eax end start