» Главная
eXcode.ru » Статьи » WinAPI
» Новости
» Опросы
» Файлы
» Журнал



Пользователей: 0
Гостей: 9





Hello Windows! в классовой обертке




Простейшая Windows программа

источник www.softcraft.ru

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

<a href=http://lw.mrtech.ru/sour_st/winapi/winnie.zip >Исходные тексты программы.</a> Не забудьте откомпилировать его как приложение Windows. Например, в Visual C++ выберитеFile.New.Projects.Win32 Application. Иначе вы получите ошибку: нерешенный внешний _main. (я обеспечил проектным файлом тех, кто используют MS VC ++ 6.0)

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

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

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

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

<table class=code cellpadding=5 align=center width=98% border=1 bordercolor=#3B3B3B><tr><td>

#include <windows.h>
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; // обязательно
}

</td></tr></table>

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

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

<table class=code cellpadding=5 align=center width=98% border=1 bordercolor=#3B3B3B><tr><td>

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)
}

</td></tr></table>

Windows программа управляется событиями. Это означает, что Вам, как программисту, полагается находиться в обороне. Пользователь будет бомбардировать Windows различными внешними действиями, а Windows будет бомбардировать вашу программу сообщениями, соответствующими этим действиям. Все, что Вы должны делать - это отвечать на сообщения. Рисунок ниже схематично показывает как все это работает.

Windows получает различные события от клавиатуры, мыши, портов, и т.д. Каждое событие быстро преобразуется в сообщение. Windows посылает сообщения, соответствующим окнам. Например, все сообщения от клавиатуры идут к окну, которое в настоящее время имеет фокус ввода (активное окно). Сообщения мыши посылаются согласно позиции курсора мыши. Они обычно идут к окну, которое расположено непосредственно под курсором (если какая-нибудь программа не захватила мышь).

Все эти сообщения заканчиваются в очередях сообщений. Windows поддерживает очередь сообщений для каждой выполняющейся прикладной программы (фактически, для каждого потока). Ваша задача состоит в последовательном получении этих сообщений в так называемом цикле сообщений (message loop). Для этого программа должна вызывать GetMessage. Затем вызывается DispatchMessage, чтобы отдать сообщение обратно Windows. Разве сама Windows не может посылать все эти сообщения самостоятельно? В принципе это возможно, но цикл сообщений дает вашей программе возможность посмотреть на них и, если это необходимо, выполнить некоторые дополнительные действия перед возвратом. Или не выполнять...

Каждое сообщение адресовано определенному окну. Когда Вы запрашиваете сообщение у Windows, система выяснит класс вашего окна, найдет связанную с ним оконную процедуру, и вызовет ее. Любое сообщение, посланное нашему окну может обрабатываться в нашей оконной процедуре. Нам остается только отреагировать на его. И что? Мы должны отвечать соответстветствующим образом на всевозможные сообщения Windows? Там их сотни! К счастью, нет! Мы должны перехватывать только те сообщения, в которых заинтересованы. Все остальные мы возвращаем обратно в Windows для обработки по умолчанию, используя DefWindowProc.

<img src=http://lw.mrtech.ru/pic_st/winapi/windisp.gif >

Давайте рассмотрим WinMain. Выполнение Windows программы не начинается с функции main - оно начинается с WinMain. Сначала, мы создаем WinClass и регистрируем его. Затем мы создаем экземпляр окна (на основе только что зарегистрированного класса) и отображаем его. В общем случае WinMain вызывается с соответствующей директивой show. Пользователь может запустить приложение со свернутым или развернутым окном. Так что мы только следуем этой директиве. Затем мы запускаем цикл сообщения, в котором обрабатываем и посылаем сообщения до тех пор, пока GetMessage не возвратит 0. В этот момент параметр wParam сообщения будет содержать код возврата для всей программы.

<table class=code cellpadding=5 align=center width=98% border=1 bordercolor=#3B3B3B><tr><td>

