Читаем Применение Windows API полностью

Прежде, чем приступить к программированию для Windows, необходимо понять, как выполняется представленная здесь самая простая программа. Обратите внимание: это — Win32-программа. Она будет выполняться под управлением Windows 95 и Windows NT (если кто-то хочет, чтобы Вы программировали для 16-разрядной платформы, то он должен платить Вам вдвое больше!). Windows API вызовы окрашены в синий цвет, а специфические для Windows типы данных окрашены зеленым. Я буду также ставить два двоеточия перед обращениями к функциям API. В C++ это означает вызов глобальной функции и позволяет, в ряде случаев, избавиться от неоднозначности.

Исходные тексты программы расположены на сервере Reliable software (чужого стараюсь не держать [А.Л.]). Не забудьте откомпилировать его как приложение Windows. Например, в Visual C++ выберите File.New.Projects.Win32 Application. Иначе вы получите ошибку: нерешенный внешний _main. (я обеспечил проектным файлом тех, кто используют MS VC++ 6.0)

Сначала Вы должны определить классы окон, которые будут отображаться вашим приложением. В данном случае мы отобразим только одно окно (WinClass), но тем не менее, мы должны дать Windows некоторую минимальную информацию относительно его класса. Наиболее важная часть WinClass — адрес процедуры обратного вызова, или оконной процедуры (WindowProcedure). Windows, в соответствии с внутренней организацией, вызывает нас — он посылает сообщения нашей программе, вызывая оконную процедуру.

Обратите внимание на объявление оконной процедуры. Windows будет вызывать ее, передавая дескриптор текущего окна и два элемента данных, связанных с сообщением (параметры сообщения): WPARAM и LPARAM.

В WinClass мы также должны определить дескриптор экземпляра программы HINSTANCE, курсор мыши (мы лишь загружаем стандартный курсор – стрелку), кисть, чтобы закрасить фон окна (мы выбрали заданный по умолчанию цвет окна) и имя нашего класса.

После заполнения всех полей структуры WNDCLASS мы регистрируем класс окна в Windows.

#include

LRESULT CALLBACK WindowProcedure(HWND hwnd, unsigned int message, WPARAM wParam, LPARAM lParam);

class WinClass {

public:

 WinClass (WNDPROC winProc, char const * className, HINSTANCE hInst);

 void Register {

  ::RegisterClass (&_class);

 }

private:

 WNDCLASS _class;

};

WinClass::WinClass(WNDPROC winProc, char const * className, HINSTANCE hInst) {

 _class.style = 0;

 _class.lpfnWndProc = winProc; // оконная процедура: обязательна

 _class.cbClsExtra = 0;

 _class.cbWndExtra = 0;

 _class.hInstance = hInst; // владелец класса: обязательный

 _class.hIcon = 0;

 _class.hCursor = ::LoadCursor (0, idc_arrow); // optional

 _class.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1); // optional

 _class.lpszMenuName = 0;

 _class.lpszClassName = className; // обязательно

}

Как только Класс Окна зарегистрирован, мы можем продолжить создание окна. Для этого вызываем функцию API CreateWindow. У нее много параметров: имя только что зарегистрированного класса окна, заголовок, появляющийся в названии окна, стиль, положение на экране и размер, а также дескриптор экземпляра приложения. Остальные параметры в данный момент оставлены обнуленными.

Окно не будет появляться на экране до тех пор, пока Вы не скажете, чтобы Windows показал его.

class WinMaker {

public:

 WinMaker: _hwnd (0) {}

 WinMaker (char const* caption, char const* className, HINSTANCE hInstance);

 void Show (int cmdShow) {

  ::ShowWindow(_hwnd, cmdshow);

  ::UpdateWindow(_hwnd);

 }

protected:

 HWND _hwnd;

};

WinMaker::WinMaker(char const * caption, char const * className, HINSTANCE hInstance) {

 _hwnd = :: CreateWindow(

  className, // имя регистрируемого оконного класса

  caption, // заголовок окна

  WS_OVERLAPPEDWINDOW, // стиль окна

  CW_USEDEFAULT, // позиция x

  CW_USEDEFAULT, // позиция y

  CW_USEDEFAULT, // ширина

  CW_USEDEFAULT, // высота

  0, // handle to parent window

  0, // handle to menu

  hInstance, // дескриптор экземпляра

  0); // дата создания (window creation data)

}

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже