Урок 8. Меню.
- Родительская категория: x32
- Категория: Fasm x32
- Опубликовано 14 Декабрь 2016
- Автор: HandyCat
- Просмотров: 6693
Уроки программирования на ассемблере - Iczelion's Win32 Assembly Tutorial, переписанные с использованием fasm. Код касается подключения меню к приложению и обработка сообщений меню. Обратите внимание, меню в виде ресурса (section '.rsrc' resource data readable) содержится в одном файле со строками исходного кода.
Fasm можно скачать на официальном сайте. Рекомендуем воспользоваться нашей сборкой, которая содержит все необходимое для программирования на ассемблере. Самораспаковывающийся rar-архив качайте тут: RadAsm - настройка среды разработки. В случае, если Вы пользуетесь нашей сборкой, проделайте следующее. В среде разработки RadAsm (главное меню программы): File->New Project (Assembler - fasm, Project Type - Win32 App, назваение проектаи поле project - какое угодно)->Кнопка Далее-> None (вид проекта).
Далее копируем код в файла проекта, который создасться автоматически с именем *ваше название*.asm, ассемблируем и запускаем. В последующем инструкции по пользованию RadAsm выложим в на сайте (Блог->Кодинг->Общие вопросы).
Теория:
Меню - это pазновидность pесуpсов. Есть несколько видов pесуpсов, таких как диалоговые окна, стpоковые таблицы, иконки, битмапы, меню и т.д. Ресуpсы описываются в отдельном файле, называющемся файлом pесуpсов, котоpый, как пpавило, имеет pасшиpение .rc. Вы можете соединять pесуpсы с исходным кодом во вpемя стадии линковки. Окончательный пpодукт - это исполняемый файл, котоpый содеpжит как инстpукции, так и pесуpсы.
Вы можете писать файлы pесуpсов, используя любой текстовый pедактоp. Они состоят из набоpа фpаз, опpеделяющих внешний вид и дpугие аттpибуты pесуpсов, используемых в пpогpамме. Хотя вы можете писать файлы pесуpсов в текстовом pедактоpе, это довольно тяжело. Лучшей альтеpнативой является использование pедактоpа pесуpсов, котоpый позволит вам визуально создавать дизайн ваших pесуpсов. Редактоpы pесуpсов обычно входят в пакет с компилятоpоми или средами разработки (RadAsm). Для fasm мы используем GoRC Resource Compiler. Подробную информацию можно найти в Интернете, а также в папке FASM64\fasm\Bin\ архива наших преднастроенных программ.
Код:
format PE GUI 4.0 ;fasm x32 tutorial - http://mykeylogger.biz entry start include '%fasminc%\win32a.inc' section '.data' data readable writeable ;fasm assembler tutorial wHMain dd ? wHInstance dd ? wTitle db 'Tutorial 8',0 ;fasm x32 assembler tutorial wClsName db 'TUT08',0 ;fasm x32 assembler tutorial wMsg MSG wCls WNDCLASS expBoxTitle db 'Menu Action Description',0 expBoxDesc11 db 'MenuBar A -> MenuItem A',0 expBoxDesc12 db 'MenuBar A -> MenuItem B',0 expBoxDesc13 db 'MenuBar A -> MenuItem C',0 expBoxDesc21 db 'MenuBar B -> MenuItem A',0 expBoxDesc30 db 'MenuBar C (Without Item)',0 section '.code' code readable executable ;fasm x32 assembler tutorial start: ; +------------------------------+ ; | registering the window class | ; +------------------------------+ invoke GetModuleHandle,NULL mov [wHInstance],eax mov [wCls.hInstance],eax mov [wCls.style],CS_HREDRAW or CS_VREDRAW ;fasm x32 assembler tutorial 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 ;fasm x32 assembler tutorial mov [wCls.hCursor],eax invoke RegisterClass,wCls invoke LoadMenu,[wHInstance],30 ; +--------------------------+ ; | creating the main window | ; +--------------------------+ invoke CreateWindowEx,\ 0,\ wClsName,\ wTitle,\ WS_OVERLAPPEDWINDOW,\ CW_USEDEFAULT,\ CW_USEDEFAULT,\ CW_USEDEFAULT,\ CW_USEDEFAULT,\ NULL,\ eax,\ [wHInstance],\ NULL mov [wHMain],eax invoke ShowWindow,[wHMain],SW_SHOW ; +---------------------------+ ; | entering the message loop | ; +---------------------------+ window_message_loop_start: invoke GetMessage,wMsg,NULL,0,0 or eax,eax je window_message_loop_end ;fasm x32 assembler tutorial 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 ;fasm x32 assembler tutorial push ebx esi edi ;eventhough the API would preserved, but play safe :p cmp [uMsg],WM_COMMAND je wmCOMMAND cmp [uMsg],WM_DESTROY je wmDESTROY wmDEFAULT: invoke DefWindowProc,[hWnd],[uMsg],[wParam],[lParam] jmp wmBYE wmCOMMAND: mov eax,[wParam] cmp ax,11 je wmCOMMAND_11 cmp ax,12 je wmCOMMAND_12 ;fasm x32 assembler tutorial cmp ax,13 je wmCOMMAND_13 cmp ax,21 je wmCOMMAND_21 ;fasm x32 assembler tutorial cmp ax,30 je wmCOMMAND_30 jmp wmDEFAULT wmCOMMAND_11: invoke MessageBox,[hWnd],expBoxDesc11,expBoxTitle,MB_OK ;fasm x32 assembler tutorial jmp wmBYE wmCOMMAND_12: invoke MessageBox,[hWnd],expBoxDesc12,expBoxTitle,MB_OK ;fasm x32 assembler tutorial jmp wmBYE wmCOMMAND_13: invoke MessageBox,[hWnd],expBoxDesc13,expBoxTitle,MB_OK jmp wmBYE wmCOMMAND_21: invoke MessageBox,[hWnd],expBoxDesc21,expBoxTitle,MB_OK ;fasm x32 assembler tutorial jmp wmBYE wmCOMMAND_30: invoke MessageBox,[hWnd],expBoxDesc30,expBoxTitle,MB_OK jmp wmBYE wmDESTROY: invoke PostQuitMessage,0 ;fasm x32 assembler tutorial wmBYE: pop edi esi ebx ret endp section '.idata' import data readable writeable ;fasm x32 assembler tutorial library KERNEL32, 'KERNEL32.DLL',\ USER32, 'USER32.DLL' import KERNEL32,\ GetModuleHandle, 'GetModuleHandleA',\ ExitProcess, 'ExitProcess' import USER32,\ RegisterClass, 'RegisterClassA',\ CreateWindowEx, 'CreateWindowExA',\ DefWindowProc, 'DefWindowProcA',\ ShowWindow, 'ShowWindow',\ LoadCursor, 'LoadCursorA',\ LoadIcon, 'LoadIconA',\ LoadMenu, 'LoadMenuA',\ GetMessage, 'GetMessageA',\ MessageBox, 'MessageBoxA',\ TranslateMessage, 'TranslateMessage',\ DispatchMessage, 'DispatchMessageA',\ PostQuitMessage, 'PostQuitMessage' section '.rsrc' resource data readable ;fasm x32 assembler tutorial - http://mykeylogger.biz directory RT_MENU,appMenu resource appMenu,\ 30,LANG_ENGLISH,menuMain menu menuMain menuitem 'MenuBar A',10,MFR_POPUP menuitem 'MenuBar A -> MenuItem A',11,MFT_STRING menuitem 'MenuBar A -> MenuItem B',12,MFT_STRING menuseparator menuitem 'MenuBar A -> MenuItem C',13,MFR_END menuitem 'MenuBar B',20,MFR_POPUP menuitem 'MenuBar B -> MenuItem A',21,MFR_END menuitem 'MenuBar C (Without Item)',30,MFR_END
Результат :
Справка : Код работоспособен. Использован ассемблер fasm. Для 32-битной операционной системы (x86 или если нравится - x32) Windows. Копируем и вставляем в свой проект.