int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrevInst,
char * cmdParam, int cmdShow)
{
char className [] = "Winnie";

WinClass winClass (WindowProcedure, className, hInst);
winClass.Register ();

WinMaker win ("Hello Windows!", className, hInst);
win.Show (cmdShow);

MSG msg;
int status;

while ((status = ::GetMessage (& msg, 0, 0, 0)) != 0)
{
if (status == -1)
return -1;
::DispatchMessage (& msg);
}

return msg.wParam;
}

</td></tr></table>

Функция API GetMessage - интересный пример причудливой Troolean (в противоположность традиционной Boolean) логики Microsoft. GetMessage определена таким образом, чтобы возвратить BOOL, но в документации определяется три варианта возвращаемых значений: ненулевых, нуля и -1. Я это не выдумал! Приведу цитату из справки:
Если функция передает сообщение, иное чем WM_QUIT, возвращаемое значение отлично от нуля.
Если же функция выдает сообщение WM_QUIT, возвращаемое значение - нуль.
При возникновении ошибки возвращаемое значение равно -1.


Другая часть Windows программы - оконная процедура. Помните, что Windows вызывает ее при обработке всех сообщений. Эти сообщения могут игнорироваться, если их пересылать к DefWindowProc. Только одно сообщение мы всегда обязаны перехватывать. Это WM_DESTROY, посылаемое самой Windows в тот момент, когда пользователь закрывает окно (нажимая кнопку закрытия в заголовке окна). Стандартный ответ на WM_DESTROY заключается в посылке сообщения о выходе из программы со значением нуля в качестве кода возврата. Вот и все, что можно сказать по данной теме.

<table class=code cellpadding=5 align=center width=98% border=1 bordercolor=#3B3B3B><tr><td>

// Window Procedure called by Windows
LRESULT CALLBACK WindowProcedure
(HWND hwnd, unsigned int message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_DESTROY:
::PostQuitMessage (0);
return 0;

}
return ::DefWindowProc (hwnd, message, wParam, lParam );
}

</td></tr></table>

Выше рассмотрена самая "уродливая" и менее всего поддающаяся инкапсуляции (при попытке использовать объектно-ориентированный подход) часть Windows . Она станет гораздо лучше, если разрабатывать программу так, как это предлагается в обобщенной Windows программе.
К началу статьи





Добавил: MadvEXДата публикации: 2005-06-03 19:12:12
Рейтинг статьи:3.00 [Голосов 5]Кол-во просмотров: 13084

Комментарии читателей

Всего комментариев: 8

2012-05-10 22:52:21
avoinacoafe
Наше агенство оказывает профессиональные услуги по аренде элитных квартир в Москве в
малоэтажных жилых комплексах(Золотые ключи, Ближняя Дача, Остров Фантазий,
Сосновка и др.) Делаем подбор квартир в жилых комплексах и особняках в центре, а также
база вариантов таунхаусов и пентхаусов в аренду в Москве.
Наше агентство работает только с элитной недвижимостю и это экономия Вашего времени при выборе квартир в аренду
(Вам не нужно просматривать варианты квартир, которые Вам не подходят), мы оптимально
подберем квартиру в аренду для Вас по Вашим критериям отбора.
Особое внимание уделяэм предпочтениям наших клиентов.


Наш адрес в интернете:http://www.9206362.ru/
<a href=http://www.9206362.ru/parusaliy>аренда элитных квартир</a>

2012-05-10 20:37:55
avoinacoafe
Наше агенство оказывает профессиональные услуги по аренде элитных квартир в Москве в
малоэтажных жилых комплексах(Золотые ключи, Ближняя Дача, Остров Фантазий,
Сосновка и др.) Делаем подбор квартир в жилых комплексах и особняках в центре, а также
база вариантов таунхаусов и пентхаусов в аренду в Москве.
Наше агентство работает только с элитной недвижимостю и это экономия Вашего времени при выборе квартир в аренду
(Вам не нужно просматривать варианты квартир, которые Вам не подходят), мы оптимально
подберем квартиру в аренду для Вас по Вашим критериям отбора.
Особое внимание уделяэм предпочтениям наших клиентов.


