Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Отчеты по Курсовой Работе / Работа с текстом 8-78-2 Морозов Н.О..docx
Скачиваний:
33
Добавлен:
12.03.2015
Размер:
117.48 Кб
Скачать

ТеКст программы textred.Asm

.386

.model flat, stdcall ; 32 bit memory model

option casemap :none ; чувствительно к регистру

include qikpad.inc ; локально включаем этот файл

; #########################################################################

.code

start:

invoke GetModuleHandle, NULL

mov hInstance, eax

invoke GetCommandLine

mov CommandLine, eax

invoke InitCommonControls

invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT

invoke ExitProcess,eax

; #########################################################################

WinMain proc hInst :DWORD,

hPrevInst :DWORD,

CmdLine :DWORD,

CmdShow :DWORD

;====================

; положим LOCALs в stack

;====================

LOCAL wc :WNDCLASSEX

LOCAL msg :MSG

LOCAL Wwd :DWORD

LOCAL Wht :DWORD

LOCAL Wtx :DWORD

LOCAL Wty :DWORD

LOCAL clBuffer[128]:BYTE

;==================================================

; Заполните WNDCLASSEX структуры с необходимыми переменными

;==================================================

invoke LoadIcon,hInst,500 ; иконка ID

mov hIcon, eax

szText szClassName,"QikPad_Class"

mov wc.cbSize, sizeof WNDCLASSEX

mov wc.style, CS_HREDRAW or CS_VREDRAW \

or CS_BYTEALIGNWINDOW

mov wc.lpfnWndProc, offset WndProc

mov wc.cbClsExtra, NULL

mov wc.cbWndExtra, NULL

m2m wc.hInstance, hInst

invoke GetStockObject,HOLLOW_BRUSH

mov wc.hbrBackground, eax

mov wc.lpszMenuName, NULL

mov wc.lpszClassName, offset szClassName

m2m wc.hIcon, hIcon

invoke LoadCursor,NULL,IDC_ARROW

mov wc.hCursor, eax

m2m wc.hIconSm, hIcon

invoke RegisterClassEx, ADDR wc

;================================

;Центр окна следующих размеров

;================================

mov Wwd, 800

mov Wht, 600

invoke GetSystemMetrics,SM_CXSCREEN

invoke TopXY,Wwd,eax

mov Wtx, eax

invoke GetSystemMetrics,SM_CYSCREEN

invoke TopXY,Wht,eax

mov Wty, eax

invoke CreateWindowEx,WS_EX_LEFT,

ADDR szClassName,

ADDR szUntitled,

WS_OVERLAPPEDWINDOW,

Wtx,Wty,Wwd,Wht,

NULL,NULL,

hInst,NULL

mov hWnd,eax

invoke LoadMenu,hInst,600 ; menu ID

invoke SetMenu,hWnd,eax

invoke GetAppPath,ADDR PthBuffer

invoke GetCL,1, ADDR clBuffer

; ---------------------------------------------------------

; Возвращаемое значение 1 является сигналом успешной работы

; ---------------------------------------------------------

.if eax == 1

invoke Read_File_In,ADDR clBuffer,hEdit

.endif

invoke ShowWindow,hWnd,SW_SHOWNORMAL

invoke UpdateWindow,hWnd

;=========================================

; повторять, пока PostQuitMessage передает

;=========================================

StartLoop:

invoke GetMessage,ADDR msg,NULL,0,0

cmp eax, 0

je ExitLoop

invoke TranslateMessage, ADDR msg

invoke DispatchMessage, ADDR msg

jmp StartLoop

ExitLoop:

return msg.wParam

WinMain endp

; #########################################################################

WndProc proc hWin :DWORD,

uMsg :DWORD,

wParam :DWORD,

lParam :DWORD

LOCAL var :DWORD

LOCAL caW :DWORD

LOCAL caH :DWORD

LOCAL tbh :DWORD

LOCAL sbh :DWORD

LOCAL wWid :DWORD

LOCAL wHgt :DWORD

LOCAL hDC :DWORD

LOCAL Rct :RECT

LOCAL tbab :TBADDBITMAP

