Сделай Сам Свою Работу на 5

Создание программ, способных использовать и ANSI, и Unicode





Главное, что для этого нужно:

· привыкайте к тому, что текстовые строки — это массивы символов, а не массивы байтов или значений типа char;

· используйте универсальные типы данных (вроде TCHAR или PTSTR) для текстовых символов и строк;

· используйте явные типы данных (вроде BYTE или PBYTE) для байтов, указателей на байты и буферов данных;

· применяйте макрос TEXT для определения символьных и строковых литералов;

· предусмотрите возможность глобальных замен (например, PSTR на PTSTR);

· модифицируйте логику строковой арифметики. Например, функции обычно принимают размер буфера в символах, а не в байтах Это значит, что вместо sizeof(szBuffer) Вы должны передавать (sizeof(szBuffer) / sizeof(TCHAR)). Но блок памяти для строки известной длины выделяется в байтах, а не символах, т. e. вместо malloc(nCharacters) нужно использовать malloc(nCbaracters *sizeof(TCHAR)).

В Windows есть набор функций для работы с Unicode-строками. Эти функции перечислены ниже.

Функция Описание
StringCchCat Выполняет конкатенацию строк
lstrcmp Сравнивает две строки с учетом регистра букв
lstrcmpi Сравнивает две строки без учета регистра букв
StringCchСopy Копирует строку в другой участок памяти
StringCchLength Возвращает длину строки в символах

Они реализованы как макросы, вызывающие либо Unicode-, либо ANSI-версию функции в зависимости от того, определен ли UNICODE при компиляции исходного модуля Например, если UNICODE не определен, StringCchCat раскрывается в StringCchCatA, определен — в StringCchCatW.



Строковые функции lstrcmp и lstrcmpi ведут себя не так, как их аналоги из библиотеки С (strcmp, strcmpi, wcscmp и wcscmpf), которые просто сравнивают кодовые позиции в символах строк. Игнорируя фактические символы, они сравнивают числовое значение каждого символа первой строки с числовым значением символа второй строки. Но lstrcmp и lstrcmpi реализованы через вызовы Windows-функции CompareString

Многие функции С-библиотеки с Unicode-строками толком не работают. Так, tolower и toupper неправильно преобразуют регистр букв со знаками ударения. Поэтому для Unicode-строк лучше использовать соответствующие Windows-функции. К тому же они корректно работают и с ANSI-строками.

Введение в WinAPI

Windows представляет собой систему в виде набора объектов, основным из которых является окно. В процессе работы Windows "общается" с каждым объектом посредством системных сообщений. При возникновении определенных событий (нажатие клавиши, перемещение мыши, истечение времени таймера) Windows сообщает об этом окну приложения, посылая ему соответствующее сообщение. Окно, после получения сообщения, должно обработать его и возвратить результат обратно в систему.



Каждое Windows-приложение построено на основе цикла обработки сообщений, который принимает эти сообщения и отправляет их к соответствующим функциям – обработчикам сообщений.

С точки зрения пользователя, окно - это прямоугольная область экрана, которую занимает каждая программа Windows. Одна программа может создать несколько окон, но всегда имеется одно окно верхнего уровня, которое называется “главным окном” приложения.

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

ОС Windows являются многозадачными и многопоточными. Они позволяют запускать несколько процессов (задач) в виде приложений, каждое из которых может состоять из одного или более потоков. Различные приложения и потоки делят между собой эти ограниченные ресурсы ПК, распределение которых осуществляет операционная оболочка Windows. Имеются специальные механизмы управления процессами и потоками, которые будут рассмотрены позже.

Типичное Win32-приложение состоит из одного или более потоков, которые выполняются параллельно (потоки можно понимать как многозадачность в рамках отдельного приложения, например, один поток обрабатывает данные, вводимые пользователем, в то время как другой поток занят передачей документа на принтер).



 

Win API

Win API (Application Programming Interface - интерфейс программирования приложений) - это набор функций разработанных фирмой Microsoft, позволяющих программисту создавать приложения для Windows. Win API является основой для каждой Windows-программы.

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

