|
Текстовий редактор під 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 для GlobalFreepusheax; hMemory для GlobalLockcallGlobalLock; получим адрес выделенной памятиpusheax; pMemory для GlobalUnlockpusheax; pMemory для SendMessage; прочитаем файлpushebxpushoffset SizeReadWritepushMEMSIZE-1pusheax; pMemory для ReadFilepushedicallReadFile; пошлём окну редактора сообщение wm_settext чтобы он забрал текст из буфераpushebx; pMemory уже в стекеpushWM_SETTEXTpushh_editwindowcallSendMessage; а теперь можно закрыть файл и освободить памятьcallGlobalUnlock; pMemory уже в стекеcallGlobalFree; hMemory уже в стекеpushedi; hFilecallCloseHandle;movbyte ptr flag_untitled,0callset_titlefile_open_failed:pushh_editwindowcallSetFocusret; обработчик IDM_EXITh_idm_exit:callsave_contentspushesi; hWndcallDestroyWindow; уничтожить наше окноret;; обработчик WM_SIZE;h_wm_size:; здесь также надо послать WM_SIZE окнам toolbar и statusbar; изменим размер окна редактора так чтобы оно по-прежнему было на всё окноpushoffset recpushesi; hWndcallGetClientRectpush1; truepushrec. bottom; heightpushrec. right; widthpushebx; ypushebx; xpushh_editwindowcallMoveWindowjmp short end_wm_check;; обработчик WM_ACTIVATE;h_wm_activate:pushh_editwindowcallSetFocusjmp short end_wm_check;; обработчик WM_DESTROY;h_wm_destroy:pushebxcallPostQuitMessage; послать WM_QUIT основной программеend_wm_check:popaxor eax,eax; вернуть 0leaveret16; процедура set_title; устанавливает новый заголовок для основного окнаset_title:pushesipushedimovedi,offset window_titlecmpbyte ptr flag_untitled,1; если у файла нет имениjeuntitled; использовать Untitledmovesi,ofn. lpstrFile; [ESI] - имя файла с путёмmovzxeax,ofn. nFileOffset; eax - начало имени файлаaddesi,eaxcopy_filename:lodsb; скопирем файл побайтово в название окнаtestal,aljzadd_progname; пока не встретится нольstosbjmp short copy_filenameadd_progname:movdword ptr [edi],' - '; припишем минусaddedi,3movesi,offset c_w_namemovecx,9; и название программыrep movsbpopedipopesipushoffset window_titlepushesi; идентификатор окнаcallSetWindowTextretuntitled:movdword ptr [edi],'itnU'; допишем "Unti"movdword ptr [edi+4],'delt'; допишем "tled"addedi,8jmp short add_progname; процедура save_contents; EBX=0, ESI=hWndsave_contents:; спросим редактор, изменялся ли текстpushebxpushebxpushEM_GETMODIFYpushh_editwindowcallSendMessagetesteax,eaxjznot_modified; спросим пользователя, сохранять ли егоpushMB_YESNO + MB_ICONWARNINGpushoffset c_w_namepushoffset changes_msgpushesicallMessageBoxcmpeax, IDYESjnenot_modified; сохраним егоcallh_idm_savenot_modified:retwin_proc endpabout_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]pushebpmovebp,esp; создадим стековый кадрcmpap_uMsg,WM_COMMANDjnedont_proceedcmpap_wParam, IDOKjnedont_proceedpush1pushap_hDlgcallEndDialogdont_proceed:xoreax,eax; not processedleaveret 16about_proc endpend_start; comdlg32. inc; включаемый файл с определениями функций из comdlg32. dll;ifdef _TASM_includelib import32. lib; имена используемых функцийextrnGetOpenFileNameA: nearextrnGetSaveFileNameA: near; присваивания для облегчения читаемости кодаGetOpenFileNameequGetOpenFileNameAGetSaveFileNameequGetSaveFileNameAelseincludelib comdlg32. lib; истинные имена используемых функцийextrn__imp__GetOpenFileNameA@4: dwordextrn__imp__GetSaveFileNameA@4: dword; присваивания для облегчения читаемости кодаGetOpenFileNameequ__imp__GetOpenFileNameA@4GetSaveFileNameequ__imp__GetSaveFileNameA@4Endif; def32. inc; файл с определениями констант и типов для примеров под win32; из winbase. hSTD_OUTPUT_HANDLEequ-11OPEN_EXISTINGequ3CREATE_ALWAYSequ2GMEM_MOVEABLEequ2GMEM_ZEROINITequ40h; из windef. hRECTstrucleftdd?topdd?rightdd?bottomdd?RECTends; из winerror. hNO_ERRORequ0ERROR_NO_MORE_ITEMSequ259; из winnetwk. hRESOURCEUSAGE_CONNECTABLEequ 1RESOURCETYPE_ANYequ0RESOURCE_CONNECTEDequ1NTRESOURCE strucdwScopedd?dwTypedd?dwDisplayTypedd?dwUsagedd?lpLocalNamedd?lpRemoteNamedd?lpCommentdd?lpProviderdd?NTRESOURCE ends; из winnt. hGENERIC_READequ80000000hGENERIC_WRITEequ40000000hFILE_SHARE_READequ1FILE_SHARE_WRITEequ2FILE_ATTRIBUTE_ARCHIVEequ20h; из winuser. hMB_OKequ0MB_ICONINFORMATIONequ40hIDC_ARROWequ32512IDI_APPLICATIONequ32512WS_OVERLAPPEDWINDOW equ0CF0000hWM_DESTROYequ2WM_COMMANDequ111hWM_INITDIALOGequ110hWM_CLOSEequ10hCS_HREDRAWequ2CS_VREDRAWequ1CW_USEDEFAULTequ80000000hSW_SHOWNORMALequ1COLOR_WINDOWequ5BN_CLICKEDequ0WNDCLASSEXstruccbSizedd?styledd?lpfnWndProcdd?cbClsExtradd?cbWndExtradd?hInstancedd?hIcondd?hCursordd?hbrBackgrounddd?lpszMenuNamedd?lpszClassNamedd?hIconSmdd?WNDCLASSEXendsMSGstruchwnddd?messagedd?wParamdd?lParamdd?timedd?ptdd?MSGends; из winuser. hWM_CREATEequ1WM_ACTIVATEequ6WM_SETTEXTequ0ChWM_GETTEXTequ0DhWM_CUTequ300hWM_COPYequ301hWM_PASTEequ302hWM_CLEARequ303hWM_UNDOequ304hWM_SIZEequ5WS_VISIBLEequ10000000hWS_CHILDequ40000000hWS_EX_CLIENTEDGE equ200hES_LEFTequ0ES_MULTILINEequ4ES_AUTOHSCROLLequ80hES_AUTOVSCROLLequ40hEM_GETHANDLEequ0BDhEM_GETMODIFYequ0B8hEM_SETMODIFYequ0B9hEM_UNDOequ0C7hEM_SETSELequ0B1hMB_YESNOequ4MB_ICONWARNINGequ30hIDOKequ1IDYESequ6; из commdlg. hOFN_PATHMUSTEXISTequ800hOFN_FILEMUSTEXISTequ1000hOFN_EXPLORERequ80000hOFN_OVERWRITEPROMPTequ2OPENFILENAMEstruclStructSizedd?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: nearextrnDispatchMessageA: nearextrnTranslateMessage: nearextrnGetMessageA: nearextrnLoadIconA: nearextrnUpdateWindow: nearextrnShowWindow: nearextrnCreateWindowExA: nearextrnDefWindowProcA: nearextrnPostQuitMessage: nearextrnRegisterClassExA: nearextrnLoadCursorA: nearextrnLoadMenuA: nearextrnDestroyWindow: nearextrnDialogBoxParamA: nearextrnGetDlgItem: nearextrnSetFocus: nearextrnGetDlgItemTextA: nearextrnSetDlgItemTextA: nearextrnEndDialog: nearextrnLoadAcceleratorsA: nearextrnTranslateAccelerator: nearextrnSendMessageA: nearextrnSetWindowTextA: nearextrnMoveWindow: nearextrnGetClientRect: nearextrnGlobalUnlock: near; присваивания для облегчения читаемости кодаMessageBoxequMessageBoxADispatchMessageequDispatchMessageAGetMessageequGetMessageALoadIconequLoadIconACreateWindowExequCreateWindowExADefWindowProcequDefWindowProcARegisterClassExequRegisterClassExALoadCursorequLoadCursorALoadMenuequLoadMenuADialogBoxParamequDialogBoxParamAGetDlgItemTextequGetDlgItemTextASetDlgItemTextequSetDlgItemTextALoadAccelerators equLoadAcceleratorsASendMessageequSendMessageASetWindowTextequSetWindowTextAelseincludelib user32. lib; истинные имена используемых функцийextrn__imp__MessageBoxA@16: dwordextrn__imp__DispatchMessageA@4: dwordextrn__imp__TranslateMessage@4: dwordextrn__imp__GetMessageA@16: dwordextrn__imp__LoadIconA@8: dwordextrn__imp__UpdateWindow@4: dwordextrn__imp__ShowWindow@8: dwordextrn__imp__CreateWindowExA@48: dwordextrn__imp__DefWindowProcA@16: dwordextrn__imp__PostQuitMessage@4: dwordextrn__imp__RegisterClassExA@4: dwordextrn__imp__LoadCursorA@8: dwordextrn__imp__LoadMenuA@8: dwordextrn__imp__DestroyWindow@4: dwordextrn__imp__DialogBoxParamA@20: dwordextrn__imp__GetDlgItem@8: dwordextrn__imp__SetFocus@4: dwordextrn__imp__GetDlgItemTextA@16: dwordextrn__imp__SetDlgItemTextA@12: dwordextrn__imp__EndDialog@8: dwordextrn__imp__LoadAcceleratorsA@8: dwordextrn__imp__TranslateAccelerator@12: dwordextrn__imp__SendMessageA@16: dwordextrn__imp__SetWindowTextA@8: dwordextrn__imp__MoveWindow@24: dwordextrn__imp__GetClientRect@8: dwordextrn__imp__GlobalUnlock@4: dword; присваивания для облегчения читаемости кодаMessageBoxequ__imp__MessageBoxA@16DispatchMessageequ__imp__DispatchMessageA@4TranslateMessage equ__imp__TranslateMessage@4GetMessageequ__imp__GetMessageA@16LoadIconequ__imp__LoadIconA@8UpdateWindowequ__imp__UpdateWindow@4ShowWindowequ__imp__ShowWindow@8CreateWindowExequ__imp__CreateWindowExA@48DefWindowProcequ__imp__DefWindowProcA@16PostQuitMessageequ__imp__PostQuitMessage@4RegisterClassExequ__imp__RegisterClassExA@4LoadCursorequ__imp__LoadCursorA@8LoadMenuequ__imp__LoadMenuA@8DestroyWindowequ__imp__DestroyWindow@4DialogBoxParamequ__imp__DialogBoxParamA@20GetDlgItemequ__imp__GetDlgItem@8SetFocusequ__imp__SetFocus@4GetDlgItemTextequ__imp__GetDlgItemTextA@16SetDlgItemTextequ__imp__SetDlgItemTextA@12EndDialogequ__imp__EndDialog@8LoadAccelerators equ__imp__LoadAcceleratorsA@8TranslateAccelerator equ __imp__TranslateAccelerator@12SendMessageequ__imp__SendMessageA@16SetWindowTextequ__imp__SetWindowTextA@8MoveWindowequ__imp__MoveWindow@24GetClientRectequ__imp__GetClientRect@8GlobalUnlockequ__imp__GlobalUnlock@4Endif // 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_NEWMENUITEM "&Open... \tCtrl+O", IDM_OPENMENUITEM "&Save\tCtrl+S", IDM_SAVEMENUITEM "Save &As... \tCtrl+Shift+S", IDM_SAVEASMENUITEM SEPARATORMENUITEM "E&xit\tCtrl+Q", IDM_EXIT}POPUP "&Edit" {MENUITEM "&Undo\tCtrl-Z", IDM_UNDOMENUITEM SEPARATORMENUITEM "Cu&t\tCtrl-X", IDM_CUTMENUITEM "&Copy\tCtrl-C", IDM_COPYMENUITEM "&Paste\tCtrl-V", IDM_PASTEMENUITEM "&Delete\tDel", IDM_CLEARMENUITEM SEPARATORMENUITEM "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,75STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_CAPTION | WS_SYSMENUCAPTION "About Asmpad95"{ICONIDI_APPLICATION, IDC_STATIC,12,15,21, 20CTEXT"Asmpad95", IDC_STATIC,0,30,40,8CTEXT"Prototype notepad-style editor for Windows 95 written entirely in assembly language",IDC_STATIC,45,10,70,45,WS_BORDERDEFPUSHBUTTON"OK", IDOK,40,60,40,12}
|
|