|
Текстовий редактор під Windows |
Текстовий редактор під Windows
2 Міністерство освіти та науки України Кіровоградський Державний Технічний університет Кафедра програмного забезпечення Курсова робота з дисципліни “Програмування на мові 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. asmbrcc32 winpad. rctlink32 /Tpe /aa /c /x winpad. obj,,,,,winpad. res6. Системні вимогиIBM сумісний комп'ютер із мікропроцесором Intel 80386 або старшим.Операційна система - Windows 3.1 або старшаПам'ять - 2M і вище7. Інструкція для користувачаДля запуску текстового редактора під Windows, потрібно зайти в меню “Пуск", вибрати “Выполнить” та в командному рядку набрати Notepad. Exe та натиснути Enter. Також можна набрати ім'я файлу, який потрібно редагувати.Після запуску програми з'являється оболонка, в якій вже можна набирати текст, причому, можна використовувати операції з блоком. Також, в програмі є меню, в якому є опції для читання файлу, для запису файлу, для операцій з буфером, та вивід інформації про програму.8. ВисновкиОтже, на мові ASM-86 створено текстовий редактор під Windows (типу Notepad). При постійній роботі з комп`ютером досить часто потрібно переглянути файл. Тому дана програма є незамінною в роботі. Вона є простою в користуванні та розумінні. Під час написання цієї програми був розібраний метод писання програм під Windows.9. Використана література1) “Програмування на мові Асемблера ЕС ЕВМ" З.С. Брич, В.I. Воющ Москва 1989 р. ст. 1662).“Програмування на сучасних мовах програмування”. Москва 1990 р. ст. 2063) “Основи мови” Асемблер” В.I. Криволап. Москва 1997р. ст.3094) “Ассемблер для початкiвцiв” М.П. Шукiн. Київ 1980р. ст.1555) “Турбо Асемблер” Л.В. Захаров. Харків 1995 р ст.1786) “Макро Асемблер” К.С. Кроп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. resinclude def32. incinclude user32. incinclude kernel32. incinclude comdlg32. incID_MENUequ700hID_ACCELequ701hID_ABOUTequ702hMAXSIZE equ 260; максимальное имя файлаMEMSIZEequ 65535; максимальный размер временного буфера в памятиEditIDequ 1.386. model flat. constc_w_namedb 'Asmpad95',0; это и имя класса и имя основного окнаedit_classdb 'edit',0; предопределённое имя класса для редактораchanges_msgdb 'Save changes? ',0filter_stringdb 'All Files',0,'*. *',0; маски для Get*FileNamedb 'Text Files',0,'*. txt',0,0. data; структура, использующаяся Get*FileNameofnOPENFILENAME <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,eaxmoval,' 'movecx,MAXSIZErepnescasb; найдём конец имени нашей программыcmpbyte ptr [edi],0jecmdline_emptymovesi,edimovedi,offset bufferrepmovsbmovflag_untitled,0cmdline_empty:; подготовим и зарегистрируем классxorebx,ebxcallGetModuleHandle; определим наш идентификаторmovesi,eaxmovwc. hInstance,eax; и сохраним его в wc. hInstancemovofn. _hInstance,eaxpushIDI_APPLICATION; или IDI_ICON если иконка есть в ресурсахpushebx; или esi если иконка есть в ресурсахcallLoadIconmovwc. hIcon,eaxpushIDC_ARROW; предопределённый курсор (стрелка)pushebxcallLoadCursormovwc. hCursor,eaxpushoffset wccallRegisterClassEx; создадим основное окноpushebxpushesipushebxpushebxpush400push600pushCW_USEDEFAULTpushCW_USEDEFAULTpushWS_OVERLAPPEDWINDOWpushoffset c_w_namepushoffset c_w_namepushWS_EX_CLIENTEDGEcallCreateWindowExpusheax; для pop esi перед message_looppusheaxpushSW_SHOWNORMALpusheaxcallShowWindowcallUpdateWindow; инициализируем акселераторыpushID_ACCELpushesicallLoadAcceleratorsmovh_accel,eax; цикл ожидания сообщенияpopesi; ESI - идентификатор основного окнаmovedi,offset msg_; EDI - структура с сообщением от негоmessage_loop:pushebxpushebxpushebxpushedicallGetMessage; получим сообщениеtesteax,eax; если это WM_QUITjzexit_msg_loop; выйти из циклаpushedipushh_accelpushesi; hWndcallTranslateAccelerator; преобразуем акселераторы в IDM*testeax,eaxjnzmessage_looppushedicallTranslateMessage; преобразуем сообщения от клавишpushedicallDispatchMessage; и отошлём обратноjmp short message_loopexit_msg_loop:pushmsg_. wParamcallExitProcess; конец программы; процедура 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]; инициализируем стековый кадрpushebpmovebp,esp; создадим стековый кадрpusha; сохраним все регистрыxorebx,ebx; 0 для команд push 0movesi,wp_hWnd; для команд push hWndmoveax,wp_uMsg; обработаем пришедшее сообщениеcmpeax,WM_CREATEjeh_wm_createcmpeax,WM_SIZEjeh_wm_sizecmpeax,WM_DESTROYjeh_wm_destroycmpeax,WM_COMMANDjeh_wm_commandcmpeax,WM_ACTIVATEjeh_wm_activatecmpeax,WM_CLOSEjeh_wm_closedef_proc:popaleave; если это ненужное сообщениеjmpDefWindowProc; оставить его обработчику по умолчанию;; обработчик WM_CLOSE; если нужно, спрашивает, сохранить ли файлh_wm_close:callsave_contentsjmp short def_proc;; обработчик WM_CREATE;h_wm_create:; здесь также можно создать toolbar и statusbar; создадим окно редактораpushebxpushwc. hInstance; идентификатор основной программыpushEditIDpushesi; hWndpushebx; 0pushebx; 0pushebx; 0pushebx; 0pushWS_VISIBLE or WS_CHILD or ES_LEFT or ES_MULTILINE or ES_AUTOHSCROLL or ES_AUTOVSCROLLpushebx; 0pushoffset edit_classpushebx; 0callCreateWindowExmovh_editwindow,eax; передадим ему фокусpusheaxcallSetFocuscmpflag_untitled,1jecontinue_createcallskip_getopen; откроем файл, указанный в командной строкеcontinue_create:callset_titlejmp end_wm_check;; обработчик WM_COMMAND;h_wm_command:moveax,wp_wParamcwde; low word contains IDM_*subeax,100hjbdef_proc; обработаем сообщения от пунктов менюcall dword ptr menu_handlers [eax*4]jmp end_wm_checkmenu_handlersdd offset h_idm_new,offset h_idm_open,offset h_idm_savedd offset h_idm_saveas,offset h_idm_exit,offset h_idm_aboutdd offset h_idm_undo, offset h_idm_cut, offset h_idm_copydd offset h_idm_paste, offset h_idm_clear, offset h_idm_setsel; сообщения от пунктов меню должны быть описаны в win95pad. rc именно в таком; порядке - от IDM_NEW 100h до IDM_CLEAR 10Ahh_idm_setsel:push-1; - 1pushebx; 0pushEM_SETSEL; выделить весь текстpushh_editwindowcallSendMessageret; обработчики сообщений из меню EDIT:h_idm_clear:moveax,WM_CLEARjmp short send_to_editorh_idm_paste:moveax,WM_PASTEjmp short send_to_editorh_idm_copy:moveax,WM_COPYjmp short send_to_editorh_idm_cut:moveax,WM_CUTjmp short send_to_editorh_idm_undo:moveax,EM_UNDOsend_to_editor:pushebx; 0pushebx; 0pusheaxpushh_editwindowcallSendMessageret; обработчик IDM_NEWh_idm_new:callsave_contents; запишем файл если нужноmovbyte ptr flag_untitled,1callset_title; отметим что файл не названpushebxpushebxpushWM_SETTEXTpushh_editwindowcallSendMessage; пошлём пустой WM_SETTEXT редакторуret; обработчик IDM_ABOUTh_idm_about:pushebx; 0pushoffset about_procpushesi; hWndpushID_ABOUTpushwc. hInstancecallDialogBoxParamret; обработчик IDM_SAVEAS и IDM_SAVEh_idm_save:cmpflag_untitled,1; если файл названjneskip_getsave; пропустим вызов GetSaveFileNameh_idm_saveas:; спросим имя файлаmovofn. Flags,OFN_EXPLORER or OFN_OVERWRITEPROMPTpushoffset ofncallGetSaveFileNametesteax,eaxjzfile_save_failedskip_getsave:; создадим егоpushebxpushFILE_ATTRIBUTE_ARCHIVEpushCREATE_ALWAYSpushebxpushFILE_SHARE_READ or FILE_SHARE_WRITEpushGENERIC_READ or GENERIC_WRITEpushoffset buffercallCreateFilemovedi,eax; выделим памятьpushMEMSIZEpushGMEM_MOVEABLE or GMEM_ZEROINITcallGlobalAllocpusheax; hMemory для GlobalFreepusheax; hMemory для GlobalLockcallGlobalLockmovesi,eax; адрес буфера в ESI; заберём текст из редактораpushesipushMEMSIZE-1pushWM_GETTEXTpushh_editwindowcallSendMessage; запишем в файлpushesi; pMemorycalllstrlenpushebxpushoffset SizeReadWritepusheax; размер буфераpushesi; адрес буфераpushedi; идентификатор файлаcallWriteFilepushesi; pMemorycallGlobalUnlockcallGlobalFree; hMemory уже в стекеpushedi; идентификатор файлаcallCloseHandle; сбросим флаг модификации в редактореpushebxpushebxpushEM_SETMODIFYpushh_editwindowcallSendMessagemovbyte ptr flag_untitled,0callset_titlefile_save_failed:pushh_editwindowcallSetFocusret; обработчик IDM_OPENh_idm_open:callsave_contents; вызовем стандартный диалог выбора имени файлаmovofn. Flags, OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or OFN_EXPLORERpushoffset ofncallGetOpenFileNametesteax,eaxjzfile_open_failedskip_getopen:; откроем выбранный файлpushebxpushFILE_ATTRIBUTE_ARCHIVEpushOPEN_EXISTINGpushebxpushFILE_SHARE_READ or FILE_SHARE_WRITEpushGENERIC_READ or GENERIC_WRITEpushoffset buffercallCreateFilemovedi,eax; идентификатор для ReadFile; выделим памятьpushMEMSIZEpushGMEM_MOVEABLE or GMEM_ZEROINITcallGlobalAllocpusheax; hMemory для GlobalFree
Страницы: 1, 2
|
|
|
© 2003-2013
Рефераты бесплатно, курсовые, рефераты биология, большая бибилиотека рефератов, дипломы, научные работы, рефераты право, рефераты, рефераты скачать, рефераты литература, курсовые работы, реферат, доклады, рефераты медицина, рефераты на тему, сочинения, реферат бесплатно, рефераты авиация, рефераты психология, рефераты математика, рефераты кулинария, рефераты логистика, рефераты анатомия, рефераты маркетинг, рефераты релиния, рефераты социология, рефераты менеджемент. |
|
|