Функции API содержатся в библиотеках динамической загрузки (Dynamic Link Libraries, или DLL), таких как Kernel32.dll/ Kernel64.dll, User32.dll/ User64.dll и Gdi32.dll/ Gdi64.dll и др. Kernel32.dll/ Kernel64.dll содержит API-функции, работающие с памятью и управляющие процессами. User32.dll/User64.dll управляет пользовательским интерфейсом программы. Gdi32.dll/ Gdi64.dll содержит графические функции.

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

Тема: Сообщения Windows. Типы сообщений

Существует много разновидностей сообщений, представляющих события на разных уровнях. Каждое простое событие, каждое простое действие посылается в виде сообщения окну для обработки.

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

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

typedef struct tagMSG

{

HWND hwnd; // окно, которому посылается это сообщение

UINT message; // значение самого сообщение

WPARAM wParam; // для передачи дополнительной инф-и

LPARAM lParam; // для передачи дополнительной инф-и

DWORD time; // время, когда произошло событие

POINT pt; // точка, где произошло события (для мыши)

} MSG;

Типы данных в Windows

В Windows-программах кроме стандартных типов данных из С или С++, широко используются типы данных, определенные в различных библиотечных (header) файлах.

Основные типы данных, используемых в Win32 API приведены в таблице.

Обозначение типа Назначение типа
BOOL, BOOLEAN Булевый. Имеет только 2 значения: TRUE или FALSE
CHAR 8-битный символ (ANSI Windows)
BYTE 8-битное беззнаковое целое или символьное значение
WCHAR 16-битный символ (Unicode)
TCHAR CHAR или WCHAR (если используется Unicode)
USHORT, WORD Целое беззнаковое 16-битное число
DWORD, DWORD32, UINT Целое беззнаковое 32-битное число
DWORD64, UINT64, ULONGLONG Целое беззнаковое 64-битное число
FLOAT Число с плавающей точкой
SHORT Целое знаковое 16-битное число
INT, INT32, LONG, LONG32 Целое знаковое 32-битное число
INT64, LONG64, LONGLONG Целое знаковое 64-битное число
HANDLE 32-битное целое, используемое в качестве дескриптора
HWND 32-битное целое – дескриптор окна
LPSTR Длинный указатель на строку
LPCSTR Константный (const) указатель на строку

Соглашение об именах (Венгерская нотация)

При задании имен функциям и переменным в Windows-программах рекомендуется соблюдать ряд правил, называемых "Венгерская нотация" или соглашением об именах идентификаторов. Автором этого соглашения является д-р Чарльз Симонии, венгр по происхождению.

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

При задании нового идентификатора в программе, необходимо руководствоваться следующим:

1. Мнемоническое значение: идентификатор должен легко запоминаться

2. Смысловое значение: роль идентификатора должена быть ясна из его названия

3. Преемственность: похожие объекты должны иметь похожие идентификаторы.

4. Скорость решения: задание, ввод и редактирование идентификатора не должны занимать слишком много времени, идентификатор не должен быть слишком длинным.

Для функций используются имена, построенные из глаголов и существительных, причем первые буквы этих слов — заглавные. Например, GetFreeDiskSpace – функция для получения объема свободного дискового пространства.

Для имен переменных используется небольшой префикс из строчных букв, а собственно имя начинается с заглавной буквы. Ниже приведены префиксы типов данных, наиболее часто используемые при разработке приложений для Win32

Префикс Назначение Тип в программе
g_ префикс для глобальной переменной  
l длинное целое со знаком long
p указатель *
lp дальний указатель far *
c символ, 1 байт char
b логическое значение BOOL
u целое без знака, 32 бита UINT
w 16-битное слово (2 байта) WORD, unsigned short
dw 32-битное слово (4 байта) DWORD, unsigned long
n, i целое со знаком, 32 бита int
fn функция  
sz ASCII строка char[]
psz ASCII строка char *
pcsz константная ASCII строка const char *
pv произвольный указатель void *
h дескриптор объекта, хендл HANDLE, void *

 

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

