49971 (Текстовий редактор під Windows), страница 2
Описание файла
Документ из архива "Текстовий редактор під Windows", который расположен в категории "". Всё это находится в предмете "информатика" из 1 семестр, которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "курсовые/домашние работы", в предмете "информатика, программирование" в общих файлах.
Онлайн просмотр документа "49971"
Текст 2 страницы из документа "49971"
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