4.1.5. КАРКАС ПРИЛОЖЕНИЯ

Этот параграф посвящен разработке базовой программы, которая в следующих параграфах будет использована  при программировании графики в системе 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               — наличие вертикальной панели прокрутки.

Для отображения окна на экран используется функция