<< Назад Вернуться к списку Дальше >>

5. Специфика программирования под Windows. Типы данных Windows. Создание простейшей программы под Windows. План. 1. Определение своих типов данных. 2. Типы данных, используемых в Windows. 3. Первая программа под Windows c MessageBox. 4. Разбор программы. 5. Создание Win32 приложения в Visual C++. С++ позволяет определять новые типы данных. Делается это так: typedef int myint; После такой строки в программе можно создавать переменные типа myint: myint a; При этом эти переменные на самом деле будут иметь ту же структуру, что и int. Т.е. с этих пор тип myint - это другое название типа int. Зачем это надо? Например мы пишем библиотеку, состоящую из большого количества функций, работающих с нецелыми числами, одна из которых - вычисление квадратного корня: float sqrt(float a) { // ... } Преположим, что в некоторый момент нас перестала устраивать точность вычислений и хотелось бы сделать так, чтобы вместо float везде в программе использовался тип double. Для этого придется во всей программе исправлять float на double - при большой программе довольно затруднительно, особенно если учитывать, что можно в каком-то месте что-то не заметить и программа тогда вообще перестанет работать. Выход из данной ситуации такой: в начале определить свой тип: typedef float myreal; И дальше использовать во всех функциях именно его: myreal sqrt(myreal a) { // ... } Тогда если нам захочется изменить точность вычислений, надо будет только в одном месте изменить float на double: typedef double myreal; Есть и другие применения для использования своих типов. Одно из них - объяснение значения, хранимого в данной переменной. Это часто используется в программах для Windows. Программисты, разрабатывающие библиотеки с функциями Windows определили множество типов, которые поясняют, какие типы параметров принимает та или иная функция. Рассмотрим некоторые из них: тип чему соответствует описание и место использования --------------------------------------------------------------------- BOOL bool логическая переменная CHAR char символ COLORREF 32-bit (int) (RGB) цвет (1-й байт - красный..) DWORD 32-bit unsigned int Беззнаковый int (только неотрицательные значения). HANDLE 32-bit (int) Handle - дескриптор какого-то объекта. HINSTANCE Дескриптор приложения. HWND Дескриптор окна. LPCSTR const char * Указатель на константный массив символов (строка). LPSTR char * Указатель на массив символов (строка). LRESULT 32-bit (int) Результат работы функции. UINT unsigned int Беззнаковый int (только неотрицательные значения). WORD 16-bit unsigned int Данные типы состоят из некоторых ключевых слов и букв, читая которые можно понять, что хранится в переменных данных типов. LPCSTR: LP - long pointer - указатель, С - constant - константа, STR - string - массив символов, заканчивающийся символом '\0'. HWND: H - handle - дескроптор (некоторый номер, который соответствует только этому объекту) WND - window - окно Т.е. это некоторый уникальный идентификатор окна Windows. В данной таблице приведены не все специфические для Windows типы данных, с остальными мы будем знакомиться по мере надобности. Пришло время написать первую программу под Windows. #define WIN32_LEAN_AND_MEAN #include <windows.h> int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow) { MessageBox(NULL, "Текст сообщения", "Заголовок", MB_OK | MB_EXCLAMATION); return 0; } Вот такая маленькая программа. Но и делает она не очень много: выводит на экран окошечко с заголовком "Заголовок" и текстом "Текст сообщения". Кроме того в окошке есть кнопка OK и картинка, на которой изображен восклицательный знак в треугольнике. При нажатии на кнопку программа завершается. Разберем, как работает эта программа. Первая строка определяет флаг WIN32_LEAN_AND_MEAN, присутствие которого позволяет препроцессору исключить из заголовочного файла windows.h редкоиспользуемые участки кода, тем самым сократив время комписяции. Вторая строка подключает файл windows.h, который содержит описания всех Windows функций. Далее идет функция WinMain, которая принимает четыре параметра. Если в консольном приложении выполнение начиналось с функции main, то Windows приложение начинается с выполнения функции WinMain. Рассмотрим параметры, принимаемые этой функцией: HINSTANCE hInst - дескриптор запущенного приложения, т.е. при запуске приложения Windows создает его уникальный идентификатор и передает его в функцию WinMain. HINSTANCE hPrevInst - десктиптор предыдущего запущенного приложения. В 32-разрядный Windows этот параметр всега нулевой. LPSTR lpCmdLine - командная строка, содержащая все параметры через пробел. int nCmdShow - флаг, указывающий, как должно быть показано в начале главное окно приложения. Указывается как рекомендация программисту. Т.е. этот параметр можно и проигнорировать. Вся функция WinMain в нашей программе состоит из вызова всего одной функции MessageBox. Рассмотрим ее прототип: int MessageBox( HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType ); Она создает окно сообщения в зависимости от параметров: HWND hWnd - дескриптор окна родителя. В Windows у каждого окна может быть родитель - другое окно. Если в этом параметре передать NULL, то у созданного окна не будет родителя. Если в нем передать дескриптор какого-то окна, то это окно будет заблокировано, пока не закроется окно сообщения. LPCTSTR lpText - строка сообщения. Буква T в типе указывает, что данная строка состоит из UNICODE символов. ( UNICODE - это такая кодировка символов, в которой на каждый символ отводится по 2 байта памяти, что позволяет каждому символу из любого алфавита сопоставить уникальный код ) LPCTSTR lpCaption - строка заголовка. UINT uType - тип сообщения, говорящий какие кнопки и картинки распологать на окне сообщения. В нем через символ | нужно написать несколько флагов из списка (все эти флаги начинаются с MB_, что означает, что они используются в функции MessageBox, дальше мы часто будем встречать подобное именование флагов): флаг что будет Код --------------------------------------------------------------------- MB_OK кнопка OK 1 MB_OKCANCEL кнопки OK и Cancel 2 MB_RETRYCANCEL кнопки Retry и Cancel 4 MB_YESNO кнопки Yes и No 8 MB_YESNOCANCEL кнопки Yes, No и Cancel 16 MB_ABORTRETRYIGNORE кнопки Abort, Retry и Ignore 32 MB_ICONEXCLAMATION иконка: ! в треугольнике 64 MB_ICONINFORMATION иконка: i в кружочке 128 MB_ICONQUESTION иконка: ? в ... 256 MB_ICONSTOP иконка: красный крестик в кружочке 512 MB_DEFBUTTON1 по-умолчанию фокус на 1 кнопке 1024 MB_DEFBUTTON2 по-умолчанию фокус на 2 кнопке 2048 MB_DEFBUTTON3 по-умолчанию фокус на 3 кнопке 4096 Из каждой группы флагов надо установить не более одного, иначе программа сделает то, что ей понравится больше. Т.е. можно написать: MessageBox(NULL, "Text", "Header", MB_YESNOCANCEL | MB_ICONQUESTION | MB_DEFBUTTON2); и появится сообщение с кнопками Yes, No и Cancel, вопросительной иконкой и в начале будет выделена кнопка No. Как это работает? Все эти флаги - это некоторые константы, определенные в файле windows.h. Допустим, что они имеют значения, указанные в третьем столбце (на самом деле они не такие, но для нас сейчас важен принцип работы). Тогда их двоичная запись будет такая: -----------32 бита-------------- 1: 00000000000000000000000000000001 2: 00000000000000000000000000000010 4: 00000000000000000000000000000100 8: 00000000000000000000000000001000 16: 00000000000000000000000000010000 32: 00000000000000000000000000100000 64: 00000000000000000000000001000000 и т.д.. Если применить к двум таким числам побитовое логическое сложение "или" (в С++ оно обозначается символом | ), т.е. для каждого бита сумма равна 1 если хотя бы одно из слагаемых равно 1, то в результате получим число, содержащее 1 на тех местах, флаги которых складывались. Т.е. одно целое число может заменить 32 логических переменных. Этот способ широко используется в функциях Windows (WinAPI). Я перечислил не все константы MB_*, а только самые частоиспользуемые. Остальные вы можете посмотреть в файле winuser.h в папке со стандартными библиотеками или в документации MSDN. В конце работы функция WinMain должна возвращать какое-то целое значение. Пока это будет 0.

<< Назад Вернуться к списку Дальше >>

Хостинг от uCoz