Работа с текстовой информацией при программировании в Windows

Введение в API-программирование. Транслирование клавиатурных сообщений в ASCII-коды. Текст программы на 32-битном ассемблере с применением API-функций. Функция для создания диалогового окна. Определение открываемого диска, каталога и имени файла.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 18.05.2014
Размер файла 40,6 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

1. Введение в API-программирование

API (application programming interface) - интерфейс прикладного программирования (иногда интерфейс программирования приложений). Другими словами, это те возможности (функции, переменные, константы, классы), которые предоставляет приложение для использования прикладными программами.

API определяет функциональность, которую предоставляет программа (модуль, библиотека), при этом API позволяет абстрагироваться от того, как именно эта функциональность реализована.

Если программу (модуль, библиотеку) рассматривать как чёрный ящик, то API - это множество «ручек», которые доступны пользователю данного ящика, которые он может вертеть и дёргать, при этом ящик будет производить какие-то определенные действия понятные и необходимые пользователю, но пользователь, при этом, не имеет даже представления о их реализации.

Программные компоненты взаимодействуют друг с другом посредством API. При этом обычно компоненты образуют иерархию - высокоуровневые компоненты используют API низкоуровневых компонентов, а те, в свою очередь, используют API ещё более низкоуровневых компонентов.

API операционных систем

Практически все операционные системы (Unix, Windows, Mac OS, и т.д.) имеют API, с помощью которого программисты могут создавать приложения для этой операционной системы. Главный API операционных систем - это множество системных вызовов.

В индустрии программного обеспечения общие стандартные API для стандартной функциональности имеют важную роль, так как они гарантируют, что все программы, использующие общий API, будут работать одинаково хорошо или, по крайней мере, типичным привычным образом. В случае API графических интерфейсов это означает, что программы будут иметь похожий пользовательский интерфейс, что облегчает процесс освоения новых программных продуктов.

Widows API

Windows API - общее наименование целого набора базовых функций интерфейсов программирования приложений операционных систем семейств Windows (от Windows 3.11 до Windows 98) и Windows NT корпорации «Microsoft». Является самым прямым способом взаимодействия приложений с Windows.

Работа через Windows API - это наиболее близкий к системе способ взаимодействия с ней из прикладных программ.

Win32 - 32х разрядный API для современных версий Windows. Самая популярная ныне версия. Win32 появился вместе с Windows NT и затем был перенесён (в несколько ограниченном виде) в системы серии Windows 9x.

Win64 - 64-разрядная версия Win32, содержащая дополнительные функции для использования на 64-разрядных компьютерах.

Структура API-программ

Центральным понятием программирования в среде Windows является сообщение. Система посылает сообщение приложению, а то, в свою очередь, должно правильно отреагировать на него. Получателями сообщений являются функции окон приложения, на программирование которых и уходит большая часть времени при разработке API-приложений.

Классическая структура API-программы определяется четырьмя компонентами: инициализация; цикл ожидания, или цикл обработки сообщений; функция главного окна; другие функции. В простейшем случае последний компонент может отсутствовать. Два первых компонента располагаются в функции WinMain, остальные реализуются отдельными функциями.

Описание используемых API-функций

GetCommandLine

Функция извлекает командную строку для текущего процесса. Величина возвращаемого значения - указатель на строку.

Синтаксис:

LPTSTR GetCommandLine(VOID) // У этой функции нет параметров.

GetModuleHandle

Функция извлекает дескриптор указанного модуля, если файл был отображен в адресном пространстве вызывающего процесса. В случае успешного завершения возвращает идентификатор модуля; 0 - в противном случае.

Синтаксис:

GetModuleHandle (

ModuleName: PChar // Имя модуля (заканчивающееся пустым символом).

THandle;

InitCommonControls

Регистрирует указанные классы стандартного органа управления из динамически подключаемой библиотеки (DLL) стандартных органов управления. Возвращает значение ИСТИНА (TRUE) в случае успешного завершения, или иначе ЛОЖЬ (FALSE).

Синтаксис

BOOL InitCommonControlsEx (

LPINITCOMMONCONTROLSEX lpInitCtrls

);

ExitProcess

Функция заканчивает работу процесса и всех его потоков. У этой функции нет возвращаемого значения.

Синтаксис:

VOID ExitProcess (

UINT uExitCode // код выхода для всех потоков

);

WinMain

Функция вызывается системой как начальная точка входа, для базирующейся на Win32, прикладной программы. Если функция достигла цели, она завершается тогда, когда примет сообщение WM_QUIT, она должно возвратить значение выхода, содержащееся в параметре этого сообщения wParam. Если функция завершается перед вводом цикла сообщения, она должна возвратить 0.

Синтаксис:

int WINAPI WinMain

(

HINSTANCE hInstance, // дескриптор текущего экземпляра окна

HINSTANCE hPrevInstance, // дескриптор предыдущего экземпляра окна

LPSTR lpCmdLine, // указатель на командную строку

int nCmdShow // показывает состояние окна

);

LoadIcon

Функция загружает указанный ресурс значка из исполняемого (.exe) файла, связанного с экземпляром приложения. Если функция завершается успешно, возвращаемое значение - дескриптор недавно загруженного значка. Если функция завершается ошибкой, возвращаемое значение - NULL. Чтобы получить дополнительную информацию об ошибке, вызовите GetLastError.

Синтаксис:

HICON LoadIcon (

HINSTANCE hInstance, // Дескриптор экземпляра модуля

LPCTSTR lpIconName // Указатель на строку

);

GetStockObject

Функция извлекает дескриптор одного из предопределенных (стандартных) перьев, кистей, шрифтов или палитр. Если функция завершается успешно, возвращаемое значение - дескриптор затребованного логического объекта. Если функция завершается с ошибкой, возвращаемое значение - ПУСТО (NULL).

Синтаксис:

HGDIOBJ GetStockObject (

int fnObject // тип предопределенного объекта

);

LoadCursor

Функция загружает заданный ресурс курсора из исполняемого (.EXE) файла, связанного с экземпляром прикладной программы. Если функция завершается успешно, возвращаемое значение - дескриптор недавно загруженного курсора. Если функция завершается ошибкой, возвращаемое значение - ПУСТО (NULL).

Синтаксис:

HCURSOR LoadCursor (

HINSTANCE hInstance, // Дескриптор экземпляра модуля

LPCTSTR lpCursorName // Указатель на строку

);

RegisterClassEx

Регистрирует класс окна для последующего использования при вызове CreateWindowEx функции.

Синтаксис:

ATOM WINAPI RegisterClass (

WNDCLASS * lpWndClass // Указатель на WNDCLASS структуры.

);

GetSystemMetrics

Создает перекрывающее, всплывающее или дочернее окно с расширенным стилем окна. Если функция успешно завершила работу, возвращаемое значение - дескриптор созданного окна. Если функция завершилась ошибкой, возвращаемое значение - ПУСТО (NULL).

Синтаксис:

HWND CreateWindowEx (

DWORD dwExStyle, // улучшенный стиль окна

LPCTSTR lpClassName, // указатель на зарегистрированное имя класса

LPCTSTR lpWindowName, // указатель на имя окна

DWORD dwStyle, // стиль окна

int x, // горизонтальная позиция окна

int y, // вертикальная позиция окна

int nWidth, // ширина окна

int nHeight, // высота окна

HWND hWndParent, // дескриптор родительского или окна владельца

HMENU hMenu, // дескриптор меню или ID дочернего окна

HINSTANCE hInstance, // дескриптор экземпляра прикладной программы

LPVOID lpParam // указатель на данные создания окна

);

SetMenu

Функция назначает новое меню для заданного окна.

Синтаксис

BOOL SetMenu (

HWND hWnd, // Дескриптор окна, к которому назначается меню.

HMENU hMenu // Дескриптор нового меню.

);

ShowWindow

Показать окно, установить статус показа. Если окно перед этим было видимо, возвращается значение - не 0. Если окно перед этим было не видимо, возвращаемое значение - 0.

Синтаксис:

BOOL ShowWindow (

HWND hWnd, // дескриптор окна

int nCmdShow // состояние показа окна

);

UpdateWindow

Функция обновляет рабочую область заданного окна, отправляя сообщение WM_PAINT окну, если регион обновления окна не пуст. Функция отправляет сообщение WM_PAINT непосредственно оконной процедуре указанного окна, обходя очередь приложения. Если регион обновления пуст, никакое сообщение не отправляется. Если функция завершается успешно, возвращаемое значение - не 0. Если функция завершается ошибкой, возвращаемое значение - 0.

Синтаксис:

BOOL UpdateWindow (

HWND hWnd // Дескриптор окна.

);

GetMessage

Получить очередное сообщение из очереди сообщений данного приложения.

Синтаксис:

BOOL GetMessage (

LPMSG lpMsg, // указатель на структуру

HWND hWnd, // указатель окна чьи сообщения нужно обрабатывать

UINT wMsgFilterMin, // номер мимимального сообщения для выборки

UINT wMsgFilterMax // номер максимального сообщения для выборки

);

TranslateMessage

Транслировать клавиатурные сообщения в ASCII-коды. Если сообщение переведено (то есть символьное сообщение помещено в очереди сообщений потока), величина возвращаемого значения не 0. Если сообщение не переведено (то есть символьное сообщение не помещено в очереди сообщений потока), величина возвращаемого значения - 0.

Синтаксис:

BOOL TranslateMessage (

const MSG* lpMsg // Указатель на структуру MSG, которая содержит информацию о сообщении извлеченную из очереди сообщений вызывающего потока при помощи использования функции GetMessage.

);

DispatchMessage

Вернуть управление Windows с передачей сообщения предназначенному окну. Величина возвращаемого значения определяется значением, которое возвращает оконная процедура. Несмотря на то, что это значение зависит от отправляемого сообщения, возвращаемое значение, как правило, игнорируется.

Синтаксис:

LRESULT DispatchMessage (

CONST MSG *lpmsg // указатель на структуру с сообщением

);

SendMessage

Функция отправляет заданное сообщение окну или окнам. Функция вызывает оконную процедуру для заданного окна и не возвращает значение до тех пор, пока оконная процедура не обработает сообщение. Чтобы отправить сообщение и возвратить немедленно значение, используйте функцию SendMessageCallback или SendNotifyMessage. Чтобы поместить сообщение в очередь сообщений потока и возвратить немедленно значение, используйте функцию PostMessage или PostThreadMessage.

Синтаксис

LRESULT SendMessage (

HWND hWnd, // Дескриптор окна

UINT Msg, // Определяет сообщение, которое будет отправлено

WPARAM wParam, // Определяет дополнительную конкретизирующую сообщение информацию

LPARAM lParam // Определяет дополнительную конкретизирующую сообщение информацию

);

SetWindowText

Функция изменяет текст заголовка заданного окна (если таковой имеется). Если определяемое окно - орган управления, то изменяется его текст. Однако SetWindowText не может изменить текст органа управления в другом приложении.

Синтаксис

BOOL SetWindowText (

HWND hWnd, // дескриптор окна или элемента управления

LPCTSTR lpString // адрес строчки

);

SetFocus

Функция устанавливает фокус клавиатуры в заданном окне. Окно должно быть связано с очередью сообщений вызывающего потока.

Синтаксис

HWND SetFocus

(HWND hWnd // дескриптор окна, которому передается фокус

);

SetWindowLong

Функция заменяет атрибуты указанного окна. Функция также устанавливает и 32-разрядное (long) значение при заданном смещении в дополнительную память окна.

Синтаксис

LONG SetWindowLong (

HWND hWnd, // Дескриптор окна

int nIndex, // Определяет отсчитываемое от нуля смещение устанавливаемого значения

LONG dwNewLong // Устанавливает заменяемое значение

);

MoveWindow

Функция изменяет позицию и габариты определяемого окна. Для окна верхнего уровня, позиция и габариты отсчитываются относительно левого верхнего угла экрана. Для дочернего окна, они - относительно левого верхнего угла рабочей области родительского окна.

Синтаксис

BOOL MoveWindow (

HWND hWnd, // дескриптор окна

int x, // позиция по горизонтали

int y, // позиция по вертикали

int nWidth, // ширина

int nHeight, // высота

BOOL bRepaint // флажок перекраски

);

GetClientRect

Функция возвращает координаты клиентской области окна. Клиентские координаты определяют верхний левый и правый нижний углы клиентской области. Поскольку клиентские координаты относительны левому углу клиентской области окна, то координаты верхнего левого угла является (0, 0).

BOOL GetClientRect (

HWND hWnd, // дескриптор окна

LPRECT lpRect // адрес структуры для клиентских координат

);

PostQuitMessage

Функция указывает системе, что поток сделал запрос на то, чтобы завершить свою работу (выйти). Это обычно используется в ответ на сообщение WM_DESTROY.

Синтаксис

void PostQuitMessage (

int nExitCode // Определяет код завершения прикладной программы

);

DefWindowProc

Функция вызывается оконной процедурой по умолчанию, чтобы обеспечить обработку по умолчанию любого сообщения окна, которые приложение не обрабатывает. Эта функция гарантирует то, что обрабатывается каждое сообщение. Функция DefWindowProc вызывается с теми же самыми параметрами, принятыми оконной процедурой.

Синтаксис

LRESULT DefWindowProc (

HWND hWnd, // Дескриптор оконной процедуры

UINT Msg, // сообщение

WPARAM wParam,

LPARAM lParam

);

CreateFile

Функция создает или открывает каталог, физический диск, том, буфер консоли, коммуникационный ресурс, почтовый слот или именованный канал. Если функция завершается успешно, возвращаемое значение - открытый дескриптор заданного файла. Если функция завершается с ошибкой, возвращаемое значение - INVALID_HANDLE_VALUE.

Синтаксис:

HANDLE CreateFile (

LPCTSTR lpFileName, // имя файла - указатель на символьную строку с нулем в конце, устанавливающую имя объекта, который создается или открываться

DWORD dwDesiredAccess, // режим доступа (чтение, запись или то и другое)

DWORD dwShareMode, // режим совместного доступа (чтение, запись, оба или никакого действия)

LPSECURITY_ATTRIBUTES lpSecurityAttributes, // Указатель на структуру SECURITY_ATTRIBUTES, которая устанавливает может ли возвращенный дескриптор быть унаследован дочерними процессами

DWORD dwCreationDisposition, // как действовать

DWORD dwFlagsAndAttributes, // атрибуты и флажки файла

HANDLE hTemplateFile // Дескриптор файла шаблона с правом доступа GENERIC_READ

);

GetFileSize

Функция извлекает размер указанного файла. Размер файла, который может быть сообщен при помощи этой функции ограничивается значением двойного слова (DWORD). Если функция завершается успешно, возвращаемое значение - младшая часть двойного слова размера файла, и если параметр lpFileSizeHigh - не ПУСТО (NULL), функция помещает старшую часть двойного слова размера файла в переменную, на которую указывает этот параметр. Если функция завершается ошибкой, и lpFileSizeHigh равен ПУСТО (NULL), возвращаемое значение - INVALID_FILE_SIZE. Если функция завершается ошибкой, и lpFileSizeHigh - не ПУСТО (NULL), возвращаемое значение - INVALID_FILE_SIZE.

Синтаксис:

DWORD GetFileSize (

HANDLE hFile, // дескриптор файла, размер которого должен возвратиться.

LPDWORD lpFileSizeHigh // указатель на переменную, в которой возвращается старшее слово размера файла.

);

CloseHandle

Функция закрывает дескриптор открытого объекта, созданный функцией CreateFile. Если функция завершается успешно, величина возвращаемого значения - не 0. Если функция завершается с ошибкой, величина возвращаемого значения - 0.

Синтаксис:

BOOL CloseHandle (

HANDLE hObject // дескриптор открытого объекта

);

MessageBox

Отображается модальное диалоговое окно, которое содержит системный значок, набор кнопок, а также краткое заявление конкретного сообщения, например, статуса или об ошибке. В окне сообщения возвращает целое число, указывающее кнопку, нажатую пользователем. Если функция завершается ошибкой, возвращаемое значение равняется 0.

Синтаксис:

Int MessageBox (

HWND HWND, // Дескриптор владельца окна в окне сообщения. Если этот параметр - ПУСТО (NULL), окно сообщения не имеет окна владельца.

LPCTSTR lpText, // Указатель на символьную строку с нулем в конце, которая содержит сообщение показываемое на экране.

LPCTSTR lpCaption, // Указатель на символьную строку с нулем в конце, которая содержит заголовок диалогового окна (окна сообщения).

UINT uType // Содержание и поведение диалогового окна.

);

SysAllocStringByteLen

Принимает на входе строку ANSI и возвращает содержащую ее BSTR. Не выполняет никаких преобразований ANSI-Unicode.

BSTR SysAllocStringByteLen (

char FAR* psz, // Заканчивающаяся нулем строка, которую нужно скопировать, или NULL, если новая строка должна остаться неинициализированной.

unsigned int len // Число байт, которые нужно скопировать из psz. После скопированных символов добавляется нулевой символ, т.е. всего выделяется len +1 байт

);

ReadFile

Функция читает данные из файла или того, что было создано функцией CreateFile, начиная с позиции, обозначенной указателем файла.

Синтаксис:

BOOL ReadFile (

HANDLE hFile, // дескриптор файла, который читается

LPVOID lpBuffer, // Указатель на буфер, который принимает прочитанные данные из файла

DWORD nNumberOfBytesToRead, // число байтов, которые читаются из файла

LPDWORD lpNumberOfBytesRead, // число прочитанных байтов

LPOVERLAPPED lpOverlapped // асинхронный буфер

);

WriteFile

Функция пишет данные в файл с места, обозначенного указателем позиции в файле. Если функция завершается успешно, величина возвращаемого значения - не 0. Если функция завершается с ошибкой, величина возвращаемого значения - 0.

Синтаксис:

BOOL WriteFile (

HANDLE hFile, // дескриптор файла

LPCVOID lpBuffer, // Указатель на буфер, содержащий данные, которые будут записаны в файл

DWORD nNumberOfBytesToWrite, // число байтов, которые будут записаны в файл

LPDWORD lpNumberOfBytesWritten, // число записанных байтов

LPOVERLAPPED lpOverlapped // асинхронный буфер

);

DeleteFile

Функция удаляет существующий файл. Если функция завершается успешно, возвращаемое значение - не 0. Если функция завершается с ошибкой, величина возвращаемого значения - 0.

Синтаксис:

BOOL DeleteFile (

LPCTSTR lpFileName // Указатель на символьную строку с нулем в конце, которая определяет имя удаляемого файла

);

GetWindowTextLength

Функция возвращает обратно длину, в символах, текста строки заголовка заданного окна (если окно имеет область заголовка). Если определяемое окно - орган управления, функция возвращает обратно длину текста внутри элемента управления. Однако, GetWindowTextLength не может получить длину текста поля редактирования текста в другом приложении.

Синтаксис

int GetWindowTextLength (

HWND hWnd // дескриптор окна или панели

 // управления с текстом

);

SysFreeString

Освобождает строку, выделенную ранее с помощью SysAllocString, SysAllocString-ByteLen, SysReAllocString, SysAllocStringLen и SysReAllocStringLen.

void SysFreeString

(

BSTR bstr // Выделенная ранее BSTR либо NULL. В последнем случае функция просто возвращает управление.

);

DestroyWindow

Функция разрушает заданное окно. Функция отправляет сообщения WM_DESTROY и WM_NCDESTROY окну, чтобы деактивировать его и удалить фокус клавиатуры из него. Функция также уничтожает меню окна, очищает очередь потоков сообщений, уничтожает таймеры, удаляет монопольное использование буфера обмена и разрывает цепочку просмотра окон буфера обмена (если окно имеет наверху цепочку просмотров).

Если заданное окно - родитель или владелец окон, DestroyWindow автоматически уничтожает связанные дочерние или находящиеся в собственности окна, когда она уничтожает окно владельца или родителя. Функция сначала уничтожает дочерние или находящиеся в собственности окна, а затем она уничтожает окно владельца или родителя.

Функция DestroyWindow уничтожает также и немодальные диалоговые окна, созданные функцией CreateDialog.

Синтаксис

BOOL DestroyWindow (

HWND hWnd // дескриптор для разрушения окна

);

CallWindowProc

Функция передает информацию сообщения процедуре заданного окна.

Синтаксис

LRESULT CallWindowProc (

WNDPROC lpPrevWndFunc, // указатель на предыдущую процедуру

HWND hWnd, // дескриптор окна

UINT Msg, // сообщение

WPARAM wParam, // первый параметр сообщения

LPARAM lParam // второй параметр сообщения

);

GetOpenFileName

Функция создает диалоговое окно Открыть (Open), которое позволяет пользователю определить открываемый диск, каталог и имя файла или имена ряда файлов. Если пользователь задает имя файла и щелкает по кнопке ОК, возвращаемое значение не нуль. Буфер, указанный членом lpstrFile структуры OPENFILENAME содержит полный путь и имя файла, которые определил пользователь. Если пользователь прервал работу или закрыл диалоговое окно Открыть (Open) или произошла ошибка, возвращаемое значение - 0.

Синтаксис:

BOOL GetOpenFileName (

LPOPENFILENAME lpofn // Указатель на структуру OPENFILENAME, которая содержит информацию, используемую для инициализации диалогового окна. Когда GetOpenFileName возвращает значение, эта структура содержит информацию о файле, выбранном пользователем.

);

GetSaveFileName

Функция создает стандартное диалоговое окно Сохранить (Save), которое позволяет пользователю определить диск, каталог и имя файла, которое нужно сохранить. Если пользователь задает имя файла и щелкает по кнопке ОК и функция завершается успешно, возвращаемое значение не 0.

Синтаксис:

BOOL GetSaveFileName (

LPOPENFILENAME lpofn // Указатель на структуру OPENFILENAME, которая содержит информацию, используемую, чтобы инициализировать диалоговое окно. Когда GetSaveFileName возвращает значение, эта структура содержит информацию о выбранном пользователем файле.

2. Текст программы

программирование программа ассемблер текстовый

qikpad.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,\

«Анастасия © 2013»

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

ret

About endp

end start

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; адрес буфера

mov ecx, lenBuffer; длина буфера

mov al, TheChar; загрузить др. с характером

rep stosb; написать тип в буфере до тех пор пока ECX = 0

pop edi

ret

FillBuffer endp

rsrc.rc

#include «\masm32\include\resource.h»

500 ICON MOVEABLE PURE LOADONCALL DISCARDABLE «MAINICON.ico»

600 MENUEX MOVEABLE IMPURE LOADONCALL DISCARDABLE

BEGIN

POPUP «&Файл», 0

BEGIN

MENUITEM «&Создать», 1000

MENUITEM «&Открыть…», 1001

MENUITEM «&Сохранить…», 1002

MENUITEM «Сохранить &как», 1003

MENUITEM «», 0x0800 /*MFT_SEPARATOR*/

MENUITEM «&Закрыть», 1010

END

POPUP «&Правка», 0

BEGIN

MENUITEM «&Отменить\tCtrl+Z», 1100

MENUITEM «», 0x0800 /*MFT_SEPARATOR*/

MENUITEM «&Вырезать\tCtrl+X», 1101

MENUITEM «&Копировать\tCtrl+C», 1102

MENUITEM «&Вставить\tCtrl+V», 1103

MENUITEM «&Удалить\tDelete», 1104

END

POPUP «&Справка», 0

BEGIN

MENUITEM «&О блокноте», 1900

END

END

Вывод

В результате выполнения данной курсовой работы был изучен один из разделов операционной системы - работа с текстовой информацией при программировании в Windows. Была написана программа на 32-битном ассемблере с применением API-функций.

Размещено на Allbest.ru


Подобные документы

  • Программирование в операционной системе Windows. Работа с потоками и процессами ОС. Методы их создания. Основы вызова API-функций. Пример создания диалогового окна без использования файла ресурсов. Разработка программы с помощью 32-битного ассемблера.

    курсовая работа [107,6 K], добавлен 18.05.2014

  • Изучение основ программирования на 32-битном ассемблере с применением API-функций. Ознакомление с основами разработки программы, демонстрирующей работу одного из разделов ОС Windows - всплывающих подсказок. Анализ результатов работы данной программы.

    отчет по практике [105,1 K], добавлен 10.02.2015

  • Описание использованного набора макросредств. Список использованных констант и структур. Основы вызова API-функций. Основы программирования на 32-битном ассемблере. Формирование объектного кода, содержащего текст исходной программы в машинном виде.

    курсовая работа [150,4 K], добавлен 18.05.2014

  • Основы программирования на 32-битном Ассемблере, разработка с его помощью программы, демонстрирующей работу одного из разделов ОС Windоws. Описание используемых АРI-функций как интерфейса программирования приложений. Листинг программы, результаты работы.

    курсовая работа [164,5 K], добавлен 18.05.2014

  • Таймер в Windows как устройство ввода информации, которое извещает приложение о том, что истек заданный интервал времени. Работа с таймером в условиях WinAPI, процесс 32-битного программирования на ассемблере под Windows. Результат выполнения программы.

    курсовая работа [165,6 K], добавлен 18.05.2014

  • Основы программирования в операционной системе Windows. Создание процессов в 32-битных операционных системах. Основное отличие дескриптора от идентификатора. Понятие критической секции. Основы вызова API-функций. Методы многозадачного программирования.

    курсовая работа [501,1 K], добавлен 18.05.2014

  • Программирование оконных Windows-приложений, средства TASM для их разработки. Углубленное программирование на ассемблере для Win32, минимальная программа. Организация высокоуровневого консольного ввода-вывода. Наборы символов и функции Wlndows APL.

    курсовая работа [51,6 K], добавлен 23.06.2015

  • График функции. Дескриптор окна консоли. Процедура обработки сообщений. Регестрация класса окна с помощью функции RegisterClass. Обработчик сообщений по умолчанию. Текст программы. Процедура WNDProc. Главная функция. Управление вызывающей функции.

    практическая работа [311,0 K], добавлен 11.10.2008

  • Ассемблер как символический аналог машинного языка. Архитектура микропроцессора: организация памяти, способы адресации операндов, правила использования регистров. Текст программы. Этапы программирования на ассемблере, алгоритмы выполнения задач.

    контрольная работа [515,1 K], добавлен 20.01.2016

  • Характеристика средств обработки текстовой информации, способы редактирования и форматирования документов. Порядок создания списков и таблиц, проверка орфографии и синтаксиса текста. Выбор формата файла. Работа в табличном процессоре Microsoft Excel.

    курсовая работа [411,1 K], добавлен 27.04.2013

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.