; ============================================================================ ; 01-window.asm — каркас GUI-приложения Win32 на MASM32 ; Лабораторная №3 «Строковые операции в MASM32», Задание 1 ; ---------------------------------------------------------------------------- ; Это ЗАГОТОВКА окна: регистрация класса, создание главного окна, поле ввода ; (edit) и кнопка (button), обработка WM_CREATE / WM_COMMAND / WM_DESTROY. ; Логика обработки строки (по варианту) — в файле 02-strings.asm. ; ; Сборка в MASM32: ml /c /coff 01-window.asm ; link /subsystem:windows 01-window.obj ; ============================================================================ ; ФИО: ____________________ Вариант: ____ Группа: ______ ; Дата: ____.__.____ Выдано: (лаботряс) ; ============================================================================ .386 .model flat, stdcall option casemap:none WinMain proto :DWORD, :DWORD, :DWORD, :DWORD include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib ; ---------------------------------------------------------------- .data .data ClassName db "SimpleWinClass",0 AppName db "Строковые операции (МАСМ32)",0 ButtonClassName db "button",0 ButtonText db "Обработать",0 EditClassName db "edit",0 ; ---------------------------------------------------------------- .data? .data? hInstance HINSTANCE ? CommandLine LPSTR ? hwndEdit HWND ? hwndButton HWND ? buffer db 512 dup(?) ; буфер ввода/вывода строки sizestr dd ? ; длина строки (возвращает GetWindowText) ; ---------------------------------------------------------------- .const .const ButtonID equ 1 EditID equ 2 ; ---------------------------------------------------------------- .code .code start: invoke GetModuleHandle, NULL mov hInstance, eax invoke GetCommandLine mov CommandLine, eax invoke WinMain, hInstance, NULL, CommandLine, SW_SHOWDEFAULT invoke ExitProcess, eax ; ---------------------------------------------------- WinMain: окно 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 mov wc.hbrBackground, COLOR_BTNFACE+1 mov wc.lpszMenuName, NULL mov wc.lpszClassName, OFFSET ClassName invoke LoadIcon, NULL, IDI_APPLICATION mov wc.hIcon, eax mov wc.hIconSm, eax invoke LoadCursor, NULL, IDC_ARROW mov wc.hCursor, eax invoke RegisterClassEx, addr wc invoke CreateWindowEx, WS_EX_CLIENTEDGE, ADDR ClassName, ADDR AppName, \ WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 460, 260, \ 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: сообщения WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM .IF uMsg == WM_DESTROY invoke PostQuitMessage, NULL .ELSEIF uMsg == WM_CREATE ; ---- поле ввода (edit) ---- invoke CreateWindowEx, WS_EX_CLIENTEDGE, ADDR EditClassName, NULL, \ WS_CHILD or WS_VISIBLE or WS_BORDER or ES_LEFT or ES_AUTOHSCROLL, \ 20, 20, 400, 24, hWnd, EditID, hInstance, NULL mov hwndEdit, eax invoke SetFocus, hwndEdit ; ---- кнопка (button) ---- invoke CreateWindowEx, NULL, ADDR ButtonClassName, ADDR ButtonText, \ WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON, \ 140, 70, 160, 28, hWnd, ButtonID, hInstance, NULL mov hwndButton, eax .ELSEIF uMsg == WM_COMMAND mov eax, wParam .IF lParam == 0 ; сообщения меню (меню в каркасе нет) .ELSE ; сообщения элементов управления: ; ax = ID элемента, старшее слово = код уведомления .IF ax == ButtonID shr eax, 16 .IF ax == BN_CLICKED ; ---- TODO: получить строку и обработать её ---- invoke GetWindowText, hwndEdit, ADDR buffer, 512 mov sizestr, eax ; длина строки ; TODO(вариант): здесь вызвать обработку buffer ; (см. 02-strings.asm) и записать результат обратно. ; Пока — эхо-вывод для проверки GUI: invoke SetWindowText, hwndEdit, ADDR buffer .ENDIF .ENDIF .ENDIF .ELSE invoke DefWindowProc, hWnd, uMsg, wParam, lParam ret .ENDIF xor eax, eax ret WndProc endp end start