Файл: 15. Основы разработки событийно-управляемых программ в среде Windows.pdf

Добавлен: 20.10.2018

Просмотров: 1202

Скачиваний: 5

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

Теперь рассмотрим структуру оконной функции. Уже было отмечено, 

что ОФ – это обработчик сообщений, поступающих в приложение. Оконная 

функция оформляется в соответствии со следующими правилами: 

 

ОФ может иметь любое имя, но это имя обязательно должно совпадать 

со  значением,  заданным  в  поле  lpfnWndProc  структуры  данного 

оконного класса. 

 

ОФ  всегда  принимает  4  входных  параметра,  которые  соответствуют 

первым 4 полям структуры сообщения. 

 

Заголовок  ОФ  оформляется  особым  образом  с  использованием 

специальных  директив,  зависящих  от  используемого  языка 

программирования 

 

Тело ОФ представляет собой инструкцию множественного выбора типа 

case_of,  в  которой  в  качестве  селектора  выступает  код  сообщения 

(второй входной параметр), а значениями селектора – текстовые имена-

константы конкретных сообщений: 

сase  Message  of 

wm_Create : “код обработки сообщения wm_Create” 

wm_Move : “код обработки сообщения wm_Move”; 

wm_KeyDown : “код обработки сообщения wm_KeyDown”; 

- - - - - - - - - - - - - - - - 

wm_Destroy : “код обработки сообщения wm_Destroy”; 

end; 

 

Набор  сообщений  может  быть  любым,  но,  как  минимум,  обязательно 

должна  присутствовать  обработка  сообщения  wm_Destroy,  которое 

возникает при попытке закрытия главного окна приложения; при этом 

для  правильного  завершения  работы  приложения  обработчик 

сообщения  wm_Destroy  должен  с  помощью  системного  вызова 

PostQuitMessage  поместить  в  очередь  сообщение  wm_Quit,  в  ответ  на 

которое цикл обработки сообщений завершит свою работу. 


background image

 

После  оператора  выбора  в  конце  ОФ  обязательно  должна  вызываться 

специальная  системная  оконная  функция,  назначением  которой 

является  обработка  всех  тех  сообщений,  которые  не  обрабатываются 

данной  оконной  функцией.  Такая  оконная  функция  называется 

умалчиваемой и вызывается .с помощью функции DefWindowProc. 

В итоге, стандартная базовая структура Windows-приложения выглядит 

следующим образом (использован язык Object Pascal системы Delphi). 

program  Project1; 
   uses Windows, Messages;   // подключение интерфейсных модулей 
 
var 
     MyWin : HWnd;                     // переменная-дескриптор главного окна 
     MyChildWin, MyPopWin : HWnd;   // переменные-дескрипторы 
подчиненных окон 
 

// начало описания оконной функции 

   function WinProc(Win: HWnd; Mess, wParam, lParam : longint):longint; export; 

stdcall;   

      begin 
         WinProc := 0; 
         case  Mess  of 
            wm_Destroy : begin 

// обработчик сообщения 

                                        PostQuitMessage(0); 
                                        Exit;   
                                    end; 
 
             wm_Create : begin              // обработчик сообщения 
                                       // действия, выполняемые при создании окна 
                                         Exit; 
                                   end; 
 
             wm_***** : begin 

// еще один обработчик 

                                      // обработка некоторого сообщения wm_***** 
                                      Exit; 
                                  end; 
              . . . . . . . . . . . .  // другие обработчики                   
          end;                      //  для основного оператора case 
         WinProc := DefWindowProc(Win, Mess, wParam, lParam); 

// вызов 

стандартного системного 
обработчика 

     end;                            // конец оконной функции 


background image

 
   procedure  WinMain;                     // основная функция приложения 
      var   
          Mess : TMsg;                          // переменная-сообщение 
          MyWndClass : TWndClass;   // переменная для описания оконного 
класса 
 
      begin 
          MyWndClass.Style := . . . .;    // здесь идет формирование ВСЕХ 10 
полей 

 

          . . . . . . . . . . . . . . . . . . . . . . . 
           if  RegisterClass(MyWndClass) = 0  then  Exit; 
                              // создание главного окна 
           MyWin := CreateWindow(„MyClass‟,  „Ура!Мое первое окно!‟, 

ws_OverlappedWindow, 100, 100, 300, 200, 0, 0, 
hInstance, nil);    

           MyChildWin := CreateWindow( . . . . . );     // создание дочернего окна 
           MyPopWin := CreateWindow( . . . . . );     // создание всплывающего окна 
 
           ShowWindow(MyWin, cmdShow);          // отображение окна (только 
главного!) 
           UpdateWindow(MyWin); 
 
           while  GetMessage(Mess, 0, 0, 0) do              // цикл обработки 
сообщений 
           begin 
               TranslateMessage(Mess); 
               DispatchMessage(Mess); 
           end; 
           Halt(Mess.wParam); 
       end;                                        // конец основной функции 
 
begin 
    WinMain                                    // запуск приложения 
end. 
 

Такое  приложение  имеет  минимальную  функциональность:  после  его 

запуска  создаются  главное  окно  и  два  подчиненных  окна,  которые  можно 

перемещать  по  экрану,  можно  изменять  размеры  окон  и,  наконец,  можно 

закрыть  главное  окно  с  завершением  приложения.  Вся  эта  стандартная 

функциональность  с  точки  зрения  обработки  сообщений  обеспечивается 

системной  оконной  функцией  по  умолчанию.  Для  придания  приложению 


background image

полезных  свойств  необходимо,  прежде  всего,  уметь  реализовывать 

интерфейс с пользователем на основе стандартных управляющих элементов.