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
}