Смекни!
smekni.com

Текстовий редактор під Windows (стр. 2 из 2)

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

}