LOCAL tbb :TBBUTTON

LOCAL buffer1[128]:BYTE ; these are two spare buffers

LOCAL buffer2[128]:BYTE ; for text manipulation etc..

.if uMsg == WM_COMMAND

;======== menu commands ========

.if wParam == 1000

New_File:

invoke SendMessage,hEdit,EM_GETMODIFY,0,0

.if eax == TRUE

invoke Confirmation,hWin

.if eax == IDYES

invoke SaveFile

.elseif eax == IDCANCEL

mov eax, 0

ret

.endif

.endif

invoke SetWindowText,hEdit,NULL

invoke SetWindowText,hWin,ADDR szUntitled

invoke SendMessage,hStatus,SB_SETTEXT,2,NULL

.elseif wParam == 1001

Open_File:

invoke SendMessage,hEdit,EM_GETMODIFY,0,0

.if eax == TRUE

invoke Confirmation,hWin

.if eax == IDYES

invoke SaveFile

.elseif eax == IDCANCEL

mov eax, 0

ret

.endif

.endif

jmp @F

szTitleO db "Open A File",0

szFilterO db "All files",0,"*.*",0,

"Text files",0,"*.TEXT",0,0

@@:

invoke FillBuffer,ADDR szFileName,length szFileName,0

invoke GetFileName,hWin,ADDR szTitleO,ADDR szFilterO

cmp szFileName[0],0 ;<< ноль если нажата dlgbox

je @F

invoke Read_File_In,ADDR szFileName,hEdit

invoke SetWindowText,hWin,ADDR szFileName

@@:

.elseif wParam == 1002

invoke SaveFile

.elseif wParam == 1003

invoke SaveFileAs

.endif

.if wParam == 1010

invoke SendMessage,hWin,WM_SYSCOMMAND,SC_CLOSE,NULL

.elseif wParam == 1900

invoke About

.endif

.if wParam == 1100

Edit_Undo:

invoke SendMessage,hEdit,WM_UNDO,0,0

.elseif wParam == 1101

Edit_Cut:

invoke SendMessage,hEdit,WM_CUT,0,0

.elseif wParam == 1102

Edit_Copy:

invoke SendMessage,hEdit,WM_COPY,0,0

.elseif wParam == 1103

Edit_Paste:

invoke SendMessage,hEdit,WM_PASTE,0,0

.elseif wParam == 1104

invoke SendMessage,hEdit,WM_CLEAR,0,0

.elseif wParam == 1105

invoke WordWrap

.endif

;====== end menu commands ======

.elseif uMsg == WM_SETFOCUS

invoke SetFocus,hEdit

.elseif uMsg == WM_CREATE

invoke Do_Status,hWin

mov WrapFlag, 0

invoke EditML,NULL,0,30,300,200,hWin,700,WrapFlag

mov hEdit, eax

invoke SetWindowLong,hEdit,GWL_WNDPROC,EditProc

mov lpEditProc, eax

.elseif uMsg == WM_SIZE

invoke MoveWindow,hStatus,0,0,0,0,TRUE

push Rct.bottom

pop tbh ; toolbar height

invoke GetClientRect,hStatus,ADDR Rct

push Rct.bottom

pop sbh ; status bar height

invoke GetClientRect,hWin,ADDR Rct

push Rct.right

pop wWid

push Rct.bottom

pop wHgt

mov eax, tbh

sub wHgt, eax

mov eax, sbh

sub wHgt, eax

add tbh, 2

sub wHgt, 2

invoke MoveWindow,hEdit,0,tbh,wWid,wHgt,TRUE

.elseif uMsg == WM_CLOSE

invoke SendMessage,hEdit,EM_GETMODIFY,0,0

.if eax == TRUE

invoke Confirmation,hWin

.if eax == IDYES

invoke SaveFile

.elseif eax == IDCANCEL

mov eax, 0

ret

.endif

.endif

.elseif uMsg == WM_DESTROY

invoke PostQuitMessage,NULL

return 0

.endif

invoke DefWindowProc,hWin,uMsg,wParam,lParam

ret

WndProc endp

; ########################################################################

