русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Поле lpfnWndProc.


Дата добавления: 2013-12-23; просмотров: 2952; Нарушение авторских прав


Регистрация класса окна

Дескриптор приложения

Структура приложения Windows

Приложение Windows содержит обязательно две функции:

WinMain() и WndProc().

Функция WinMain() - главная функция приложения и аналогична функции main() для программы на языке С.

Простейшая программа на языке Си имеет следующий вид:

 

main()

{

}

 

Аналогичная программа для Windows сложнее:

#include <windows.h>

 

int WINAPI WinMain ( HINSTANCE hInstance, HINSTANCE hPrevlnstance,

LPSTR lpszCmdLine, int nCmdShow)

 

{

return FALSE;

}

 

 

Файл windows.h необходим при написании любых программ для Windows. В нем содержатся прототипы всех функций Windows, определены типы всех функций Windows, определены типы и структуры данных, глобальные переменные и константы.

 

 

Функция WinMain()

Функция WinMain() обязана присутствовать в каждом приложении Windows. Функции WinMain() передается управление в начальный момент загрузки приложения.

Основные действия, которые выполняет функция WinMain(), следущие:

· Регистрация класса окна приложения и другие инициализации.

· Создание основного окна приложения и других подчиненных окон.

· Запуск цикла обработки сообщений, помещаемых в очередь приложения.

· Завершение работы приложения при извлечении из очереди сообщения WM_QUIT.

 

Заголовок функции WinMain() выглядит так:

 

int WINAPI WinMain ( HINSTANCE hInstance, / / дескриптор текущей копии

HINSTANCE hPrevlnstance, / / предыдущая копия

LPSTR lpszCmdLine / / указатель на командную строку

int nCmdShow) / / флаг "окно_ открыто/окно_ закрыто"

 

Функция WinMain() имеет четыре параметра.

hInstance - является дескриптором копии приложения. Это число однозначно определяет каждую копию приложения, исполняемую под Windows. Можно одновременновыполнять несколько копий одного приложения, при этом каждой копии будет соответствовать свой уникальный индекс.



hPrevInstance- является дескриптором определяющим копию данного приложения, которая была последней активной копией. Если параметр hPrevInstance равен нулю, других копий этого приложения, исполняемых в данный момент под Windows, не существует.

lpszCmdLine- это дальний указатель на командную строку, оканчивающуюся нулем. Он позволяет приложению получать данные через командную строку.

nCmdShow- определяет, как в приложении первоначально отображается на дисплее: пиктограммой (nCmdShow == SW_ SHOWMINNOACTIVE) или в виде открытого окна (nCmdShow == SW_ SHOWNORMAL). Константы SW_ SHOWMINNOACTIVE и SW_ SHOWNORMAL определены во включаемом файле windows.h.

В Windows можно запустить одновременно не только несколько программ, но и несколько раз запустить одну и ту же программу. Таким образом, одно и тоже приложение может иметь несколько копий.

Для приложений для Windows 3.1 первая копия приложения имеет важное значение.

Только первая копия приложения создает в памяти новые ресурсы (классы окон, диалоговые панели, меню, курсоры и т.д.) . Все остальные копии приложения получают к ним доступ и могут воспользоваться уже созданными ресурсами, не создавая своих собственных.

Для того чтобы отличить одну копию приложения от другой , каждой копии ставится в соответствие дескриптор копии приложения (hinstance handle). Соответствующую целочисленную переменную принято обозначать hInstance, она передается Windows функции WinMain() при вызове в качестве одного из обязательных параметров. Другим обязательным параметром является также целочисленный параметр hPrevInstance, который позволяет копии приложения определить, первая она или нет. При запуске первой копии Windows присваивает hPrevInstance значение NULL.

Поэтому каждая последующая копия должна проверить этот параметр на равенство его NULL для того, чтобы не выполнять действия, которые должны производится только один раз в первой копии приложения:

#include<windows.h>

int WINAPI WinMain ( HINSTANCE hInstance, HINSTANCE hPrevlnstance,

LPSTR lpszCmdLine, int nCmdShow)

{ if ( !hPrevInstance ) { . . . } }

 

Если запуск двух копий приложения недопустим, то можно запретить запуск второй копии следующей проверкой

 

if ( !hPrevInstance ) return NULL;

Прежде чем отобразить что либо на экране, нужно создать окно, и только в окно можно осуществить вывод.

Любое окно принадлежит к одному из существующих классов. Класс окна должен быть создан до того, как окно будет отображено на экране. Класс окна определяет общее свойство всех окон данного класса ( форму курсора при попадании его в область окно, имя меню, определенного для окон этого класса и т.д.).

