Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для начинающих > Диалоговые окна


Автор: Hopelessness 3.12.2007, 21:23
Создать окно с четырехуровневым меню. Один из пунктов меню завершает приложение, другой - вызывает программу Калькулятор.

проблема с вызовом калькулятора, как это осуществить?


Код


.386
.model flat,stdcall
option casemap:none
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
include windows.inc
include gdi32.inc
include user32.inc
include kernel32.inc
includelib user32.lib
includelib gdi32.lib
includelib kernel32.lib


.data
ClassName db "SimpleWinClass",0
AppName  db "Simple Window",0
MenuName db "FirstMenu",0
Test_string db "author: Hopelessness, TR-61",0
tst DWORD 100 



.data?
hInstance HINSTANCE ?
CommandLine LPSTR ?
hMenu HMENU ?

.const
IDM_ABOUT equ 1
IDM_CALC equ 2
IDM_EXIT equ 4


.code
start:
    invoke GetModuleHandle, NULL ;вызов ф-ии
    mov    hInstance,eax
    invoke GetCommandLine
    mov CommandLine,eax
    invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT
    invoke ExitProcess,eax
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
    LOCAL wc:WNDCLASSEX
    LOCAL msg:MSG
    LOCAL hwnd: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  hInst
    pop   wc.hInstance
    invoke CreateSolidBrush, 00FF80FFh
    mov   wc.hbrBackground,eax
    mov   wc.lpszMenuName,NULL
    mov   wc.lpszClassName,OFFSET ClassName
    invoke LoadIcon,NULL,IDI_APPLICATION
    mov   wc.hIcon,eax
    mov   wc.hIconSm,0
    invoke LoadCursor,NULL,IDC_NO
    mov   wc.hCursor,eax
    invoke RegisterClassEx, addr wc
    invoke LoadMenu, hInst, OFFSET MenuName
    mov    hMenu,eax
    INVOKE CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\
           WS_OVERLAPPEDWINDOW,100,\                
           100,400,300,NULL,hMenu,\
           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 DispatchMessage, ADDR msg
    .ENDW
    mov     eax,msg.wParam
    ret
WinMain endp

WndProc proc hWin:DWORD, hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    .IF uMsg == WM_CLOSE
        invoke ShowWindow,hWin,SW_MINIMIZE 
    .ELSEIF uMsg==WM_COMMAND
        mov eax,wParam
        
        .IF ax==IDM_ABOUT
            invoke MessageBox,NULL,ADDR Test_string,OFFSET AppName,MB_OK
        .ELSEIF ax==IDM_CALC
            
            ;?????????

        .ELSEIF ax==IDM_EXIT
            invoke EndDialog,hWin,0
        .ENDIF
    .ELSE
        invoke DefWindowProc,hWnd,uMsg,wParam,lParam
        ret
    .ENDIF
    xor    eax,eax
    ret
WndProc endp
end start

Автор: MAKCim 3.12.2007, 22:14
Hopelessness, 

M
MAKCim
Модератор: Читайте внимательно правила раздела!

Автор: Hopelessness 4.12.2007, 21:39
сделано... может, кому-то понадобится...

Код

.386
.model flat,stdcall
option casemap:none
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
include windows.inc
include gdi32.inc
include user32.inc
include kernel32.inc
includelib user32.lib
includelib gdi32.lib
includelib kernel32.lib


.data
ClassName db "SimpleWinClass",0
AppName  db "Simple Window",0
MenuName db "FirstMenu",0
Test_string db "author: Hopelessness, TR-61",0
Calc_string db "calc.exe",0

tst DWORD 100 


.data?
hInstance HINSTANCE ?
CommandLine LPSTR ?
hMenu HMENU ?

.const
IDM_ABOUT equ 1
IDM_CALC equ 2
IDM_EXIT equ 4


.code
start:
    invoke GetModuleHandle, NULL ;вызов ф-ии
    mov    hInstance,eax
    invoke GetCommandLine
    mov CommandLine,eax
    invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT
    invoke ExitProcess,eax
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
    LOCAL wc:WNDCLASSEX
    LOCAL msg:MSG
    LOCAL hwnd: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  hInst
    pop   wc.hInstance
    invoke CreateSolidBrush, 00FF80FFh
    mov   wc.hbrBackground,eax
    mov   wc.lpszMenuName,NULL
    mov   wc.lpszClassName,OFFSET ClassName
    invoke LoadIcon,NULL,IDI_APPLICATION
    mov   wc.hIcon,eax
    mov   wc.hIconSm,0
    invoke LoadCursor,NULL,IDC_NO
    mov   wc.hCursor,eax
    invoke RegisterClassEx, addr wc
    invoke LoadMenu, hInst, OFFSET MenuName
    mov    hMenu,eax
    INVOKE CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\
           WS_OVERLAPPEDWINDOW,100,\                
           100,400,300,NULL,hMenu,\
           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 DispatchMessage, ADDR msg
    .ENDW
    mov     eax,msg.wParam
    ret
WinMain endp

WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
.IF uMsg==WM_DESTROY
        invoke PostQuitMessage,NULL
    .ELSEIF uMsg==WM_COMMAND
        mov eax,wParam
        .IF ax==IDM_ABOUT
            invoke MessageBox,NULL,ADDR Test_string,OFFSET AppName,MB_OK
        .ELSEIF ax==IDM_CALC                    
                        invoke WinExec, ADDR Calc_string , SW_SHOW 

          

        .ELSEIF ax==IDM_EXIT
            invoke DestroyWindow,hWnd
        .ENDIF
    .ELSE
        invoke DefWindowProc,hWnd,uMsg,wParam,lParam
        ret
    .ENDIF
    xor    eax,eax
    ret
WndProc endp
end start

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)