TopXY proc wDim:DWORD, sDim:DWORD

shr sDim, 1 ; divide screen dimension by 2

shr wDim, 1 ; divide window dimension by 2

mov eax, wDim ; copy window dimension into eax

sub sDim, eax ; sub half win dimension from half screen dimension

return sDim

TopXY endp

; ########################################################################

EditML proc szMsg:DWORD,tx:DWORD,ty:DWORD,wd:DWORD,ht:DWORD,

hParent:DWORD,ID:DWORD,Wrap:DWORD

LOCAL hCtl :DWORD

LOCAL hFnt :DWORD

LOCAL eStyle :DWORD

szText CtlStyle,"EDIT"

mov eStyle, WS_VISIBLE or WS_CHILDWINDOW or \

WS_VSCROLL or ES_NOHIDESEL or \

ES_AUTOVSCROLL or ES_MULTILINE

.if Wrap == 0

or eStyle,WS_HSCROLL or ES_AUTOHSCROLL

.endif

invoke CreateWindowEx,WS_EX_CLIENTEDGE,ADDR CtlStyle,szMsg,

eStyle,tx,ty,wd,ht,hParent,ID,hInstance,NULL

mov hCtl, eax

invoke GetStockObject,SYSTEM_FIXED_FONT

mov hFnt, eax

invoke SendMessage,hCtl,WM_SETFONT,hFnt,TRUE

mov eax, hCtl

ret

EditML endp

; ########################################################################

Read_File_In proc lpszDiskFile:DWORD, hEditControl:DWORD

LOCAL hFile :DWORD

LOCAL hMem$ :DWORD

LOCAL ln :DWORD

LOCAL br :DWORD

LOCAL txtBuffer[64]:BYTE

invoke CreateFile,lpszDiskFile,GENERIC_READ,FILE_SHARE_READ,

NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL

mov hFile, eax

invoke GetFileSize,hFile,NULL

mov ln, eax

.if ln > 32767

invoke CloseHandle,hFile

szText tooBig,"Файл слишком большой!!!"

invoke MessageBox,hWnd,ADDR tooBig,ADDR szDisplayName,MB_OK

xor eax, eax

ret

.endif

invoke SysAllocStringByteLen,0,ln

mov hMem$, eax

invoke ReadFile,hFile,hMem$,ln,ADDR br,NULL

invoke SetWindowText,hEditControl,hMem$

invoke SysFreeString,hMem$

invoke CloseHandle,hFile

invoke lnstr,ADDR szOpenedAt

inc eax

invoke MemCopy,ADDR szOpenedAt,ADDR txtBuffer,eax

invoke dwtoa,ln,ADDR sizeBuffer

invoke lstrcat,ADDR txtBuffer,ADDR sizeBuffer

invoke lstrcat,ADDR txtBuffer,ADDR bytes

invoke SendMessage,hStatus,SB_SETTEXT,2,ADDR txtBuffer

ret

Read_File_In endp

; ########################################################################

Confirmation proc hMain:DWORD

szText ConfirmMsg,"File not saved, save it now ?"

invoke MessageBox,hMain,ADDR ConfirmMsg,ADDR szDisplayName,

MB_YESNOCANCEL or MB_ICONQUESTION

ret

Confirmation endp

; ########################################################################

Write_2_Disk proc lpszFile_Name:DWORD

LOCAL ln :DWORD

LOCAL hMem$ :DWORD

LOCAL hFile :DWORD

LOCAL bw :DWORD

LOCAL txtBuffer[64]

; -----------------------------------------

; обрезает файл до нулевой длины, если он существует

; -----------------------------------------

invoke CreateFile,lpszFile_Name, ; Указатель на имя файла

GENERIC_WRITE, ; режим доступа (чтение-запись)

NULL,

NULL, ; указатель на атрибуты безопасности

CREATE_ALWAYS, ; как создать

FILE_ATTRIBUTE_NORMAL, ; атрибуты файлов

NULL

mov hFile,eax

invoke GetWindowTextLength,hEdit

mov ln, eax

inc ln

invoke SysAllocStringByteLen,0,ln

