Работа с текстовой информацией при программировании в Windows
Рассмотрение Windows API, его основные функции и возможности. Основные элементы управления окном: кнопки, списки, окна редактирования, статические тексты. Работа с текстовой информацией при программировании в Windows. Описание алгоритма работы программы.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 10.02.2015 |
Размер файла | 850,6 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
6
Размещено на http://www.allbest.ru
Министерство образования РФ
Государственное образовательное учреждение
высшего профессионального образования
«Ижевский государственный технический университет имени М.Т. Калашникова»
Кафедра Вычислительная Техника
Пояснительная записка
к курсовой работе на тему
«Работа с текстовой информацией при программировании в Windows»
Ижевск 2014
Введение
Windows пpедоставляет множество возможностей чеpез Windows API (Application Programming Interface). Windows API - это большая коллекция полезных функций, pасполагающихся в ОС и готовых для использования пpогpаммами. Эти функции находятся в динамически подгpужаемых библиотеках (DLL), таких как kernel32.dll, user32.dll и gdi32.dll. Kernel32.dll содеpжит API функции, взаимодействующие с памятью и упpавляющие пpоцессами. User32.dll контpолиpует пользовательский интеpфейс. Gdi32.dll ответственнен за гpафические опеpации. Кpоме этих тpех "основных", существуют также дpугие dll, котоpые можно использовать. Windows-пpогpаммы динамически подсоединяются к этим библиотекам, то есть код API функций не включается в исполняемый файл. Инфоpмация находится в библиотеках импоpта. Необходимо слинковать пpогpаммы с пpавильными библиотеками импоpта, иначе они не смогут найти эти функции. Когда Windows пpогpамма загpужается в память, Windows читает инфоpмацию, сохpаненную в пpогpамме. Эта инфоpмация включает имена функций, котоpые пpогpамма использует и DLL, в котоpых эти функции pасполагаются. Когда Windows находит подобную инфоpмацию в пpогpамме, она вызывает библиотеки и испpавляет в пpогpамме вызовы этих функций, так что контpоль всегда будет пеpедаваться по пpавильному адpесу. Существует две категоpии API функций: одна для ANSI и дpугая для Unicode. Hа конце имен API функций для ANSI стоит "A", напpимеp, MessageBoxA. В конце имен функций для Unicode находится "W". Windows 95 от пpиpоды поддеpживает ANSI и WIndows NT Unicode. Обычно имеем дело с ANSI стpоками (массивы символов, оканчивающиеся на NULL). Размеp ANSI-символа - 1 байт. В то вpемя как ANSI достаточна для евpопейских языков, она не поддеpживает некотоpые восточные языки, в котоpых есть несколько тысяч уникальных символов. В этих случаях в дело вступает UNICODE. Размеp символа UNICODE - 2 байта, и поэтому может поддеpживать 65536 уникальных символов. Hо по большей части, будет использоваться include-файл, котоpый может опpеделить и выбpать подходящую для платфоpмы функцию.
Главным элементом программы в среде Windows является окно. Для каждого окна определяется своя процедура (исходя из терминологии, принятой в MS-DOS, такую процедуру следует назвать «процедурой прерывания», для Windows же принята другая терминология - процедура обратного вызова CALLBACK) обработки сообщений.
Окно может содержать элементы управления: кнопки, списки, окна редактирования, статические тексты и др. Эти элементы, по сути, также являются окнами, но обладающими особыми свойствами. События, происходящие с этими элементами (и самим окном), приводят к приходу сообщений в процедуру окна.
ОС Windows использует линейную адресацию памяти. Другими словами, всю память можно рассматривать как один сегмент. Для программиста на языке ассемблера это означает, что адрес любой ячейки памяти будет определяться содержимым одного 32-битного регистра, например EBX.
Следствием этого является то, что мы фактически не ограничены в объёме данных, кода или стека (объёме локальных переменных). Сегменты в тексте программы играют теперь другую роль. Они позволяют задать отдельным фрагментам кода (секциям) определённые свойства: запрет на запись, общий доступ и т. д.
ОС Windows является многозадачной средой. Каждая задача имеет своё адресное пространство и свою очередь сообщений. Более того, даже в рамках одной программы может быть осуществлена многозадачность - любая процедура может быть запущена как самостоятельная задача.
1. Назначение и область применения
Работа с текстовой информацией при программировании в Windows одна из самых важных задач при разработке пользовательского интерфейса. Разрабатываемая программа предназначена как для редактирования небольших текстовых документов, так и для форматирования отдельных текстовых строк. Текстовый редактор - основной инструмент пользователя, поэтому область применение данной программы не ограничена.
алгоритм windows программирование редактирование
2. Технические характеристики
2.1 Постановка задачи на разработку программы
Работа с текстовой информацией при программировании в Windows одна из самых важных задач при разработке пользовательского интерфейса. Поэтому для реализации программы - «Текстовый редактор», необходимо в первую очередь знать основные приёмы работы с текстом в ОС Windows.
К тому же текст, как понятие в вычислительной технике, - это данные, а их потеря неприемлема. Нужно помнить, что окно - это основная единица пользовательского интерфейса, необходимая для управления всей программы.
Таким образом, в алгоритме программы должна рассматриваться классическая структура программы под Windows: регистрация класса окна, создание главного окна, цикл обработки очереди сообщений, процедура главного окна.
2.2 Описание алгоритма и функционирования программы
В этом подразделе будет изложен подробный текстовый алгоритм разрабатываемой программы и его описание.
2.2.1 Описание алгоритма работы программы
В пункте 2.1. была приведена классическая структура программы под Windows. Разберём эти разделы по порядку:
Регистрация класса окон. Осуществляется с помощью функции RegisterClassEx, единственным параметром которой является указатель на структуру WNDCLASSEX, содержащую информацию об окне.
Создание главного окна. На основе зарегистрированного класса с помощью функции CreateWindowsEx можно создать экземпляр окна. Как можно заметить, это весьма напоминает объектную модель программирования (ООП).
Цикл обработки очереди сообщений. Этот раздел является основным в работе программы под Windows. Его можно рассмотреть по порядку:
- Принять очередное сообщение из ряда сообщений данного приложения (GetMessage);
- Транслировать принятое сообщение в правильный порядок дополнительных сообщений (TranslateMessage);
- Передать оттранслированное сообщение, как порядок дополнительных сообщений, процедуре главного окна (DispatchMessage).
- Выход из цикла осуществляется посылкой окну сообщения WM_QUIT, которое функция GetMessage определит как конец обработки очереди сообщений.
Процедура главного окна. Данная процедура является основным приёмником управляющих сообщений, посылаемых от операционной системы окну.
2.2.2 Алгоритм функционирования программы
1. Инициализация программы;
2. Регистрация класса окна;
3. Создание и показ окна;
4. Цикл обработки сообщений;
5. Выход из программы.
2.3 Описание и обоснование выбора метода организации входных и выходных данных
Все типы данных и их структуры организованы в соответствии со стандартами, принятыми в Microsoft API.
Для программы, входными данными являются:
- данные, передаваемые функциями API;
- сообщения, передаваемые от ОС;
- текстовые файлы;
- текст, вводимый пользователем.
Выходными данными являются:
- главное окно;
- окно редактирования;
- результат обработки текста.
3. Листинг программы
3.1 Листинг файла rsrc.rc
#include "\masm32\include\resource.h"
500 ICON MOVEABLE PURE LOADONCALL DISCARDABLE "MAINICON.ICO"
750 BITMAP MOVEABLE PURE LOADONCALL DISCARDABLE "TOOLBAR.BMP"
600 MENUEX MOVEABLE IMPURE LOADONCALL DISCARDABLE
BEGIN
POPUP "&File", , , 0
BEGIN
MENUITEM "&New", 1000
MENUITEM "&Open", 1001
MENUITEM "", , 0x0800 /*MFT_SEPARATOR*/
MENUITEM "&Save", 1002
MENUITEM "Save &As", 1003
MENUITEM "", , 0x0800 /*MFT_SEPARATOR*/
MENUITEM "&Exit", 1010
END
POPUP "&Edit",,,0
BEGIN
MENUITEM "&Undo\tCtrl+Z",1100
MENUITEM "", , 0x0800 /*MFT_SEPARATOR*/
MENUITEM "&Cut\tCtrl+X",1101
MENUITEM "C&opy\tCtrl+C",1102
MENUITEM "&Paste\tCtrl+V",1103
MENUITEM "", , 0x0800 /*MFT_SEPARATOR*/
MENUITEM "&Delete\tDelete",1104
MENUITEM "", , 0x0800 /*MFT_SEPARATOR*/
MENUITEM "&Wordwrap\tF9", 1105
END
POPUP "&Help", , , 0
BEGIN
MENUITEM "&About", 1900
END
END
3.2 Листинг файла qikpad.asm
.386
.model flat, stdcall
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
LOCAL wc :WNDCLASSEX
LOCAL msg :MSG
LOCAL Wwd :DWORD
LOCAL Wht :DWORD
LOCAL Wtx :DWORD
LOCAL Wty :DWORD
LOCAL clBuffer[128] :BYTE
invoke LoadIcon,hInst,500
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, 500
mov Wht, 350
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
invoke SetMenu,hWnd,eax
invoke GetAppPath,ADDR PthBuffer
invoke GetCL,1, ADDR clBuffer
.if eax == 1
invoke Read_File_In,ADDR clBuffer,hEdit
.endif
invoke ShowWindow,hWnd,SW_SHOWNORMAL
invoke UpdateWindow,hWnd
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
LOCAL buffer2[128] :BYTE
.if uMsg == WM_COMMAND
.if wParam == 50
jmp New_File
.elseif wParam == 51
jmp Open_File
.elseif wParam == 52
invoke SaveFile
.elseif wParam == 53
jmp Edit_Cut
.elseif wParam == 54
jmp Edit_Copy
.elseif wParam == 55
jmp Edit_Paste
.elseif wParam == 56
jmp Edit_Undo
.endif
;======== 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
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_SYSCOLORCHANGE
invoke Do_ToolBar,hWin
.elseif uMsg == WM_CREATE
invoke Do_ToolBar,hWin
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
szText OFFWrap," Wrap OFF"
invoke SendMessage,hStatus,SB_SETTEXT,1,ADDR OFFWrap
.elseif uMsg == WM_SIZE
invoke SendMessage,hToolBar,TB_AUTOSIZE,0,0
invoke MoveWindow,hStatus,0,0,0,0,TRUE
invoke GetClientRect,hToolBar,ADDR Rct
push Rct.bottom
pop tbh
invoke GetClientRect,hStatus,ADDR Rct
push Rct.bottom
pop sbh
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
shr wDim, 1
mov eax, wDim
sub sDim, eax
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,"Sorry, file is too large for QIKPAD"
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
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,"QikPad Text Editor",13,10,\
"Copyright © MASM32 1999"
invoke ShellAbout,hWnd,ADDR szDisplayName,ADDR AboutMsg,hIcon
ret
About endp
; #########################################################################
end start
3.3 Листинг файла qikpad.inc
include \MASM32\INCLUDE\windows.inc
include \MASM32\INCLUDE\masm32.inc
include \MASM32\INCLUDE\gdi32.inc
include \MASM32\INCLUDE\user32.inc
include \MASM32\INCLUDE\kernel32.inc
include \MASM32\INCLUDE\Comctl32.inc
include \MASM32\INCLUDE\comdlg32.inc
include \MASM32\INCLUDE\shell32.inc
include \MASM32\INCLUDE\oleaut32.inc
includelib \MASM32\LIB\masm32.lib
includelib \MASM32\LIB\gdi32.lib
includelib \MASM32\LIB\user32.lib
includelib \MASM32\LIB\kernel32.lib
includelib \MASM32\LIB\Comctl32.lib
includelib \MASM32\LIB\comdlg32.lib
includelib \MASM32\LIB\shell32.lib
includelib \MASM32\LIB\oleaut32.lib
WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
TopXY PROTO :DWORD,:DWORD
FillBuffer PROTO :DWORD,:DWORD,:BYTE
Paint_Proc PROTO :DWORD,:DWORD
EditML PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD
Read_File_In PROTO :DWORD,:DWORD
Confirmation PROTO :DWORD
Write_2_Disk PROTO :DWORD
SaveFileAs PROTO
SaveFile PROTO
WordWrap PROTO
EditProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
About PROTO
wsprintfA PROTO C :DWORD,:VARARG
wsprintf equ <wsprintfA>
szText MACRO Name, Text:VARARG
LOCAL lbl
jmp lbl
Name db Text,0
lbl:
ENDM
m2m MACRO M1, M2
push M2
pop M1
ENDM
return MACRO arg
mov eax, arg
ret
ENDM
.data
CommandLine dd 0
hWnd dd 0
hInstance dd 0
hIcon dd 0
hEdit dd 0
WrapFlag dd 0
lpEditProc dd 0
szDisplayName db "QikPad",0
szUntitled db "Untitled",0
szOpenedAt db "File opened at ",0
szSavedAt db "File saved at ",0
bytes db " bytes",0
sizeBuffer db 16 dup (?)
PthBuffer db 128 dup (?)
include toolbar.asm
include filedlgs.asm
include statusbr.asm
3.4 Листинг файла toolbar.asm
Do_ToolBar PROTO :DWORD
SetBmpColor PROTO :DWORD
include tbmacros.asm
.data
hTbBmp dd 0
hToolBar dd 0
.code
; ########################################################################
Do_ToolBar proc hWin :DWORD
LOCAL bSize :DWORD
LOCAL tbab :TBADDBITMAP
LOCAL tbb :TBBUTTON
invoke LoadBitmap,hInstance,750
mov hTbBmp,eax
Create_Tool_Bar 16, 16
TBextraData
TBblank
TBbutton 6, 50
TBbutton 7, 51
TBbutton 8, 52
TBblank
TBbutton 0, 53
TBbutton 1, 54
TBbutton 2, 55
TBbutton 3, 56
ret
Do_ToolBar endp
; ########################################################################
SetBmpColor proc hBitmap:DWORD
LOCAL mDC :DWORD
LOCAL hBrush :DWORD
LOCAL hOldBmp :DWORD
LOCAL hReturn :DWORD
LOCAL hOldBrush :DWORD
invoke CreateCompatibleDC,NULL
mov mDC,eax
invoke SelectObject,mDC,hBitmap
mov hOldBmp,eax
invoke GetSysColor,COLOR_BTNFACE
invoke CreateSolidBrush,eax
mov hBrush,eax
invoke SelectObject,mDC,hBrush
mov hOldBrush,eax
invoke GetPixel,mDC,1,1
invoke ExtFloodFill,mDC,1,1,eax,FLOODFILLSURFACE
invoke SelectObject,mDC,hOldBrush
invoke DeleteObject,hBrush
invoke SelectObject,mDC,hBitmap
mov hReturn,eax
invoke DeleteDC,mDC
mov eax,hReturn
ret
SetBmpColor endp
3.5 Листинг файла tbmacros.asm
TBextraData MACRO
mov tbb.fsState, TBSTATE_ENABLED
mov tbb.dwData, 0
mov tbb.iString, 0
ENDM
; ------------------------------
TBbutton MACRO bID, cID
mov tbb.iBitmap, bID
mov tbb.idCommand, cID
mov tbb.fsStyle, TBSTYLE_BUTTON
invoke SendMessage,hToolBar,TB_ADDBUTTONS,1,ADDR tbb
ENDM
; ------------------------------
TBblank MACRO
mov tbb.iBitmap, 0
mov tbb.idCommand, 0
mov tbb.fsStyle, TBSTYLE_SEP
invoke SendMessage,hToolBar,TB_ADDBUTTONS,1,ADDR tbb
ENDM
; ------------------------------
Create_Tool_Bar MACRO Wd, Ht
szText tbClass,"ToolbarWindow32"
invoke CreateWindowEx,0,
ADDR tbClass,
ADDR szDisplayName,
WS_CHILD or WS_VISIBLE,
0,0,500,40,
hWin,NULL,
hInstance,NULL
;; or TBSTYLE_FLAT
mov hToolBar, eax
invoke SendMessage,hToolBar,TB_BUTTONSTRUCTSIZE,sizeof TBBUTTON,0
mov ecx,Wd
mov eax,Ht
shl eax,16
mov ax, cx
mov bSize, eax
invoke SendMessage,hToolBar,TB_SETBITMAPSIZE,0,bSize
invoke SetBmpColor,hTbBmp
mov hTbBmp,eax
mov tbab.hInst, 0
m2m tbab.nID, hTbBmp
invoke SendMessage,hToolBar,TB_ADDBITMAP,12,ADDR tbab
invoke SendMessage,hToolBar,TB_SETBUTTONSIZE,0,bSize
ENDM
3.6 Листинг файла statusbr.asm
Do_Status PROTO :DWORD
.data
hStatus dd 0
.code
; ##########################################################################
Do_Status proc hParent:DWORD
LOCAL sbParts[4] :DWORD
invoke CreateStatusWindow,WS_CHILD or WS_VISIBLE or \
SBS_SIZEGRIP,NULL, hParent, 200
mov hStatus, eax
mov [sbParts + 0], 125
mov [sbParts + 4], 250
mov [sbParts + 8], -1
invoke SendMessage,hStatus,SB_SETPARTS,3,ADDR sbParts
ret
Do_Status endp
3.7 Листинг файла filedlgs.asm
GetFileName PROTO :DWORD, :DWORD, :DWORD
SaveFileName PROTO :DWORD, :DWORD, :DWORD
FillBuffer PROTO :DWORD, :DWORD, :BYTE
.data
szFileName db 260 dup(0)
ofn OPENFILENAME <> ; structure
.code
; ########################################################################
GetFileName proc hParent:DWORD,lpTitle:DWORD,lpFilter:DWORD
mov ofn.lStructSize, sizeof OPENFILENAME
m2m ofn.hWndOwner, hParent
m2m ofn.hInstance, hInstance
m2m ofn.lpstrFilter, lpFilter
m2m ofn.lpstrFile, offset szFileName
mov ofn.nMaxFile, sizeof szFileName
m2m ofn.lpstrTitle, lpTitle
mov ofn.Flags, OFN_EXPLORER or OFN_FILEMUSTEXIST or \
OFN_LONGNAMES
invoke GetOpenFileName,ADDR ofn
ret
GetFileName endp
; #########################################################################
SaveFileName proc hParent:DWORD,lpTitle:DWORD,lpFilter:DWORD
mov ofn.lStructSize, sizeof OPENFILENAME
m2m ofn.hWndOwner, hParent
m2m ofn.hInstance, hInstance
m2m ofn.lpstrFilter, lpFilter
m2m ofn.lpstrFile, offset szFileName
mov ofn.nMaxFile, sizeof szFileName
m2m ofn.lpstrTitle, lpTitle
mov ofn.Flags, OFN_EXPLORER or OFN_LONGNAMES
invoke GetSaveFileName,ADDR ofn
ret
SaveFileName endp
FillBuffer proc lpBuffer:DWORD,lenBuffer:DWORD,TheChar:BYTE
push edi
mov edi, lpBuffer ; address of buffer
mov ecx, lenBuffer ; buffer length
mov al, TheChar ; load al with character
rep stosb ; write character to buffer until ecx = 0
pop edi
ret
FillBuffer endp
3.8 Листинг make-файла
@echo off
if not exist rsrc.rc goto over1
\masm32\bin\rc /v rsrc.rc
\masm32\bin\cvtres /machine:ix86 rsrc.res
:over1
if exist "qikpad.obj" del "qikpad.obj"
if exist "qikpad.exe" del "qikpad.exe"
\masm32\bin\ml /c /coff "qikpad.asm"
if errorlevel 1 goto errasm
if not exist rsrc.obj goto nores
\masm32\bin\Link /SUBSYSTEM:WINDOWS "qikpad.obj" rsrc.res
if errorlevel 1 goto errlink
dir "qikpad.*"
goto TheEnd
:nores
\masm32\bin\Link /SUBSYSTEM:WINDOWS "qikpad.obj"
if errorlevel 1 goto errlink
dir "qikpad.*"
goto TheEnd
:errlink
echo _
echo Link error
goto TheEnd
:errasm
echo _
echo Assembly Error
goto TheEnd
:TheEnd
pause
4. Результаты моделирования программы на ЭВМ
Рисунок 1 Ввод текста
Рисунок 2 «О программе»
Рисунок 3 Диалоговое окно 1
Рисунок 4 Диалоговое окно 2
Рисунок 5 Вкладка «File»
Рисунок 6 Вкладка «Edit»
Заключение
Таким образом, в данной курсовой работе были изучены и реализованы основные принципы работы с текстом в среде Windows. За основу алгоритма работы программы была выбрана классическая структура оконной программы Windows. Для демонстрации работы программы был выбран текстовый файл с исходным кодом на ассемблере MASM32.
Список литературы
1. Зубков С. В. Assembler для Dos, Windows и UNIX / Зубков Сергей Владимирович. - 3-е изд.,стер. - М.: ДМК Пресс ; Спб. : Питер, 2005. - 608 с. : ил. - (Серия «Для программистов»).
2. Пирогов В. Ю. Ассемблер для Windows. - 2-е изд., перераб. И доп. - СПб.: БХВ-Петербург, 2003. - 656 с.: ил.
3. Сайт http://www.firststeps.ru/mfc/winapi/win/
Размещено на Allbest.ru
...Подобные документы
Введение в API-программирование. Транслирование клавиатурных сообщений в ASCII-коды. Текст программы на 32-битном ассемблере с применением API-функций. Функция для создания диалогового окна. Определение открываемого диска, каталога и имени файла.
курсовая работа [40,6 K], добавлен 18.05.2014Характеристика операционной системы. История развития Windows. Сравнительная характеристика версий Windows. Элементы и инструменты Windows XP. Прикладные программы в Windows XP. Работа настольных и портативных компьютеров под управлением Windows.
доклад [19,1 K], добавлен 16.10.2011Программа операционной системы. Перемещение и копирование объектов. Окна Windows, операционное меню, настройка свойств папки, вызов справки Windows. Работа с дисками, папками и файлами, с приложениями и документами. Стандартные программы Windows.
контрольная работа [21,9 K], добавлен 29.01.2011Все окна в ОС Windows имеют стандартную структуру. Выполнение лабораторной работы предусматривает приобретение навыков использования мышки как основного способа управления работой компьютера в среде Windows.
лабораторная работа [191,1 K], добавлен 22.05.2007Операционная система Microsoft с настраиваемым интерфейсом - Windows ХР. Работа стандартных прикладных программ: блокнот, графический редактор Paint, текстовой процессор WordPad, калькулятор, сжатие данных, агент сжатия, стандартные средства мультимедиа.
контрольная работа [27,4 K], добавлен 25.01.2011История Windows. Особенности Windows XP. Файловая система и структура. Основные принципы работы с системой. Начало и завершение работы, главное меню. Запуск и завершение программ. Окна и диалоги, панель задач. Установка Windows XP.
курсовая работа [344,0 K], добавлен 24.04.2007Классификация и структура автоматизированных информационных систем. Характеристика и устройство операционной системы Windows. Основные элементы и действия с окнами, кнопки управления их размерами. Сравнительная характеристика диалогового и простого окон.
реферат [935,2 K], добавлен 02.02.2010Таймер в Windows как устройство ввода информации, которое извещает приложение о том, что истек заданный интервал времени. Работа с таймером в условиях WinAPI, процесс 32-битного программирования на ассемблере под Windows. Результат выполнения программы.
курсовая работа [165,6 K], добавлен 18.05.2014Появление первых версий Windows, их графические интерфейсы и расширения для DOS. Семейства Windows 3.x и Windows 9.x, их особенности и основные функции. Эволюция технологии Plug and Play. Наиболее существенные улучшения в современных версиях Windows.
реферат [162,3 K], добавлен 13.06.2014Использование языка программирования Delphi для записи программ, представляющих собой последовательность инструкций. Классы и директивы в объектно-ориентированном программировании. Разработка демонстрационной программы. Процесс настройки Windows XP.
дипломная работа [917,4 K], добавлен 15.01.2014Программирование в операционной системе Windows. Работа с потоками и процессами ОС. Методы их создания. Основы вызова API-функций. Пример создания диалогового окна без использования файла ресурсов. Разработка программы с помощью 32-битного ассемблера.
курсовая работа [107,6 K], добавлен 18.05.2014Программирование для Windows. Возможности нового интерфейса. Окна и их управляющие компоненты. DOS и Windows: разные подходы к программированию. Особенности работы с базами данных. Структура программ в CA-Visual Objects. Генерация и обработка событий.
курсовая работа [1,3 M], добавлен 02.03.2010Общая характеристика и особенности операционной системы Windows 95, ее сетевые возможности, оценка преимуществ и недостатков. Сравнительная характеристика Windows 95, 98 и Millennium. Принципы работы и устройство принтеров, их части и назначение.
курсовая работа [42,2 K], добавлен 05.03.2010История создания. Windows 9x/NT. Операционная система Microsoft Windows. Преимущества и недостатки Windows. Некоторые клавиатурные комбинации Windows 9x и NT. Windows XP Professional. Наиболее совершенная защита.
реферат [19,3 K], добавлен 18.07.2004Работа с объектами операционной системы Windows: основные понятия и горячие клавиши. Создание и редактирование файлов и папок. Скриншоты и графический редактор Paint. Редактирование простейших текстовых документов в Блокноте. Работа с калькулятором.
лабораторная работа [16,6 K], добавлен 30.11.2010Понятие, типы и работа брандмауэра. Встроенные в Windows firewall. Windows XP SP2, доступ к настройкам файрвола Windows XP Service Pack 2. Windows Vista, разрешенный трафик. Windows 7, настройки активных профилей. Персоальные Firewall, уровни тестов.
реферат [3,8 M], добавлен 19.11.2010Изучение общих возможностей операционной системы Windows, осуществление навигации по ее структурам с помощью мышки. Порядок работы с программами, окнами и справочной информацией. Основные операции над папками и файлами. Построение структуры каталогов.
лабораторная работа [156,1 K], добавлен 23.10.2013Общее понятие об оперативной системе Windows Vista. Сравнительный анализ систем Windows XP и Windows Vista. Специфика процесса установки, трехмерный интерфейс Aero Glass, действие некоторых мини-приложений. Новости управления папками, работа в интернете.
реферат [2,4 M], добавлен 01.02.2010Windows Management Instrumentation как инструментарий управления Windows, его общая характеристика и возможности, функциональные особенности. Классы, события и безопасность WMI. Работа с объектами и коллекциями объектов, полученными в результате запросов.
курсовая работа [428,8 K], добавлен 26.04.2011Применение персональных компьютеров различных классов. Работа со встроенными программами Windows. Характеристика распространенных операционных систем (Windows 3.Х, 9Х, NT, 2000, XP, Windows7, Vista). Виды антивирусных программ и защита данных от вирусов.
контрольная работа [32,3 K], добавлен 23.01.2011