Наш адрес в интернете:http://www.9206362.ru/
<a href=http://www.9206362.ru/>элитная недвижимость</a>

2012-05-10 11:22:44
dwenuezen
Наше агенство оказывает профессиональные услуги по аренде элитных квартир в Москве в
малоэтажных жилых комплексах(Золотые ключи, Ближняя Дача, Остров Фантазий,
Сосновка и др.) Делаем подбор квартир в жилых комплексах и особняках в центре, а также
база вариантов таунхаусов и пентхаусов в аренду в Москве.
Наше агентство работает только с элитной недвижимостю и это экономия Вашего времени при выборе квартир в аренду
(Вам не нужно просматривать варианты квартир, которые Вам не подходят), мы оптимально
подберем квартиру в аренду для Вас по Вашим критериям отбора.
Особое внимание уделяэм предпочтениям наших клиентов.


Наш адрес в интернете:http://www.9206362.ru/
<a href=http://www.9206362.ru/park>аренда элитных квартир в москве</a>

2012-05-08 16:49:44
dwenuezen
Наше агенство оказывает профессиональные услуги по аренде элитных квартир в Москве в
малоэтажных жилых комплексах(Золотые ключи, Ближняя Дача, Остров Фантазий,
Сосновка и др.) Делаем подбор квартир в жилых комплексах и особняках в центре, а также
база вариантов таунхаусов и пентхаусов в аренду в Москве.
Наше агентство работает только с элитной недвижимостю и это экономия Вашего времени при выборе квартир в аренду
(Вам не нужно просматривать варианты квартир, которые Вам не подходят), мы оптимально
подберем квартиру в аренду для Вас по Вашим критериям отбора.
Особое внимание уделяэм предпочтениям наших клиентов.


Наш адрес в интернете:http://www.9206362.ru/
<a href=http://www.9206362.ru/>мосфильмовская 70</a>

2011-08-12 01:13:17
SWEBRAMES
Наше агенство оказывает всем качественные услуги по снятию элитных квартир в Москве в
малоэтажных жилых комплексах(Золотые ключи, Ближняя Дача, Остров Фантазий,
Сосновка и др.) Делаем подбор квартир по желанию клиента в жилых комплексах и особняках в центре, а также
база вариантов таунхаусов и пентхаусов в Москве. У нас самая большая база недвижимости Москвы.
Наше агентство работает только с элитной недвижимостю и это экономия Вашего времени при выборе квартир при сдаче
Вам не нужно просматривать варианты квартир, которые Вам не подходят, мы оптимально
подберем квартиру в аренду для Вас по Вашим критериям отбора.
Особое внимание уделяэм предпочтениям наших клиентов.



Более подробно на нашем сайте в интернете:http://www.9206362.ru/


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

2010-12-28 14:07:09
Арти
http://lw.mrtech.ru/sour_st/winapi/winnie.zip
ссылка то не работает

2009-03-17 11:27:32
Edisrereusa
Соберем для Вас по сети интернет базу данных потенциальных клиентов для Вашего Бизнеса
(название предприятия, телефон, факс, email, почтовый адрес, имена, род деятельности)
Подробно узнайте по
тел +79133913837
Email: bazy.potencialnyh.klientov@gmail.com
WWW: http://sites.google.com/site/6288862/
ICQ: 62-888-62
Skype: prodawez

2005-12-02 12:05:40
Kodov
Не Hello Windows, а Windows - маздай
Ваше имя: *
Текст записи: *
Имя:

Пароль:



Регистрация

Как вы относитесь к AJAX?
Считаю это ЗЛОМ
11% (12)
Бесполезная технология
2% (2)
Мне параллельно
9% (10)
Неплохая технология
20% (23)
Рулез, как я без нее жил!
7% (8)
Я разработчик AJAX-приложений
5% (6)
А что? Хороший футбольный клуб!
12% (14)
Я в танке!!!
34% (38)

Проголосовало: 113
- Каково состояние Билла Гейтса?
- Каждому китайцу по 40 баксов...
Рейтинг: 6/10 (2)
Посмотреть все анекдоты