mov hMem$, eax

invoke GetWindowText,hEdit,hMem$,ln

invoke WriteFile,hFile,hMem$,ln,ADDR bw,NULL

invoke SysFreeString,hMem$

invoke CloseHandle,hFile

invoke SendMessage,hEdit,EM_SETMODIFY,FALSE,0

invoke lnstr,ADDR szSavedAt

inc eax

invoke MemCopy,ADDR szSavedAt,ADDR txtBuffer,eax

invoke dwtoa,ln,ADDR sizeBuffer

invoke lstrcat,ADDR txtBuffer,ADDR sizeBuffer

invoke lstrcat,ADDR txtBuffer,ADDR bytes

invoke SendMessage,hStatus,SB_SETTEXT,2,ADDR txtBuffer

ret

Write_2_Disk endp

; ########################################################################

SaveFileAs proc

jmp @F

szTitleS db "Save file as",0

szFilterS db "All files",0,"*.*",0,

"Text files",0,"*.TEXT",0,0

@@:

invoke FillBuffer,ADDR szFileName,length szFileName,0

invoke SaveFileName,hWnd,ADDR szTitleS,ADDR szFilterS

cmp szFileName[0],0 ;<< ноль, если нажата dlgbox

je @F

invoke Write_2_Disk,ADDR szFileName

invoke SetWindowText,hWnd,ADDR szFileName

@@:

ret

SaveFileAs endp

; #########################################################################

SaveFile proc

LOCAL buffer[128]:BYTE

; ---------------------------

;проверить, есть ли название

; ---------------------------

invoke GetWindowText,hWnd,ADDR buffer,128

invoke lstrcmp,ADDR buffer,ADDR szUntitled

.if eax == 0

invoke SaveFileAs

ret

.endif

invoke Write_2_Disk,ADDR buffer

ret

SaveFile endp

; #########################################################################

WordWrap proc

LOCAL mFlag:DWORD

LOCAL ln :DWORD

LOCAL hMem$:DWORD

invoke SendMessage,hEdit,EM_GETMODIFY,0,0

mov mFlag, eax

invoke GetWindowTextLength,hEdit

mov ln, eax

inc ln

invoke SysAllocStringByteLen,0,ln

mov hMem$, eax

invoke GetWindowText,hEdit,hMem$,ln

invoke DestroyWindow,hEdit

.if WrapFlag == 0

mov WrapFlag, 1

szText WrapON," Wrap ON"

invoke SendMessage,hStatus,SB_SETTEXT,1,ADDR WrapON

.elseif WrapFlag == 1

mov WrapFlag, 0

szText WrapOFF," Wrap OFF"

invoke SendMessage,hStatus,SB_SETTEXT,1,ADDR WrapOFF

.endif

invoke EditML,NULL,0,30,300,200,hWnd,700,WrapFlag

mov hEdit, eax

invoke SetWindowLong,hEdit,GWL_WNDPROC,EditProc

mov lpEditProc, eax

invoke SendMessage,hWnd,WM_SIZE,0,0

invoke SetWindowText,hEdit,hMem$

invoke SysFreeString,hMem$

invoke SendMessage,hEdit,EM_SETMODIFY,mFlag,0

invoke SetFocus,hEdit

ret

WordWrap endp

; #########################################################################

EditProc proc hCtl :DWORD,

uMsg :DWORD,

wParam :DWORD,

lParam :DWORD

.if uMsg == WM_KEYUP

.if wParam == VK_F1

invoke About

.elseif wParam == VK_F9

invoke WordWrap

.elseif wParam == VK_ESCAPE

invoke SendMessage,hWnd,WM_SYSCOMMAND,SC_CLOSE,NULL

return 0

.endif

.endif

invoke CallWindowProc,lpEditProc,hCtl,uMsg,wParam,lParam

ret

EditProc endp

; #########################################################################

About proc

szText AboutMsg,"Курсовой Работа с Текстом",13,10,\

"Морозов Никита © 2014"

invoke ShellAbout,hWnd,ADDR szDisplayName,ADDR AboutMsg,hIcon

ret

About endp

; #########################################################################

end start