Текстовий редактор під 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. 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_contents

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_contents; запишем файл если нужно

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_contents

; вызовем стандартный диалог выбора имени файла

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_contents

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_contents

; EBX=0, ESI=hWnd

save_contents:

; спросим редактор, изменялся ли текст

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

}