Работа с текстовой информацией при программировании в 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