Курсовая работа: Текстовий редактор під Windows
Название: Текстовий редактор під Windows Раздел: Рефераты по информатике, программированию Тип: курсовая работа |
Міністерство освіти та науки України Кіровоградський Державний Технічний університет Кафедра програмного забезпечення Курсова робота з дисципліни “Програмування на мові ASM-86” на тему: Текстовий редактор під Windows Зміст 1. Вступ 2. Постановка задачі 3. Обґрунтування вибору методів розв’язку задачі 4. Алгоритм програми 5. Реалізація програми 6. Системні вимоги 7. Інструкція для користувача 8. Висновки 9. Використана література Додаток 1. ВступТепер комп’ютери відіграють у житті людини все більшу та більш роль. Раніше, коли ще не було комп’ютерів, чи вони були мало розповсюдженні, все робилося вручну. Коли комп’ютери одержали широке розповсюдження, комп’ютер став допомагати людині, бо він може багато операцій робити набагато швидше, ніж людина. Інформація - цінна річ, тому для її збереження в сучасному суспільстві використовують все частіше персональний комп‘ютер. При перегляді текстових файлів виникає потреба в зручних в користуванні та розумінні програм переглядачів текстових файлів. 2. Постановка задачіРозробити текстовий редактор під Windows (типу Notepad) на мові програмування ASM-86. Програма повинна виконувати основні дії над введеним текстом.
3. Обґрунтування вибору методів розв’язку задачіОтже, необхідно написати текстовий редактор під Windows. Дана програма призначена для перегляду текстових файлів різного розміру. Програма може бути використана будь яким користувачем ЕОМ для перегляду потрібної інформації. При виборі алгоритму програми у мене не виникло варіантів. Тут все дуже просто. В Windows вже є функції API для роботи з текстом, іх тільки потрібно правильно викликати. Ще потрібно правильно написати обробники повідомлень.
4. Алгоритм програмиЧитаємо командний рядок. Читаємо іконку та курсор з ресурсів. Будування головного вікна. Ініціалізація акселераторів. Отримання повідомлення Якщо це WM_QUIT, то перехід до пункту 11. Перетворимо акселератори в IDM* Перетворимо повідомлення від клавіш Відішлемо назад. Перехід до пункту 5. Закінчити програму. 5. Реалізація програмиПрограма написана на мові ASM-86 з використанням команд процесора 386. Вона складається з головної програми, яка читає командний рядок, будує головне вікно, та організує головний цикл програми. Та з обробників повідомлень вікна, які і викликають функції для роботи з текстом. Вона працює на будь якій машині де WINDOWS. При написанні програми для реалізації роботи з текстом та файлом були використані функції API WINDOWS. Програма компілюється Turbo Assembler, зв’язується за допомогою TLINK32, та компілюються ресурси за допомогою brcc32. tasm /m /ml /D_TASM_ winpad. asm brcc32 winpad. rc tlink32 /Tpe /aa /c /x winpad. obj,,,,,winpad. res
6. Системні вимогиIBM сумісний комп’ютер із мікропроцесором Intel 80386 або старшим. Операційна система - Windows 3.1 або старша Пам’ять - 2M і вище
7. Інструкція для користувачаДля запуску текстового редактора під Windows, потрібно зайти в меню “Пуск", вибрати “Выполнить” та в командному рядку набрати Notepad. Exe та натиснути Enter. Також можна набрати ім’я файлу, який потрібно редагувати. Після запуску програми з’являється оболонка, в якій вже можна набирати текст, причому, можна використовувати операції з блоком. Також, в програмі є меню, в якому є опції для читання файлу, для запису файлу, для операцій з буфером, та вивід інформації про програму. 8. ВисновкиОтже, на мові ASM-86 створено текстовий редактор під Windows (типу Notepad). При постійній роботі з комп‘ютером досить часто потрібно переглянути файл. Тому дана програма є незамінною в роботі. Вона є простою в користуванні та розумінні. Під час написання цієї програми був розібраний метод писання програм під Windows. 9. Використана література1) “Програмування на мові Асемблера ЕС ЕВМ" З.С. Брич, В.I. Воющ Москва 1989 р. ст. 166 2).“Програмування на сучасних мовах програмування”. Москва 1990 р. ст. 206 3) “Основи мови” Асемблер” В.I. Криволап. Москва 1997р. ст.309 4) “Ассемблер для початкiвцiв” М.П. Шукiн. Київ 1980р. ст.155 5) “Турбо Асемблер” Л.В. Захаров. Харків 1995 р ст.178 6) “Макро Асемблер” К.С. Кропiйко, О.Д. Богатирова. Київ - “Наука” 1991р. 7) Електронний довідник BOOK. Додаток
Лістинг програми
; winpad. asm ; Графическое win32-приложение - текстовый редактор ; ; Компиляция TASM ; tasm /m /ml /D_TASM_ winpad. asm ; brcc32 winpad. rc ; tlink32 /Tpe /aa /c /x winpad. obj,,,,,winpad. res include def32. inc include user32. inc include kernel32. inc include comdlg32. inc ID_MENUequ700h ID_ACCELequ701h ID_ABOUTequ702h MAXSIZE equ 260; максимальное имя файла MEMSIZEequ 65535; максимальный размер временного буфера в памяти EditIDequ 1 .386 . model flat . const c_w_namedb 'Asmpad95',0; это и имя класса и имя основного окна edit_classdb 'edit',0; предопределённое имя класса для редактора changes_msgdb 'Save changes? ',0 filter_stringdb 'All Files',0,'*. *',0; маски для Get*FileName db 'Text Files',0,'*. txt',0,0 . data ; структура, использующаяся Get*FileName ofnOPENFILENAME <SIZE ofn,?,?,offset filter_string,?,?,?,offset buffer,MAXSIZE,0,?,?,?,?,?,?,0,?,?,? > ; стурктура, описывающая наш основной класс wcWNDCLASSEX <SIZE WNDCLASSEX,CS_HREDRAW or CS_VREDRAW,offset win_proc,0,0,?,?,?,COLOR_WINDOW+1, ID_MENU,offset c_w_name,0> flag_untitleddb1; = 1 если имя файла не определено (новый файл) . data? h_editwindowdd? ; идентификатор окна редактора h_acceldd? ; идентификатор массива акселераторов p_memorydd? ; адрес буфера в памяти SizeReadWritedd? msg_MSG<> recRECT<> bufferdbMAXSIZE dup (?) ; имя файла window_titledbMAXSIZE dup (?), 12 dup (?) . code _start: callGetCommandLine; получим нашу командную строку movedi,eax moval,' ' movecx,MAXSIZE repnescasb; найдём конец имени нашей программы cmpbyte ptr [edi],0 jecmdline_empty movesi,edi movedi,offset buffer repmovsb movflag_untitled,0 cmdline_empty: ; подготовим и зарегистрируем класс xorebx,ebx callGetModuleHandle; определим наш идентификатор movesi,eax movwc. hInstance,eax; и сохраним его в wc. hInstance movofn. _hInstance,eax pushIDI_APPLICATION; или IDI_ICON если иконка есть в ресурсах pushebx; или esi если иконка есть в ресурсах callLoadIcon movwc. hIcon,eax pushIDC_ARROW; предопределённый курсор (стрелка) pushebx callLoadCursor movwc. hCursor,eax pushoffset wc callRegisterClassEx ; создадим основное окно pushebx pushesi pushebx pushebx push400 push600 pushCW_USEDEFAULT pushCW_USEDEFAULT pushWS_OVERLAPPEDWINDOW pushoffset c_w_name pushoffset c_w_name pushWS_EX_CLIENTEDGE callCreateWindowEx pusheax; для pop esi перед message_loop pusheax pushSW_SHOWNORMAL pusheax callShowWindow callUpdateWindow ; инициализируем акселераторы pushID_ACCEL pushesi callLoadAccelerators movh_accel,eax ; цикл ожидания сообщения popesi; ESI - идентификатор основного окна movedi,offset msg_; EDI - структура с сообщением от него message_loop: pushebx pushebx pushebx pushedi callGetMessage; получим сообщение testeax,eax; если это WM_QUIT jzexit_msg_loop; выйти из цикла pushedi pushh_accel pushesi; hWnd callTranslateAccelerator; преобразуем акселераторы в IDM* testeax,eax jnzmessage_loop pushedi callTranslateMessage; преобразуем сообщения от клавиш pushedi callDispatchMessage; и отошлём обратно jmp short message_loop exit_msg_loop: pushmsg_. wParam callExitProcess; конец программы ; процедура win_proc ; ; процедура не должна изменять регистры EBP,EDI,ESI и EBX! win_proc proc near ; параметры (с учётом push ebp) wp_hWnd equ dword ptr [ebp+08h] wp_uMsg equ dword ptr [ebp+0Ch] wp_wParam equ dword ptr [ebp+10h] wp_lParam equ dword ptr [ebp+14h] ; инициализируем стековый кадр pushebp movebp,esp; создадим стековый кадр pusha; сохраним все регистры xorebx,ebx; 0 для команд push 0 movesi,wp_hWnd; для команд push hWnd moveax,wp_uMsg ; обработаем пришедшее сообщение cmpeax,WM_CREATE jeh_wm_create cmpeax,WM_SIZE jeh_wm_size cmpeax,WM_DESTROY jeh_wm_destroy cmpeax,WM_COMMAND jeh_wm_command cmpeax,WM_ACTIVATE jeh_wm_activate cmpeax,WM_CLOSE jeh_wm_close def_proc: popa leave; если это ненужное сообщение jmpDefWindowProc; оставить его обработчику по умолчанию ; ; обработчик WM_CLOSE ; если нужно, спрашивает, сохранить ли файл h_wm_close: callsave_catchword jmp short def_proc ; ; обработчик WM_CREATE ; h_wm_create: ; здесь также можно создать toolbar и statusbar ; создадим окно редактора pushebx pushwc. hInstance; идентификатор основной программы pushEditID pushesi; hWnd pushebx; 0 pushebx; 0 pushebx; 0 pushebx; 0 pushWS_VISIBLE or WS_CHILD or ES_LEFT or ES_MULTILINE or ES_AUTOHSCROLL or ES_AUTOVSCROLL pushebx; 0 pushoffset edit_class pushebx; 0 callCreateWindowEx movh_editwindow,eax ; передадим ему фокус pusheax callSetFocus cmpflag_untitled,1 jecontinue_create callskip_getopen; откроем файл, указанный в командной строке continue_create: callset_title jmp end_wm_check ; ; обработчик WM_COMMAND ; h_wm_command: moveax,wp_wParam cwde; low word contains IDM_* subeax,100h jbdef_proc ; обработаем сообщения от пунктов меню call dword ptr menu_handlers [eax*4] jmp end_wm_check menu_handlersdd offset h_idm_new,offset h_idm_open,offset h_idm_save dd offset h_idm_saveas,offset h_idm_exit,offset h_idm_about dd offset h_idm_undo, offset h_idm_cut, offset h_idm_copy dd offset h_idm_paste, offset h_idm_clear, offset h_idm_setsel ; сообщения от пунктов меню должны быть описаны в win95pad. rc именно в таком ; порядке - от IDM_NEW 100h до IDM_CLEAR 10Ah h_idm_setsel: push-1; - 1 pushebx; 0 pushEM_SETSEL; выделить весь текст pushh_editwindow callSendMessage ret ; обработчики сообщений из меню EDIT: h_idm_clear: moveax,WM_CLEAR jmp short send_to_editor h_idm_paste: moveax,WM_PASTE jmp short send_to_editor h_idm_copy: moveax,WM_COPY jmp short send_to_editor h_idm_cut: moveax,WM_CUT jmp short send_to_editor h_idm_undo: moveax,EM_UNDO send_to_editor: pushebx; 0 pushebx; 0 pusheax pushh_editwindow callSendMessage ret ; обработчик IDM_NEW h_idm_new: callsave_catchword; запишем файл если нужно movbyte ptr flag_untitled,1 callset_title; отметим что файл не назван pushebx pushebx pushWM_SETTEXT pushh_editwindow callSendMessage; пошлём пустой WM_SETTEXT редактору ret ; обработчик IDM_ABOUT h_idm_about: pushebx; 0 pushoffset about_proc pushesi; hWnd pushID_ABOUT pushwc. hInstance callDialogBoxParam ret ; обработчик IDM_SAVEAS и IDM_SAVE h_idm_save: cmpflag_untitled,1; если файл назван jneskip_getsave; пропустим вызов GetSaveFileName h_idm_saveas: ; спросим имя файла movofn. Flags,OFN_EXPLORER or OFN_OVERWRITEPROMPT pushoffset ofn callGetSaveFileName testeax,eax jzfile_save_failed skip_getsave: ; создадим его pushebx pushFILE_ATTRIBUTE_ARCHIVE pushCREATE_ALWAYS pushebx pushFILE_SHARE_READ or FILE_SHARE_WRITE pushGENERIC_READ or GENERIC_WRITE pushoffset buffer callCreateFile movedi,eax ; выделим память pushMEMSIZE pushGMEM_MOVEABLE or GMEM_ZEROINIT callGlobalAlloc pusheax; hMemory для GlobalFree pusheax; hMemory для GlobalLock callGlobalLock movesi,eax; адрес буфера в ESI ; заберём текст из редактора pushesi pushMEMSIZE-1 pushWM_GETTEXT pushh_editwindow callSendMessage ; запишем в файл pushesi; pMemory calllstrlen pushebx pushoffset SizeReadWrite pusheax; размер буфера pushesi; адрес буфера pushedi; идентификатор файла callWriteFile pushesi; pMemory callGlobalUnlock callGlobalFree; hMemory уже в стеке pushedi; идентификатор файла callCloseHandle ; сбросим флаг модификации в редакторе pushebx pushebx pushEM_SETMODIFY pushh_editwindow callSendMessage movbyte ptr flag_untitled,0 callset_title file_save_failed: pushh_editwindow callSetFocus ret ; обработчик IDM_OPEN h_idm_open: callsave_catchword ; вызовем стандартный диалог выбора имени файла movofn. Flags, OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or OFN_EXPLORER pushoffset ofn callGetOpenFileName testeax,eax jzfile_open_failed skip_getopen: ; откроем выбранный файл pushebx pushFILE_ATTRIBUTE_ARCHIVE pushOPEN_EXISTING pushebx pushFILE_SHARE_READ or FILE_SHARE_WRITE pushGENERIC_READ or GENERIC_WRITE pushoffset buffer callCreateFile movedi,eax; идентификатор для ReadFile ; выделим память pushMEMSIZE pushGMEM_MOVEABLE or GMEM_ZEROINIT callGlobalAlloc pusheax; hMemory для GlobalFree pusheax; hMemory для GlobalLock callGlobalLock; получим адрес выделенной памяти pusheax; pMemory для GlobalUnlock pusheax; pMemory для SendMessage ; прочитаем файл pushebx pushoffset SizeReadWrite pushMEMSIZE-1 pusheax; pMemory для ReadFile pushedi callReadFile ; пошлём окну редактора сообщение wm_settext чтобы он забрал текст из буфера pushebx; pMemory уже в стеке pushWM_SETTEXT pushh_editwindow callSendMessage ; а теперь можно закрыть файл и освободить память callGlobalUnlock; pMemory уже в стеке callGlobalFree; hMemory уже в стеке pushedi; hFile callCloseHandle; movbyte ptr flag_untitled,0 callset_title file_open_failed: pushh_editwindow callSetFocus ret ; обработчик IDM_EXIT h_idm_exit: callsave_catchword pushesi; hWnd callDestroyWindow; уничтожить наше окно ret ; ; обработчик WM_SIZE ; h_wm_size: ; здесь также надо послать WM_SIZE окнам toolbar и statusbar ; изменим размер окна редактора так чтобы оно по-прежнему было на всё окно pushoffset rec pushesi; hWnd callGetClientRect push1; true pushrec. bottom; height pushrec. right; width pushebx; y pushebx; x pushh_editwindow callMoveWindow jmp short end_wm_check ; ; обработчик WM_ACTIVATE ; h_wm_activate: pushh_editwindow callSetFocus jmp short end_wm_check ; ; обработчик WM_DESTROY ; h_wm_destroy: pushebx callPostQuitMessage; послать WM_QUIT основной программе end_wm_check: popa xor eax,eax; вернуть 0 leave ret16 ; процедура set_title ; устанавливает новый заголовок для основного окна set_title: pushesi pushedi movedi,offset window_title cmpbyte ptr flag_untitled,1; если у файла нет имени jeuntitled; использовать Untitled movesi,ofn. lpstrFile; [ESI] - имя файла с путём movzxeax,ofn. nFileOffset; eax - начало имени файла addesi,eax copy_filename: lodsb; скопирем файл побайтово в название окна testal,al jzadd_progname; пока не встретится ноль stosb jmp short copy_filename add_progname: movdword ptr [edi],' - '; припишем минус addedi,3 movesi,offset c_w_name movecx,9; и название программы rep movsb popedi popesi pushoffset window_title pushesi; идентификатор окна callSetWindowText ret untitled: movdword ptr [edi],'itnU'; допишем "Unti" movdword ptr [edi+4],'delt'; допишем "tled" addedi,8 jmp short add_progname ; процедура save_catchword ; EBX=0, ESI=hWnd save_catchword: ; спросим редактор, изменялся ли текст pushebx pushebx pushEM_GETMODIFY pushh_editwindow callSendMessage testeax,eax jznot_modified ; спросим пользователя, сохранять ли его pushMB_YESNO + MB_ICONWARNING pushoffset c_w_name pushoffset changes_msg pushesi callMessageBox cmpeax, IDYES jnenot_modified ; сохраним его callh_idm_save not_modified: ret win_proc endp about_proc proc near ; параметры (с учётом push ebp) ap_hDlg equ dword ptr [ebp+08h] ap_uMsg equ dword ptr [ebp+0Ch] ap_wParam equ dword ptr [ebp+10h] ap_lParam equ dword ptr [ebp+14h] pushebp movebp,esp; создадим стековый кадр cmpap_uMsg,WM_COMMAND jnedont_proceed cmpap_wParam, IDOK jnedont_proceed push1 pushap_hDlg callEndDialog dont_proceed: xoreax,eax; not processed leave ret 16 about_proc endp end_start ; comdlg32. inc ; включаемый файл с определениями функций из comdlg32. dll ; ifdef _TASM_ includelib import32. lib ; имена используемых функций extrnGetOpenFileNameA: near extrnGetSaveFileNameA: near ; присваивания для облегчения читаемости кода GetOpenFileNameequGetOpenFileNameA GetSaveFileNameequGetSaveFileNameA else includelib comdlg32. lib ; истинные имена используемых функций extrn__imp__GetOpenFileNameA@4: dword extrn__imp__GetSaveFileNameA@4: dword ; присваивания для облегчения читаемости кода GetOpenFileNameequ__imp__GetOpenFileNameA@4 GetSaveFileNameequ__imp__GetSaveFileNameA@4 Endif ; def32. inc ; файл с определениями констант и типов для примеров под win32 ; из winbase. h STD_OUTPUT_HANDLEequ-11 OPEN_EXISTINGequ3 CREATE_ALWAYSequ2 GMEM_MOVEABLEequ2 GMEM_ZEROINITequ40h ; из windef. h RECTstruc leftdd? topdd? rightdd? bottomdd? RECTends ; из winerror. h NO_ERRORequ0 ERROR_NO_MORE_ITEMSequ259 ; из winnetwk. h RESOURCEUSAGE_CONNECTABLEequ 1 RESOURCETYPE_ANYequ0 RESOURCE_CONNECTEDequ1 NTRESOURCE struc dwScopedd? dwTypedd? dwDisplayTypedd? dwUsagedd? lpLocalNamedd? lpRemoteNamedd? lpCommentdd? lpProviderdd? NTRESOURCE ends ; из winnt. h GENERIC_READequ80000000h GENERIC_WRITEequ40000000h FILE_SHARE_READequ1 FILE_SHARE_WRITEequ2 FILE_ATTRIBUTE_ARCHIVEequ20h ; из winuser. h MB_OKequ0 MB_ICONINFORMATIONequ40h IDC_ARROWequ32512 IDI_APPLICATIONequ32512 WS_OVERLAPPEDWINDOW equ0CF0000h WM_DESTROYequ2 WM_COMMANDequ111h WM_INITDIALOGequ110h WM_CLOSEequ10h CS_HREDRAWequ2 CS_VREDRAWequ1 CW_USEDEFAULTequ80000000h SW_SHOWNORMALequ1 COLOR_WINDOWequ5 BN_CLICKEDequ0 WNDCLASSEXstruc cbSizedd? styledd? lpfnWndProcdd? cbClsExtradd? cbWndExtradd? hInstancedd? hIcondd? hCursordd? hbrBackgrounddd? lpszMenuNamedd? lpszClassNamedd? hIconSmdd? WNDCLASSEXends MSGstruc hwnddd? messagedd? wParamdd? lParamdd? timedd? ptdd? MSGends ; из winuser. h WM_CREATEequ1 WM_ACTIVATEequ6 WM_SETTEXTequ0Ch WM_GETTEXTequ0Dh WM_CUTequ300h WM_COPYequ301h WM_PASTEequ302h WM_CLEARequ303h WM_UNDOequ304h WM_SIZEequ5 WS_VISIBLEequ10000000h WS_CHILDequ40000000h WS_EX_CLIENTEDGE equ200h ES_LEFTequ0 ES_MULTILINEequ4 ES_AUTOHSCROLLequ80h ES_AUTOVSCROLLequ40h EM_GETHANDLEequ0BDh EM_GETMODIFYequ0B8h EM_SETMODIFYequ0B9h EM_UNDOequ0C7h EM_SETSELequ0B1h MB_YESNOequ4 MB_ICONWARNINGequ30h IDOKequ1 IDYESequ6 ; из commdlg. h OFN_PATHMUSTEXISTequ800h OFN_FILEMUSTEXISTequ1000h OFN_EXPLORERequ80000h OFN_OVERWRITEPROMPTequ2 OPENFILENAMEstruc lStructSizedd? hwndOwnerdd? _hInstancedd? lpstrFilterdd? lpstrCustomFilter dd? nMaxCustFilterdd? nFilterIndexdd? lpstrFiledd? nMaxFiledd? lpstrFileTitledd? nMaxFileTitledd? lpstrInitialDirdd? lpstrTitledd? Flagsdd? nFileOffsetdw? nFileExtensiondw? lpstrDefExtdd? lCustDatadd? lpfnHookdd? lpTemplateNamedd? OPENFILENAMEends ; user32. inc ; включаемый файл с определениями функций из user32. dll ; ifdef _TASM_ includelib import32. lib ; имена используемых функций extrnMessageBoxA: near extrnDispatchMessageA: near extrnTranslateMessage: near extrnGetMessageA: near extrnLoadIconA: near extrnUpdateWindow: near extrnShowWindow: near extrnCreateWindowExA: near extrnDefWindowProcA: near extrnPostQuitMessage: near extrnRegisterClassExA: near extrnLoadCursorA: near extrnLoadMenuA: near extrnDestroyWindow: near extrnDialogBoxParamA: near extrnGetDlgItem: near extrnSetFocus: near extrnGetDlgItemTextA: near extrnSetDlgItemTextA: near extrnEndDialog: near extrnLoadAcceleratorsA: near extrnTranslateAccelerator: near extrnSendMessageA: near extrnSetWindowTextA: near extrnMoveWindow: near extrnGetClientRect: near extrnGlobalUnlock: near ; присваивания для облегчения читаемости кода MessageBoxequMessageBoxA DispatchMessageequDispatchMessageA GetMessageequGetMessageA LoadIconequLoadIconA CreateWindowExequCreateWindowExA DefWindowProcequDefWindowProcA RegisterClassExequRegisterClassExA LoadCursorequLoadCursorA LoadMenuequLoadMenuA DialogBoxParamequDialogBoxParamA GetDlgItemTextequGetDlgItemTextA SetDlgItemTextequSetDlgItemTextA LoadAccelerators equLoadAcceleratorsA SendMessageequSendMessageA SetWindowTextequSetWindowTextA else includelib user32. lib ; истинные имена используемых функций extrn__imp__MessageBoxA@16: dword extrn__imp__DispatchMessageA@4: dword extrn__imp__TranslateMessage@4: dword extrn__imp__GetMessageA@16: dword extrn__imp__LoadIconA@8: dword extrn__imp__UpdateWindow@4: dword extrn__imp__ShowWindow@8: dword extrn__imp__CreateWindowExA@48: dword extrn__imp__DefWindowProcA@16: dword extrn__imp__PostQuitMessage@4: dword extrn__imp__RegisterClassExA@4: dword extrn__imp__LoadCursorA@8: dword extrn__imp__LoadMenuA@8: dword extrn__imp__DestroyWindow@4: dword extrn__imp__DialogBoxParamA@20: dword extrn__imp__GetDlgItem@8: dword extrn__imp__SetFocus@4: dword extrn__imp__GetDlgItemTextA@16: dword extrn__imp__SetDlgItemTextA@12: dword extrn__imp__EndDialog@8: dword extrn__imp__LoadAcceleratorsA@8: dword extrn__imp__TranslateAccelerator@12: dword extrn__imp__SendMessageA@16: dword extrn__imp__SetWindowTextA@8: dword extrn__imp__MoveWindow@24: dword extrn__imp__GetClientRect@8: dword extrn__imp__GlobalUnlock@4: dword ; присваивания для облегчения читаемости кода MessageBoxequ__imp__MessageBoxA@16 DispatchMessageequ__imp__DispatchMessageA@4 TranslateMessage equ__imp__TranslateMessage@4 GetMessageequ__imp__GetMessageA@16 LoadIconequ__imp__LoadIconA@8 UpdateWindowequ__imp__UpdateWindow@4 ShowWindowequ__imp__ShowWindow@8 CreateWindowExequ__imp__CreateWindowExA@48 DefWindowProcequ__imp__DefWindowProcA@16 PostQuitMessageequ__imp__PostQuitMessage@4 RegisterClassExequ__imp__RegisterClassExA@4 LoadCursorequ__imp__LoadCursorA@8 LoadMenuequ__imp__LoadMenuA@8 DestroyWindowequ__imp__DestroyWindow@4 DialogBoxParamequ__imp__DialogBoxParamA@20 GetDlgItemequ__imp__GetDlgItem@8 SetFocusequ__imp__SetFocus@4 GetDlgItemTextequ__imp__GetDlgItemTextA@16 SetDlgItemTextequ__imp__SetDlgItemTextA@12 EndDialogequ__imp__EndDialog@8 LoadAccelerators equ__imp__LoadAcceleratorsA@8 TranslateAccelerator equ __imp__TranslateAccelerator@12 SendMessageequ__imp__SendMessageA@16 SetWindowTextequ__imp__SetWindowTextA@8 MoveWindowequ__imp__MoveWindow@24 GetClientRectequ__imp__GetClientRect@8 GlobalUnlockequ__imp__GlobalUnlock@4 Endif // winpad95. rc // файл ресурсов для программы winpad95. asm // // идентификаторы сообщений от пунктов меню #define IDM_NEW0x100L #define IDM_OPEN0x101L #define IDM_SAVE0x102L #define IDM_SAVEAS0x103L #define IDM_EXIT0x104L #define IDM_ABOUT0x105L #define IDM_UNDO0x106L #define IDM_CUT0x107L #define IDM_COPY0x108L #define IDM_PASTE0x109L #define IDM_CLEAR0x10AL #define IDM_SETSEL0x10BL // идентификаторы основных ресурсов #define ID_MENU0x700L #define ID_ACCEL 0x701L #define ID_ABOUT0x702L // если есть иконка - можно раскомментировать следующие две строки // #define ID_ICON 0x703L // ID_ICON ICON "winpad95. ico" // основное меню ID_MENU MENU DISCARDABLE { POPUP "&File" { MENUITEM "&New\tCtrl+N", IDM_NEW MENUITEM "&Open... \tCtrl+O", IDM_OPEN MENUITEM "&Save\tCtrl+S", IDM_SAVE MENUITEM "Save &As... \tCtrl+Shift+S", IDM_SAVEAS MENUITEM SEPARATOR MENUITEM "E&xit\tCtrl+Q", IDM_EXIT } POPUP "&Edit" { MENUITEM "&Undo\tCtrl-Z", IDM_UNDO MENUITEM SEPARATOR MENUITEM "Cu&t\tCtrl-X", IDM_CUT MENUITEM "&Copy\tCtrl-C", IDM_COPY MENUITEM "&Paste\tCtrl-V", IDM_PASTE MENUITEM "&Delete\tDel", IDM_CLEAR MENUITEM SEPARATOR MENUITEM "Select &All\tCtrl-A", IDM_SETSEL } POPUP "&Help" { MENUITEM "About", IDM_ABOUT } } // комбинации клавиш ID_ACCEL ACCELERATORS DISCARDABLE { "N", IDM_NEW, CONTROL, VIRTKEY "O", IDM_OPEN, CONTROL, VIRTKEY "S", IDM_SAVE, CONTROL, VIRTKEY "S", IDM_SAVEAS, CONTROL, SHIFT, VIRTKEY "Q", IDM_EXIT, CONTROL, VIRTKEY "Z", IDM_UNDO, CONTROL, VIRTKEY "A", IDM_SETSEL, CONTROL, VIRTKEY } // все эти определения можно заменить на #include <winuser. h> #define DS_MODALFRAME0x80L #define DS_3DLOOK4 #define WS_POPUP0x80000000L #define WS_CAPTION0xC00000L #define WS_SYSMENU0x80000L #define IDOK1 #define IDC_STATIC-1 #define IDI_APPLICATION 32512 #define WS_BORDER0x800000L // стандартный диалог "About" ID_ABOUT DIALOG DISCARDABLE 0,0,125,75 STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "About Asmpad95" { ICONIDI_APPLICATION, IDC_STATIC,12,15,21, 20 CTEXT"Asmpad95", IDC_STATIC,0,30,40,8 CTEXT"Prototype notepad-style editor for Windows 95 written entirely in assembly language", IDC_STATIC,45,10,70,45,WS_BORDER DEFPUSHBUTTON"OK", IDOK,40,60,40,12 } |