Для идентификаторов сообщений обычно используются символьные представления(WM_PAINT, WM_TIMER),а не числовые значения. Эти символьные значения определены в стандартных файлах заголовков Windows (приложению необходимо включать в свой исходный текст только файл windows.h – он содержит директивы #include для остальных файлов). В среде Visual C++ в приложение необходимо включать заголовочный файл stdafx.h, который содержит включения всех стандартных заголовочных файл, в т.ч. и windows.h

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

· сообщения DDE (dynamic data exchange),

· сообщения буфера обмена (clipboard),

· сообщения мыши,

· сообщения клавиатуры,

· сообщения неклиентской (non-client) области окна,

· сообщения MDI (multiple-document interface),

· другие типы.

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

Приведем обзор наиболее часто обрабатываемыхсообщений:

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

· WM_DESTROY - посылается оконной процедуре окна, которое уже удалено с экрана и должно быть разрушено.

· WM_CLOSE - указывает, что окно должно быть закрыто. Обработчик по умолчанию в функции DefWindowProc при получении этого сообщения вызывает DestroyWindow. Приложение может, например, вывести диалоговое окно подтверждения и вызвать DestroyWindow только в случае подтверждения пользователем закрытия окна.

· WM_QUIT - это обычно последнее сообщение, которое получает основное окно приложения. Получение этого сообщения приводит к возврату нулевого значения функцией GetMessage, что в свою очередь приводит к завершению цикла сообщений большинства приложений. Это сообщение требует завершить приложение. Оно генерируется в ответ на вызов функции PostQuitMessage.

· WM_LBUTTONDOWN -одиночное нажатие левой кнопки мыши

· WM_RBUTTONDOWN одиночное нажатие правой кнопки мыши

· WM_LBUTTONDBLCLK -двойной щелчок мышьюлевой кнопкой мыши

· WM_RBUTTONDBLCLK -двойной щелчок мышьюправой кнопкой мыши

· WM_QUERYENDSESSION - уведомляет приложение о намерении Windows закончить сеанс. Приложение может возвратить значение FALSE в ответе на это сообщение, предотвратив этим выключение Windows. После обработки сообщения WM_QUERYENDSESSION Windows посылает всем приложениям сообщение WM_ENDSESSION с результатами этой обработки.

· WM_ENDSESSION - посылается приложениям после обработки сообщения WM_QUERYENDSESSION. Оно указывает, должна ли Windows выключиться, или выключение отложено. При указании выключения сеанс Windows может закончиться в любое время после обработки сообщения WM_ENDSESSION всеми приложениями. Поэтому важно, чтобы приложения выполнили все задачи по обеспечению безопасного завершения работы.

· WM_ACTIVATE - указывает, что окно верхнего уровня будет активизировано или деактивизировано. Сообщение сначала посылается окну, которое должно быть деактивизировано, а потом окну, которое должно быть активизировано.

· WM_SHOWWINDOW - указывает, что окно должно быть скрыто или отображено. Окно может быть скрыто в результате вызова функции ShowWindow или в результате максимизации другого окна.

· WM_ENABLE – посылается окну, когда оно становится доступным или недоступным. Это может произойти после вызова функции EnableWindow. Недоступное окно не может принимать вводимые данные от мыши или клавиатуры.

· WM_MOVE – указывает, что расположение окна изменилось.

· WM_SIZE – указывает,что размер окна был изменен.

· WM_SETFOCUS – указывает получение окном фокуса клавиатуры.

· WM_KILLFOCUS – указывает, что окно должно потерять фокус клавиатуры.

· WM_GETTEXT – посылается окну, запрашивая копирование текста окна в буфер. Для большинства окон текстом является их заголовок. Для элементов управления типа кнопок и т.д. текстом окна является текст, отображаемый в этих элементах. Обычно это сообщение обрабатывается функцией DefWindowProc.

· WM_SETTEXT – запрашивает установку текста окна из содержимого буфера. Функция DefWindowProc в ответ на это сообщение устанавливает текст окна и соответственно его отображает.

 

 

 








Не нашли, что искали? Воспользуйтесь поиском по сайту:



©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.