Этот параграф посвящен разработке базовой программы, которая в следующих параграфах будет использована при программировании графики в системе Windows. В дальнейшем эту программу будем называть каркасом приложения. Из названия понятно, что, расширяя ее, мы можем получить любую графическую программу в Windows. Каркас приложения выводит на экран компьютера окно.
Приведем необходимые для разработки каркаса приложения действия по шагам. В начале , с помощью курсора мыши, нажимаем на кнопку Пуск, расположенную в левом нижнем углу рабочего стола, и выбираем Программы, а затем среди программ — Borland C++ 5.02.
На экране появится окно интегрированной среды Borland C++ ( рис. 2.1).
Рис. 2.1. Окно интегрированной среды Borland C++
Интегрированную среду можно также запустить непосредственно, загрузив программу BCW.EXE из папки BC5BIN.
Теперь необходимо создать проект, выбрав опции File->New->Project. На экране появится окно Target Expert (рис. 2.2). В этом окне нужно изменить только имя проекта, исправив имя proj0001.ide на piphagor.ide. В общем случае это имя может быть любым . Остальные параметры будут установлены по умолчанию.
Рис. 2.2. Создание нового проекта
Затем нажимаем на кнопку OK . На экране появится окно, содержащее список файлов проекта (рис. 2.3). Выбрав с помощью клавиши [Tab] и курсора мыши файл с расширением .def, следует удалить этот файл. Сделать это можно, например, нажав на клавишу [Delete].
Рис. 2.3. Список файлов, включенных в проект
Далее, выбрав опции File->New, следует создать текстовый файл piphagor.cpp. Потом с помощью опции File->Open открыть этот файл и набрать приведенный ниже текст программы.
Программа
#include <windows.h>
#include <string.h>
#include<stdio.h>
LRESULT CALLBACK WindowFunc(HWND,UINT,WPARAM,LPARAM);
char szwinname[] = "My Window";
//главная программа
int WINAPI WinMain(HINSTANCE hthisinst,
HINSTANCE hprevinst,
LPSTR lpszargs,
int nwinmode)
{
HWND hwnd; // дескриптор (заголовок) окна, т.е. номер,
// единственным образом идентифицирующий окно
MSG msg; // сообщение состоит из HWND окна,
// получающего сообщение, UINT (номер) сообщения
// LPARAM, WPARAM, DWORD time, POINT pt -позиция курсора
WNDCLASS wcl;
wcl.hInstance = hthisinst; // дескриптор данного приложения
wcl.lpszClassName = szwinname; // имя класса окна
wcl.lpfnWndProc= WindowFunc; // оконная функция
wcl.style = 0; // стиль по умолчанию
wcl.hIcon = LoadIcon (NULL, IDI_APPLICATION);//как exe — MSDOS
// IDI_ASTERISK — перевернутый воскл знак (информация)
// IDI_EXCLAMATION — внимание (воскл знак в желтом тр-ке)
// ID_HAND — знак стоп (два скрещенных отрезка в красном круге)
// IDI_QUESTION — вопрос в белом круге
wcl.hCursor = LoadCursor(NULL,IDC_ARROW); // курсор //выводится как стрелка
// CROSS (+), IBEAM (верт черта), (WAIT) пес часы
wcl.lpszMenuName = NULL;
wcl.cbClsExtra = 0;
wcl.cbWndExtra = 0;
// цвет окна белый
wcl.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
if(!RegisterClass(&wcl)) // регистрация окна
return 0;
hwnd = CreateWindow(szwinname,
"KARKAS",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
HWND_DESKTOP,
NULL,hthisinst,
NULL);
ShowWindow(hwnd,nwinmode); // показать окно
UpdateWindow(hwnd); // перерисовать содержимое
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);// транслировать клавиши
// если убрать, то не будет
// реагировать на клавиши
DispatchMessage(&msg);// вернуть управление Windows
}
return msg.wParam;
}
LRESULT CALLBACK WindowFunc(HWND hwnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
switch(message)
{
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,message,wParam,lParam);
}
return 0;
}
Обсудим приведённый текст программы, которая является каркасом приложения.
Оконная функция обрабатывает единственное сообщение WM_DESTROY, возникающее при завершении выполнении программы. В этом случае оконная функция передает главной программе сообщение о завершении цикла обработки сообщений, и приложение завершает свою работу.
Выполнение приложения начинается с главной функции WinMain(), имеющей четыре параметра: hthisinst, hprevinst, lpszargs,nwinmode. Эти параметры были описаны выше.
В главной программе определяется окно и заполняются поля его фрейма, имеющего следующую структуру:
struct WNDCLASS
{
UINT style; // тип окна
WNDPROC lpfnWndProc; // адрес оконной функции
int cbClsExtra; // дополнительные данные для класса
int cbWndExtra; // дополнительные данные для окна
HINSTANCE hInstance; // дескриптор экземпляра приложения
HICON hIcon; // дескриптор иконки
HCURSOR hCursor; // дескриптор курсора мыши
HBRUSH hbrBackground; // цвет заполнения окна
LPCSTR lpszMenuName; // имя главного меню
LPCSTR lpszClassName; // имя класса окна
};
В данном случае меню не требуется, и указатель на имя главного меню будет равен NULL.
Создание окна осуществляется с помощью функции
HWND CreateWindow(
LPCSTR lpClassName, // имя класса окна
LPCSTR lpWinName, // заголовок окна
DWORD dwStyle, // стиль окна
int x, int y, // координаты левого верхнего угла
int Width, int Height, // размеры окна
HWND hParent, // дескриптор родительского окна
HMENU hMenu, // дескриптор главного меню
HINSTANCE hThisInst, // дескриптор приложения
LPVOID lpszAdditional); // указатель на доп. информацию
В нашем случае для параметров x, y, Width, Height используется значение, заданное макросом CW_USEDEFAULT, позволяющее системе самостоятельно выбирать координаты и размеры окна. Если окно не имеет родительского окна, то hParent должен быть равен HWND_DESKTOP или NULL. Поскольку главного меню нет, то hMenu = NULL. Аналогично, указатель на дополнительную информацию равен NULL.
Для стиля (или типа) создаваемого окна используется макрос WS_OVERLAPPEDWINDOW, определяющий стандартное окно, имеющее системное меню, заголовок, рамку для изменения размеров, а также кнопки минимизации, развертки и закрытия. Используется наиболее общий стиль. Можно создавать окна, имеющие другие стили. Для этого применяют комбинации стилевых макросов. Наиболее широко используются стили:
WS_OVERLAPPED — стандартное окно с рамкой,
WS_MAXIMIZEBOX — наличие кнопки развертки,
WS_MINIMIZEBOX — наличие кнопки минимизации,
WS_SYSMENU — наличие системного меню,
WS_HSCROLL — наличие горизонтальной панели прокрутки,
WS_VSCROLL — наличие вертикальной панели прокрутки.
Для отображения окна на экран используется функция