progs.biz  
Начало>WinAPI>API>Урок 3
C#
VB.NET
Visual C++.NET
ASP.NET
Visual C++ 6
WinAPI
C/C++
Delphi
C++ Builder
Java
SQL
PHP
DirectX
Visual Basic 6.0
Ассемблер
Интернет
Сист. прогр-ние
Pocket PC
Обзор книг
Обзор программ

Бьерн Страуструп. Язык программирования С++. Специальное издание
Бьерн Страуструп. Язык программирования С++. Специальное издание
Заказать на Озоне



Яндекс-цитирования

Windows API
Урок 3. Разбор оконной процедуры

На прошлом занятии мы с вами прошлись по функции WinMain. На этом уроке мы рассмотрим оконную процедуру.

Окнонная процедура у нас названа WndProc. Это название произвольное - в принципе мы могли назвать ее как угодно. Основное предназначение оконной процедуры - это обработка сообщений Windows. Например, вы нажимаете левую кнопку мыши и ваша программа получает сообщение Windows WM_LBUTTONDOWN. Вы изменяете размер окна и ваша программа получает сообщение WM_SIZE. Так вот, в оконной процедуре мы и обрабатываем сообщения Windows. Для этого мы пишем большой (как правило) switch, внутри которого пишем несколько case'ов. Если мы хотим, например, чтобы наша программа обращала внимание на изменение размера окна, то мы должны написать

switch (Message)
{
...
case WM_SIZE:
    //Обработчик сообщения WM_SIZE.
    ...

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

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

Обратите внимание на ветку default:

        ...
    default:
        return DefWindowProc(hwnd, Message, wparam, lparam);
        ...

Тут мы вызываем API-функцию DefWindowProc. Основное предназначение этой API-функции - это обработка сообщений Windows, которые не обрабатываются в нашей программе (т. е. тех, для которых нет своего case). При этом ничего особенно это функция не делает, но очередь из сообщений при этом двигается. И это самое важное - если у нас не было обработчика по умолчанию, то сообщения, не обрабатываемые нашей программой, забили бы очередь, и она бы встала - и даже те сообщения, для которых есть обработчики, никогда бы не были обработаны. Таким образом, основное предназначение функции DefWindowProc - это обработка ("проглатываение") тех сообщений, которые не обрабатываются в каком-нибудь case'е.

В оконную процедуру передаются 4 параметра:

LONG WINAPI WndProc(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam)
{
    ...

Первый из этих параметров - это окно, в которое мы передаем сообщение Windows. Второй - это само сообщение. Третий и четвертый параметры - это дополнительные параметры для конкретного сообщения. Эти параметры будет разными для разных сообщений (и для некотрых сообщений Windows могут вообще не использоваться). Например, для сообщения WM_LBUTTONDOWN в дополнительных параметрах передаваются x и y той точки, в которой мы щелкнули, информация и том, были ли при этом нажати кнопки shift, atl и ctrl и другое, для сообщения WM_SIZE - новые размеры окна и т. д.. Еще обратите внимание, что эти же параметры у нас передаются в функцию DefWindowProc. Конкретно, что означают эти параметры для некоторого сообщения Windows, надо смотреть в справке по этому сообщению.

Рассылки нашего сайта на Subscribe.Ru
Visual C++, MFC
C# и .NET
VB.NET
ASP.NET new!
Win API
C/C++
Delphi
Java
HTML, PHP, mySQL, WEB-дизайн
Flash MX
C++ Builder
Ассемблер
SQL Server
DirectX
Обзор книг
Обзор программ
Новости сайта progs.biz


 
 
Копирование любых материалов сайта без разрешения авторов и владельцев сайта запрещено.
© 2002-2008 сайт progs.biz
© 2002-2008 Игорь Алексеев