- •2.3. Цикл сообщений 15
- •2.4. Функция окна 16
- •1. Концепция программирования под Windows. Основные понятия
- •1.1. Программная среда Windows
- •1.2. Интерфейс вызовов функций в Windows
- •1.3. Библиотеки динамической загрузки
- •1.5. Интерфейс gdi
- •1.6. Многозадачность в Windows
- •1.7. Взаимодействие программ и Windows
- •1.8. Основы программирования под Windows
- •1.8.1.Функция WinMain()
- •1.8.2. Функция окна
- •1.8.3. Цикл сообщений
- •1.8.4. Класс окна
- •1.8.5. Специфика программ для Windows
- •1.8.6. Типы данных в Windows
- •1.8.7. Соглашение об использовании имен
- •1 Вертикальная полоса прокрутки .9. Элементы окна
- •2. Каркас программы под Windows. Создание окна
- •2.1. Каркас программы для Windows 95
- •2.1. Определение класса окна
- •2.2. Создание окна
- •2.3. Цикл сообщений
- •2.4. Функция окна
- •3. Порядок выполнения работы
1.8.7. Соглашение об использовании имен
Если раньше вы не занимались программированием под Windows, то имена некоторых переменных и параметров функций в текстах программ, приведенных в книге, могут показаться вам весьма странными. Дело в том, что они (программы) написаны с соблюдением соглашения об использовании имен, принятом фирмой Microsoft для целей программирования под Windows. Например, имя функции должно начинаться с глагола, за которым следует существительное. Первые символы глагола и существительного должны быть написаны с большой буквы. В большинстве случаев имена функций в книге соответствуют данному правилу.
Для имен переменных Microsoft решила применять довольно сложную систему включения ссылки на используемый тип данных. С этой целью в начало имени переменной добавляется префикс, который соответствует определенному типу данных и записывается маленькими буквами. Само имя начинается с большой буквы.
Таблица 1.1. Символы префиксов типов переменных
b |
булевый (один байт) |
с |
символ (один байт) |
С |
класс |
dw |
длинное беззнаковое целое |
f |
16-разрядное битовое поле (флаги) |
fn |
функция |
h |
дескриптор |
1 |
длинное целое |
lp |
длинный указатель |
n |
короткое целое |
P |
указатель |
pt |
длинное целое, хранящее экранные координаты |
w |
короткое беззнаковое целое |
sz |
указатель на строку, завершающуюся символом '\0' |
lpsz |
длинный указатель на строку, завершающуюся символом '\0' |
rgb |
длинное целое, хранящее значение цвета в формате RGB
|
1 Вертикальная полоса прокрутки .9. Элементы окна
Кнопка минимизации
Кнопка минимизации
Прежде чем продолжить, необходимо определиться с некоторыми важными терминами. На рис. 1.1 изображено стандартное окно и указаны его элементы.
Любое окно имеет рамку, которая задает границы окна и используется для масштабирования. В верхней части окна расположено несколько элементов. В верхнем левом углу находится пиктограмма системного меню (называемая также пиктограммой строки заголовка). По щелчку на ней раскрывается системное меню. Справа от этой пиктограммы находится заголовок окна. В правом верхнем углу помещаются кнопки минимизации, максимизации и закрытия. (В старых версиях Windows кнопки закрытия нет. Она появилась только в Windows 95.)
Рабочая область — это часть окна, в которой происходит работа программы. Большинство окон также содержат горизонтальную и вертикальную полосы прокрутки, предназначенные для перемещения документа внутри окна.
2. Каркас программы под Windows. Создание окна
2.1. Каркас программы для Windows 95
Теперь, когда необходимая информация изложена, давайте напишем миннимальное Windows-приложение. Как уже упоминалось, оно предназначено для Windows. Тем не менее, текст такой программы был бы практически одинаков для всех версий Windows. В программировании под Windows каркасы программ используются довольно часто, поскольку создавать Windows-приложение "с нуля" иногда очень сложно. Поэтому имеет смысл заранее создавать каркас.
Минимальная программа для Windows 95 содержит две функции: WinMain и функцию окна.
Функция WinMain() должна выполнить следующие основные действия:
1. Определить класс окна.
2. Зарегистрировать класс окна в Windows 95.
3. Создать окно, определяемое данным классом.
4. Отобразить это окно.
5. Запустить цикл сообщений.
Функция окна должна отвечать на все поступающие сообщения. Поскольку данная программа не выполняет никаких специальных действий, а лишь отображает окно, то единственное сообщение, которое она должна обрабатывать, поступает при завершении пользователем приложения.
В данной программе создается стандартное окно с заголовком. Это окно также содержит системное меню, следовательно, можно минимизировать, раскрывать на весь экран, перемещать, масштабировать и закрывать. Кроме того, в окне имеются стандартные копки минимизации, максимизации и закрытия. Программа написана на C++ и может быть откомпилирована помощью любого стандартного компилятора с C/C++, который позволяет создавать программы для Windows 95.
#include <windows.h>
/* прототип функции окна */
LRESULT CALLBACK WindowFunc(HWND,UINT,WPARAM,LPARAM);
char szWinName[] ="MyWin"; /* имя класса окна */
/* главная функция */
/*
HINSTANCE hThisInst - дескриптор идентифицирует текущий экземпляр приложения
HINSTANCE hPrevInst - дескриптор идентифицирует предыдущий экземпляр приложения
в Windows 9x = NULL
LPSTR lpszArgs - указатель на строку, содержащую аргументы командной строки
int nWinMode - содержит значение, определяющее каким образом
должно быть отражено окно программы при запуске
*/
int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst,
LPSTR lpszArgs, int nWinMode )
{
/* дескриптор окна */
HWND hwnd;
/* сообщение*/
MSG msg;
/* класс окна */
WNDCLASSEX wcl;
/* определение класса окна */
wcl.hInstance=hThisInst; /* дескриптор данного экземпляра */
wcl.lpszClassName=szWinName; /* имя класса окна */
wcl.lpfnWndProc=WindowFunc; /* функция окна */
wcl.style=0; /* стиль по умолчанию */
wcl.cbSize = sizeof(WNDCLASSEX); /*размер струтктуры */ /* WNDCLASSEX */
wcl.hIcon = LoadIcon(NULL,IDI_APPLICATION);/* большая */ /* пикторграмма */
wcl.hIconSm = LoadIcon(NULL,IDI_WINLOGO); /* малая */ /* пиктограмма */
wcl.hCursor = LoadCursor(NULL,IDC_ARROW); /* форма курсора */
wcl.lpszMenuName = NULL; /* меню не используется */
wcl.cbClsExtra = 0; /* дополнительная информация отсутствует */
wcl.cbWndExtra = 0;
/* фон окна задается белым */
wcl.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
/* регистрация класса окна */
if(!RegisterClassEx(&wcl)) return 0;
/* Создание окна */
hwnd = CreateWindow (
szWinName, /* имя класса окна */
"Windows 95 Skeleton", /* заголовок */
WS_OVERLAPPEDWINDOW, /* стандартное окно */
CW_USEDEFAULT, /* координата Х - определяется Windows */
CW_USEDEFAULT, /* координата Y - определяется Windows */
CW_USEDEFAULT, /* ширина - определяется Windows */
CW_USEDEFAULT, /* высота - определяется Windows */
HWND_DESKTOP, /* родительского окна нет */
NULL, /* меню нет */
hThisInst, /* дескриптор данного экземпляра приложения */
NULL /* дополнительных аргументов нет */
);
/* отображение окна */
ShowWindow(hwnd,nWinMode);
/* немедленная перерисовка окна */
UpdateWindow(hwnd);
/* цикл сообщений */
while (GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg); /* разрешает использование клавиатуры */
DispatchMessage(&msg); /* возвращает управление Windows */
}
/* возвращает Windows кода возврата */
return msg.wParam;
}
/* Эта функция вызывается Windows 95, которая передает ей */
/* сообщения из очереди сообщений */
/*
HWND hwnd - дескриптор окна
UINT message - сообщение
WPARAM wParam - первый параметр сообщения
LPARAM lParam - второй параметр сообщения
*/
LRESULT CALLBACK WindowFunc(HWND hwnd, UINT message, WPARAM wParam,
LPARAM lParam)
{
/* обработка сообщений */
switch (message){
case WM_DESTROY: /* завершение программы */
PostQuitMessage(0);
break;
default:
/* позволяет Windows обрабатывать любые сообщения
неуказанные в предыдущем случае */
return DefWindowProc(hwnd, message,wParam,lParam);
}
return 0;
}
Все программы, написанные для Windows 95, должны включать библиотечный файл WINDOWS.H. Как уже упоминалось, этот файл (вместе с рядом других вспомогательных файлов) содержит прототипы API-функций, а также определения различных типов данных, макросов и констант, используемых в Windows 95. Например, типы HWND и WNDCLASSEX определены именно в файле WINDOWS.H.
Функция окна, используемая в программе, называется WindowFunc(). Она объявлена как функция обратного вызова, поскольку вызывается Windows 95 для взаимодействия с программой.
Программа начинает выполнение с вызова функции WinMain(), которой передается четыре параметра. Параметры hThisInst и hPrevInst являются дескрипторами. Первый из них идентифицирует текущий экземпляр приложения. Помните, что Windows является многозадачной операционной системой, в которой возможно одновременное выполнение нескольких экземпляров одной и той же программы. Параметр hPrevInst всегда равен NULL. (В Windows 3.1 этот параметр содержал бы ненулевое значение, если бы в данный момент выполнялись другие экземпляры программы. Однако в Windows 95 это больше не используется.) Параметр IpszArgs является указателем на строку, содержащую аргументы командной строки, переданные приложению при запуске. Параметр nWinMode содержит значение, определяющее, каким образом должно быть отображено окно программы при запуске.
В функции WinMain() создаются три переменные. Первая из них, hwnd, будет содержать дескриптор окна программы. В структуре msg будет храниться информация о получаемых сообщениях, а структура wcl предназначена для определения класса окна.