Характеристики окон задаются при регистрации класса окна в структуре класса окна и при создании окна. Наиболее общие характеристики окон задаются при регистрации класса окна. Окна, создаваемые при помощи функции CreatеWindow(), должны иметь зарегистрированный ранее класс окна.

Для того чтобы зарегистрировать класс окна, следует заполнить поля структуры типа

WNDCLASS и передать эту структуру в виде параметра функции RegisterClass().

Структура класса окна WNDCLASS определена в файле windows.h и имеет десять полей:

 

typedef struct tagWNDCLASS

{

UINT style; / / тип окна

WNDPROC lpfnWndProc; / / функция окна

int cbClsExtra; / / размер дополнительной памяти

int cbWndExtra; / / размер дополнительной памяти

HINSTANCE hInstance; / / дескриптор копии приложения

HICON hIcon; / / дескриптор пиктограммы

HCURSOR hCursor; / / дескриптор курсора

HBRUSH hbrBackground; / / цвет фона окна

LPCSTR lpszMenuName; / / имя меню в файле ресурсов

LPCSTR lpszClassName; / / имя класса окна

 

} WNDCLASS;

 

Некоторые поля структуры класса окна , например, lpszClassName, hInstance и lpfnWndProc, являются обязательными при создании нового класса окна. Другим полям можно присваивать значение NULL, что предписывает Windows использовать для этих полей значения по умолчанию.

 

Назначение полей структуры WNDCLASS приведены следующей таблице:

 

Поле Описание
lpszClassName   hInstance lpfnWndProc style     hBrBackground hCursor   hIcon   l pszMenuName   cbClsExtra   clWndExtra     Указатель на строку, содержащую имя класса. Поскольку определенный в приложении класс доступен всем приложениям, имя класса не должно повторяться в разных приложениях. Манипулятор копии, создающей класс окна. Указатель на функцию поддержки окна. Определяет свойства окна (например, автоматическое обновление области окна при изменении размеров или перемещении). Определяет фон окна. Определяет курсор, используемый в данном окне по умолчанию. Определяет пиктограмму (icon), которая будет отображаться при переводе окна в неактивное состояние. Указатель на имя меню окна, определенное в файле ресурсов. Определяет число байт, которое необходимо дополнительно запросить у Windows под эту структуру. Определяет число байт, которое необходимо дополнительно запросить у Windows для размещения всех структур, создаваемых совместно с данным классом.

 

После того, как поля структуры заполнены необходимо зарегистрировать окно с помощью функции RegisterClass ( &W), которой передается указатель на структуру класса окна.

При регистрации класса окна Windows копирует структуру WNDCLASS в системную область, чтобы другим копиям приложения уже не надо было ее регистрировать. Поэтому перед регистрацией класса окна следует проверить параметр hPrevInstance, значение которого Windows передает при вызове WinMain(). Если параметр hPrevInstance равен нулю, то других копий данного приложения нет, и необходимо зарегистрировать класс окна. Пример показывает способ регистрации класса окна:

 

#include<windows.h>

char szName[100]="Application";

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

. .

int WINAPI WinMain ( HINSTANCE hInstance, HINSTANCE hPrevlnstance,

LPSTR lpszCmdLine, int nCmdShow) .

{

WNDCLASS W;

if ( !hPrevInstance )

{

W.style = CS_HREDRAW | CS_VREDRAW ;

W.lpfnWndProc = WndProc ;

W.cbClsExtra = NULL ;

W.cbWndExtra = NULL ;

W.hInstance = hInstance;

W.hIcon = LoadIcon( NULL, IDI_APPLICATION );

W.hCursor = LoadCursor (NULL, IDC_ARROW) ;

W.hbrBackground = GetStockObject(WHITE_BRUSH);

W.lpszMenuName = NULL;

W.lpszClassName = szName ;

 

if (RegisterClass (&W)) return NULL;

}

}

Каждый класс окна имеет свое имя. Оно задается в полеlpszClassName структуры класса окна. При регистрации класса окна он сразу становится доступен всем другим приложениям Windows.

Инициализируется указателем на функцию окна WndProc(). Тем самым указывается, что функция WndProc() является управляющей функцией данного окна.

 

Поле hInstance.

Должно содержать индекс копии приложения. Этот индекс передается приложению как параметр функции WinMain().

 



<== предыдущая лекция | следующая лекция ==>
Файл определения модуля | Поле hbrBackground.


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.005 сек.