08.09.2009, 19:42
общий
это ответ
Здравствуйте, WWWorm.
ресурсы скомпилируйте в файл menu.res
Приложение:
format PE GUI 4.0
entry entry_point
include 'D:\prg\fasm_1_67_38\INCLUDE\win32a.inc'
IDM_TEST equ 1 ; Menu IDs
IDM_HELLO equ 2
IDM_GOODBYE equ 3
IDM_EXIT equ 4
;--------------------------------------
section '.data' data readable writeable
ClassName db "SimpleWinClass",0
AppName db "Our First Window",0
MenuName db "FirstMenu",0 ; The name of our menu in the resource file
Test_string db "You selected Test menu item",0
Hello_string db "Hello, my friend",0
Goodbye_string db "See you again, bye",0
;---------------------------------------
section '.bss' readable writeable
hInstance dd ?
CommandLine dd ?
;---------------------------------------
section '.code' code readable executable
entry_point:
invoke GetModuleHandle, NULL
mov [hInstance],eax
invoke GetCommandLine
mov [CommandLine],eax
stdcall WinMain, [hInstance],NULL,[CommandLine],SW_SHOWDEFAULT
invoke ExitProcess,eax
proc WinMain hInst:DWORD,hPrevInst:DWORD,CmdLine:DWORD,CmdShow:DWORD
local wc:WNDCLASSEX,msg:MSG,hwnd:DWORD
mov [wc.cbSize],sizeof.WNDCLASSEX
mov [wc.style],CS_HREDRAW or CS_VREDRAW
mov [wc.lpfnWndProc],WndProc
mov [wc.cbClsExtra],NULL
mov [wc.cbWndExtra],NULL
push [hInst]
pop [wc.hInstance]
mov [wc.hbrBackground],COLOR_WINDOW+1
mov [wc.lpszMenuName],MenuName ; Put our menu name here
mov [wc.lpszClassName],ClassName
invoke LoadIcon,NULL,IDI_APPLICATION
mov [wc.hIcon],eax
mov [wc.hIconSm],eax
invoke LoadCursor,NULL,IDC_ARROW
mov [wc.hCursor],eax
lea eax,[wc]
invoke RegisterClassEx, eax
invoke CreateWindowEx,NULL,ClassName,AppName,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,[hInst],NULL
mov [hwnd],eax
invoke ShowWindow, [hwnd],SW_SHOWNORMAL
invoke UpdateWindow, [hwnd]
.message_loop:
lea eax,[msg]
invoke GetMessage, eax,NULL,0,0
test eax,eax
jz .exit
lea eax,[msg]
invoke DispatchMessage, eax
jmp .message_loop
.exit:
mov eax,[msg.wParam]
ret
endp
;---------------------------------------------------------------
proc WndProc uses ebx esi edi, hWnd:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD
cmp [uMsg],WM_DESTROY
je .wm_destroy
cmp [uMsg],WM_COMMAND
je .wm_command
invoke DefWindowProc,[hWnd],[uMsg],[wParam],[lParam]
jmp .exit
.wm_destroy:
invoke PostQuitMessage,NULL
xor eax,eax
jmp .exit
.wm_command:
mov eax,[wParam]
cmp eax,IDM_TEST
je .idm_test
cmp eax,IDM_HELLO
je .idm_hello
cmp eax,IDM_GOODBYE
je .idm_goodbye
invoke DestroyWindow,[hWnd]
xor eax,eax
jmp .exit
.idm_test:
invoke MessageBox,NULL,Test_string,AppName,MB_OK
xor eax,eax
jmp .exit
.idm_hello:
invoke MessageBox,NULL,Hello_string,AppName,MB_OK
xor eax,eax
jmp .exit
.idm_goodbye:
invoke MessageBox,NULL,Goodbye_string,AppName,MB_OK
xor eax,eax
jmp .exit
.exit:
ret
endp
;---------------------------------------------------
section '.rsrc' data readable resource from 'menu.res'
;----------------------------------------------
section '.idata' import data readable writeable
library user,'USER32.DLL',\
kernel,'KERNEL32.DLL'
import user,\
LoadIcon,'LoadIconA',\
LoadCursor,'LoadCursorA',\
RegisterClassEx,'RegisterClassExA',\
CreateWindowEx,'CreateWindowExA',\
DestroyWindow,'DestroyWindow',\
ShowWindow,'ShowWindow',\
UpdateWindow,'UpdateWindow',\
GetMessage,'GetMessageA',\
TranslateMessage,'TranslateMessage',\
DispatchMessage,'DispatchMessageA',\
PostQuitMessage,'PostQuitMessage',\
MessageBox,'MessageBoxA',\
DefWindowProc,'DefWindowProcA'
import kernel,\
GetModuleHandle,'GetModuleHandleA',\
GetCommandLine,'GetCommandLineA',\
ExitProcess,'ExitProcess'