Урок 7. Обрабатываем сообщения мышки.
- Родительская категория: x32
- Категория: Fasm x32
- Опубликовано 08 Декабрь 2016
- Автор: HandyCat
- Просмотров: 4342
Уроки программирования на ассемблере - Iczelion's Win32 Assembly Tutorial, переписанные с использованием fasm. Код касается обработки нажатия клавиш мыши. Ассемблируем код и кликаем мышкой в рамках окна.
Ассемблер Fasm можно скачать на официальном сайте. Рекомендуем воспользоваться нашей сборкой, которая содержит все необходимое для программирования на ассемблере. Самораспаковывающийся rar-архив качайте тут: RadAsm - настройка среды разработки.
В код включен win32a.inc - чистый fasm.
Код:
format PE GUI 4.0 entry start include '%fasminc%\win32a.inc' section '.data' data readable writeable wHMain dd ? wHInstance dd ? wTitle db 'Tutorial 7',0 wClsName db 'TUT07',0 wMsg MSG wCls WNDCLASS ;exp = experiment expTxt db ' FASM knows you just clicked here!',0 expClick db 0 expHdc dd ? expHPoint POINT expPs PAINTSTRUCT section '.code' code readable executable start: ; +------------------------------+ ; | registering the window class | ; +------------------------------+ invoke GetModuleHandle,NULL mov [wHInstance],eax mov [wCls.hInstance],eax mov [wCls.style],CS_HREDRAW or CS_VREDRAW mov [wCls.lpfnWndProc],window_procedure mov [wCls.lpszClassName],wClsName mov [wCls.hbrBackground],COLOR_WINDOW+1 invoke LoadIcon,NULL,IDI_APPLICATION mov [wCls.hIcon],eax invoke LoadCursor,NULL,IDC_ARROW mov [wCls.hCursor],eax invoke RegisterClass,wCls ; +--------------------------+ ; | creating the main window | ; +--------------------------+ invoke CreateWindowEx,\ 0,\ wClsName,\ wTitle,\ WS_OVERLAPPEDWINDOW or WS_VISIBLE,\ CW_USEDEFAULT,\ CW_USEDEFAULT,\ CW_USEDEFAULT,\ CW_USEDEFAULT,\ NULL,\ NULL,\ [wHInstance],\ NULL mov [wHMain],eax ; +---------------------------+ ; | entering the message loop | ; +---------------------------+ window_message_loop_start: invoke GetMessage,wMsg,NULL,0,0 or eax,eax je window_message_loop_end invoke TranslateMessage,wMsg invoke DispatchMessage,wMsg jmp window_message_loop_start window_message_loop_end: invoke ExitProcess,0 ; +----------------------+ ; | the window procedure | ; +----------------------+ proc window_procedure,hWnd,uMsg,wParam,lParam push ebx esi edi ;eventhough the API would preserved, but play safe :p cmp [uMsg],WM_LBUTTONDOWN je wmLBUTTONDOWN cmp [uMsg],WM_PAINT je wmPAINT cmp [uMsg],WM_DESTROY je wmDESTROY wmDEFAULT: invoke DefWindowProc,[hWnd],[uMsg],[wParam],[lParam] jmp wmBYE wmLBUTTONDOWN: ;low order lParam = x ;high order lParam = y mov eax,[lParam] and eax,0xFFFF mov [expHPoint.x],eax mov eax,[lParam] shr eax,16 mov [expHPoint.y],eax mov [expClick],TRUE invoke InvalidateRect,[hWnd],NULL,TRUE jmp wmBYE wmPAINT: invoke BeginPaint,[hWnd],expPs mov [expHdc],eax cmp [expClick],TRUE jne wmPAINT_END invoke lstrlen,expTxt invoke TextOut,[expHdc],[expHPoint.x],[expHPoint.y],expTxt,eax wmPAINT_END: invoke EndPaint,[hWnd],expPs jmp wmBYE wmDESTROY: invoke PostQuitMessage,0 wmBYE: pop edi esi ebx ret endp section '.idata' import data readable writeable library KERNEL32, 'KERNEL32.DLL',\ USER32, 'USER32.DLL',\ GDI32, 'GDI32.DLL' import KERNEL32,\ GetModuleHandle, 'GetModuleHandleA',\ lstrlen, 'lstrlenA',\ ExitProcess, 'ExitProcess' import USER32,\ RegisterClass, 'RegisterClassA',\ CreateWindowEx, 'CreateWindowExA',\ DefWindowProc, 'DefWindowProcA',\ ShowWindow, 'ShowWindow',\ LoadCursor, 'LoadCursorA',\ LoadIcon, 'LoadIconA',\ BeginPaint, 'BeginPaint',\ InvalidateRect, 'InvalidateRect',\ EndPaint, 'EndPaint',\ GetMessage, 'GetMessageA',\ TranslateMessage, 'TranslateMessage',\ DispatchMessage, 'DispatchMessageA',\ PostQuitMessage, 'PostQuitMessage' import GDI32,\ TextOut, 'TextOutA'
Результат :
Справка : Код работоспособен. Ассемблер - fasm. Для 32-битной операционной системы (x86 или если нравится - x32) Windows. Копируем и вставляем в свой проект.