 |
Ассемблер в примерах - Пример программы - окно с полем ввода и кнопкой
- Вопрос:
- Окно - в окне поле ввода и кнопка.
В поле ввода вводим число (вариант - стринг).
Нажимаем кнопку.
Данные из окна ввода попадают в регистр (вариант - получаем адрес памяти где хранятся наши данные)
Помогите с примером! Желательно на FASM.
- Ответ:
-
format PE GUI 4.0
entry start
include 'win32a.inc'
IDC_EDIT = 100
IDC_BUTTON = 101
section '.data' data readable writeable
_class db 'GetNumberClass',0
_title db 'Ввод числа',0
_edit db 'edit',0
_button db 'button',0
_button_tit db 'Нажми меня',0
_error db 'Ошибка создания окна',0
_error_num db 'Сначала введите число до 8 знаков',0
wc WNDCLASS 0,WindowProc,0,0,NULL,NULL,NULL,COLOR_BTNFACE+1,NULL,_class
section '.data?' data readable writeable
msg MSG
hEdit dd ?
flag dd ?
iVar dd ?
buf rd 16
section '.code' code readable executable
start:
invoke GetModuleHandle,0
mov [wc.hInstance],eax
invoke LoadIcon,0,IDI_APPLICATION
mov [wc.hIcon],eax
invoke LoadCursor,0,IDC_ARROW
mov [wc.hCursor],eax
invoke RegisterClass,wc
test eax,eax
jz error
invoke CreateWindowEx,0,_class,_title,WS_VISIBLE+WS_DLGFRAME+WS_SYSMENU,128,128,256,192,NULL,NULL,[wc.hInstance],NULL
test eax,eax
jz error
msg_loop:
invoke GetMessage,msg,NULL,0,0
cmp eax,1
jb end_loop
jne msg_loop
invoke TranslateMessage,msg
invoke DispatchMessage,msg
jmp msg_loop
error:
invoke MessageBox,NULL,_error,NULL,MB_ICONERROR+MB_OK
end_loop:
invoke ExitProcess,[msg.wParam]
proc WindowProc hwnd,wmsg,wparam,lparam
push ebx esi edi
cmp [wmsg],WM_CREATE
je .wmcreate
cmp [wmsg],WM_COMMAND
je .wmcommand
cmp [wmsg],WM_DESTROY
je .wmdestroy
.defwndproc:
invoke DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
jmp .ret
.wmcreate:
;создадим редактор (стиль ES_NUMBER - ждем число)
invoke CreateWindowEx,WS_EX_CLIENTEDGE,_edit,0,WS_VISIBLE+WS_CHILDWINDOW+ES_NUMBER+ES_AUTOHSCROLL+ES_NOHIDESEL,10,10,100,20,[hwnd],IDC_EDIT,[wc.hInstance],NULL
mov [hEdit],eax
;дадим ему фокус ввода
invoke SetFocus,eax
;ограничимсячислом с 8 знаками
invoke SendMessage,[hEdit],EM_SETLIMITTEXT,8,0
;создадим кнопку
invoke CreateWindowEx,0,_button,_button_tit,WS_VISIBLE+WS_CHILDWINDOW+BS_DEFPUSHBUTTON,10,40,100,20,[hwnd],IDC_BUTTON,[wc.hInstance],NULL
jmp .finish
.wmcommand:
mov eax,[wparam]
;нажата кнопка?
cmp ax,IDC_BUTTON
jne .finish
;получим в EAX число из редактора (flag - флаг корректности, последний параметр 1-знаковое число)
invoke GetDlgItemInt,[hwnd],IDC_EDIT,flag,1
cmp [flag],1
je .numok
;нет числа
invoke MessageBox,[hwnd],_error_num,_title,MB_ICONINFORMATION+MB_OK
;дадим фокус редактору
invoke SetFocus,[hEdit]
jmp .finish
.numok:
;сохраним в переменной
mov [iVar],eax
;получим еще раз, но сейчас как строку
invoke GetDlgItemText,[hwnd],IDC_EDIT,buf,16
;выведем
invoke MessageBox,[hwnd],buf,_title,MB_OK
;и завершимся
.wmdestroy:
invoke PostQuitMessage,0
.finish:
xor eax,eax
.ret:
pop edi esi ebx
ret
endp
section '.idata' import data readable writeable
library kernel32,'KERNEL32.DLL',\
user32,'USER32.DLL'
include 'api\kernel32.inc'
include 'api\user32.inc'
|  |