Глава 1 1 . Обработка на командни съобщения
Съществува стандартна последователност от обекти на приложението, към които се предават командни съобщения. Всеки обект в тази последователност може да обработи командно съобщение, ако има съответен макрос в неговата таблица със съобщения или таблица със съобщения на базов клас. Необработените съобщения се предават на други обекти на приложението.
Ред за обработка на командно съобщение
Обектите от различни класове обработват командните съобщения по различен начин. Например, обекти, които представляват главния прозорец на приложение, първо позволяват на други обекти да обработят полученото съобщение. Само ако съобщението остане необработено, се преглежда таблицата със съобщения на класа на главния прозорец на приложението. Ако съобщението не се обработи и тук, то се насочва към други обекти на приложението.
В някои случаи може да искате да промените реда, в който съобщенията се предават на обектите на приложението за обработка. В този случай трябва да замените виртуалния метод OnCmdMsg. Този метод първоначално е дефиниран в класа CCmdTarget и е заменен в класовете CView и CDocument.
Стандартни последователности за обработка на съобщения
Стандартните последователности за обработка на командни съобщения от обекти от различни класове са описани по-долу.
Основният прозорец на приложение с няколко прозореца. Повечето командни съобщения се предават на главния прозорец на приложението. За приложения, които имат интерфейс с множество прозорци, ролята на главния прозорец на приложението се изпълнява от обект от класа CMDIFrameWnd или обект от клас, наследен от базовия CMDIFrameWnd.
При получаване на съобщение главният прозорец на приложението първо дава възможност на активния дъщерен прозорец на MDI да обработи съобщението. Дъщерните прозорци на MDI са обекти на класа CMDIChildWnd или класанаследени от него.
И само ако MDI прозорецът не може да обработи съобщението, се проверява таблицата със съобщения на класа на главния прозорец на приложението. Трябва да се отбележи, че на свой ред MDI прозорецът предава съобщения на други обекти.
Ако главният прозорец на приложението също не може да обработи командното съобщение, то се предава на главния обект на класа на приложението. Основният клас на приложението наследява от базовия клас CWinApp и приложението има само един обект от този клас.
MDI прозорци и главният прозорец на приложение с един прозорец. За приложения, които имат интерфейс с един прозорец, ролята на главния прозорец на приложението се изпълнява от обект от класа CFrameWnd или клас, наследен от него.
Ако главният прозорец на приложение с един прозорец или MDI прозорецът на приложение с множество прозорци не може да обработи съобщението, то се предава на основния обект на класа на приложението.
Обектът на шаблон на документ проверява само собствената си таблица със съобщения и не предава командни съобщения на други обекти на приложение.
Диалогов панел. Диалоговите панели са представени от обекти на класове, наследени от базовия клас CDialog.Ако командно съобщение, получено от обекта на диалоговия панел, не може да бъде обработено, то се предава на неговия родителски прозорец.
Ако родителският прозорец на диалоговия прозорец също не може да обработи командното съобщение, то се предава на основния обект на приложението.
Стандартни командни съобщения
MFC предоставя различни нива на обработка за стандартни командни съобщения, вариращи от прости резервации на идентификатори до пълна обработка на отделни съобщения.
Елементът от менюто или бутонът на контролната лента на приложението има същия идентификатор като командното съобщение. Най-важните командни съобщения са описани накратко по-долу.
Командни съобщения с идентификатори ID_FILE_. Тези командни съобщения съответстват на елементите от менюто File в приложения, създадени с MFC AppWizard. Манипулатори за тези съобщения се предоставят от различни MFC класове, включително CWinApp и CDocument.
Командни съобщения с идентификатори ID_WINDOW_. Тези съобщения съответстват на елементи от менюто Window на приложения с няколко прозореца, създадени с MFC AppWizard. Обработката на тези командни съобщения е присвоена на метода OnMDIWindowCmd на класа CMDIFr ameWnd.
Командни съобщения с идентификатори I D_HELP_. Тези съобщения се използват от системата за помощ на приложението.
Класът CWinApp съдържа методи за обработка на командни съобщения, свързани с системата за помощ. Ако приложението използва системата за помощ, програмистът трябва да извика подходящите методи на класа CWinApp, за да обработи командните съобщения ID_HELP_.
MFC AppWizard ви позволява да създадете приложение, което има помощна система. В този случай MFC AppWizard автоматично генерира кода, необходим за управление на системата за помощ.
Командни съобщения с идентификатори ID_VIEW_. Тези командни съобщения съответстват на елементите от менюто View в приложения, създадени с MFC AppWizard. Класът CFrameWnd отговаря за обработката на командните съобщения ID_VIEW_.