Партнерка на США и Канаду по недвижимости, выплаты в крипто

  • 30% recurring commission
  • Выплаты в USDT
  • Вывод каждую неделю
  • Комиссия до 5 лет за каждого referral

Механизм маршрутизации команд скрыт глубоко в MFC. Когда окно-рамка получает сообщение WM_COMMAND, оно вызывает виртуальную функцию OnCmdMsg, которая есть у всех подклассов CCmdTarget и именно с нее начинается процедура маршрутизации. В CFrameWnd функция OnCmdMsg реализована примерно так:

BOOL CFrameWnd::OnCmdMsg(...)

{

// Сначала пытаемся обработать сообщение в активном виде

CView* pView = GetActiveView();

if ( pView!= NULL && pView->OnCmdMsg(...) )

return TRUE;

// Затем пытаемся обработать сообщение в окне-рамке

if ( CWnd::OnCmdMsg(...) )

return TRUE;

// Если сообщение не обработано, то оно передается в объект-приложение

CWinApp* pApp = AfxGetApp();

if ( pApp!= NULL && pApp->OnCmdMsg(...) )

return TRUE;

return FALSE;

}

Если ни один объект, в т. ч. объект-приложение, сообщение не обработал, то CFrameWnd::OnCmdMsg возвращает FALSE и каркас приложения передаст сообщение функции ::DefWindowProc для обработки "по умолчанию".

Теперь ясно, что командные сообщения, получаемые окном-рамкой, направляются в активное окно-вид, а затем в объект-приложение. Но как они достигают объект-документ? Когда CFrameWnd::OnCmdMsg вызывает функцию OnCmdMsg у активного вида, то этот вид сначала пытается обработать сообщение самостоятельно. Но если обработчика сообщения в нем нет, то окно-вид вызовет функцию-член OnCmdMsg у своего документа. Если документ не может обработать сообщение, то он передает его объекту-шаблону документа. Путь командного сообщения, полученного окном-рамкой SDI-приложения, показан на рис. 9.2. Процедура маршрутизации прекращается, если один из объектов обработал сообщение, или, если обработки не было, то сообщение попадает в ::DefWindowProc.

НЕ нашли? Не то? Что вы ищете?

Значение маршрутизации команд станет понятным, если вы посмотрите, как типичное приложение документ/вид обрабатывает команды меню, ускоряющих клавиш и панелей инструментов. По соглашению, команды FileÞNew, FileÞOpen и FileÞExit обрабатываются в объекте-приложении, в котором есть командные обработчики OnFileNew, OnFileOpen и OnAppExit. Команды FileÞSave и FileÞSave As обычно обрабатываются объектом-документом и в нем есть обработчики "по умолчанию" CDocument::OnFileSave и CDocument::OnFileSaveAs. Команды для включения/выключения панелей инструментов и строки состояния обрабатываются в окне-рамке с помощью функций-членов CFrameWnd, а большинство остальных типичных команд обрабатываются в окне-виде или в объекте-документе.

Когда вы создаете собственные обработчики сообщений, важно помнить, что маршрутизация выполняется только для командных сообщений и для обработчиков обновления. Остальные сообщения Windows, например, WM_CHAR, WM_LBUTTONDOWN, WM_CREATE или WM_SIZE должны обрабатываться в окне-получателе сообщения. Обычно сообщения мыши и клавиатуры поступают в окно-вид, а большинство остальных сообщений – в окно-рамку. Объект-документ и объект-приложение никогда не получают никаких сообщений, кроме командных.

Рис. 9.2. Маршрутизация командных сообщений, посылаемых окну-рамке SDI-приложения.

7.1 Стандартные командные идентификаторы и обработчики

При написании приложения документ/вид обычно нет необходимости самостоятельно писать обработчики для всех команд меню. CWinApp, CDocument, CFrameWnd и другие классы MFC содержат обработчики "по умолчанию" для типичных команд меню, вроде FileÞOpen и FileÞSave. Кроме того, каркас сгенерированного приложения по умолчанию обеспечивает связь команд с идентификаторами вроде ID_FILE_OPEN и ID_FILE_SAVE с обработчиками "по умолчанию".

В табл. 9.4 приведены часто используемые стандартные командные идентификаторы и соответствующие командные обработчики. В столбце "Установлен?" указано, надо ли добавлять макрос карты сообщений для этого сообщения или его обработчик уже установлен в каркасе приложения. Например, у команды ID_APP_EXIT обработчик не установлен, поэтому в карту сообщений класса приложения надо добавить запись:

ON_COMMAND( ID_APP_EXIT, СWinApp::OnAppExit )

Таблица 9.4. Стандартные командные идентификаторы и обработчики

Идентификатор команды

Пункт меню

Обработчик "по умолчанию"

Установлен?

Меню Файл

ID_FILE_NEW

New

CWinApp::OnFileNew

Нет

ID_FILE_OPEN

Open

CWinApp::OnFileOpen

Нет

ID_FILE_SAVE

Save

CDocument::OnFileSave

Да

ID_FILE_SAVE_AS

Save As

CDocument::OnFileSaveAs

Да

ID_FILE_PAGE_SETUP

Page Setup

Отсутствует

N/A

ID_FILE_PRINT_SETUP

Print Setup

CWinApp::OnFilePrintSetup

Нет

ID_FILE_PRINT

Print

CView::OnFilePrint

Нет

ID_FILE_PRINT_PREVIEW

Print Preview

CView::OnFilePrintPreview

Нет

ID_FILE_SEND_MAIL

Send Mail

CDocument::OnFileSendMail

Нет

ID_FILE_MRU_FILE1_

N/A

CWinApp::OnOpenRecentFile

Да

ID_FILE_MRU_FILE16

ID_APP_EXIT

Exit

CWinApp::OnAppExit

Да

Меню Правка

ID_EDIT_CLEAR

Clear

Отсутствует

N/A

ID_EDIT_CLEAR_ALL

Clear All

Отсутствует

N/A

ID_EDIT_CUT

Cut

Отсутствует

N/A

ID_EDIT_COPY

Copy

Отсутствует

N/A

ID_EDIT_PASTE

Paste

Отсутствует

N/A

ID_EDIT_PASTE_LINK

Paste Link

Отсутствует

N/A

ID_EDIT_PASTE_SPECIAL

Paste Special

Отсутствует

N/A

ID_EDIT_FIND

Find

Отсутствует

N/A

ID_EDIT_REPLACE

Replace

Отсутствует

N/A

ID_EDIT_UNDO

Undo

Отсутствует

N/A

ID_EDIT_REDO

Redo

Отсутствует

N/A

ID_EDIT_REPEAT

Repeat

Отсутствует

N/A

ID_EDIT_SELECT_ALL

SelectAll

Отсутствует

N/A

Меню Вид

ID_VIEW_TOOLBAR

Toolbar

CFrameWnd::OnBarCheck

Да

ID_VIEW_STATUS_BAR

Status Bar

CFrameWnd::OnBarCheck

Да

Меню Окно (есть только в MDI приложениях)

ID_WINDOW_NEW

New Window

CMDIFrameWnd::OnWindowNew

Да

ID_WINDOW_ARRANGE

Arrange All

CMDIFrameWnd::OnMDIWindowCmd

Да

ID_WINDOW_CASCADE

Cascade

CMDIFrameWnd::OnMDIWindowCmd

Да

ID_WINDOW_TILE_HORZ

Tile Horizontal

CMDIFrameWnd::OnMDIWindowCmd

Да

ID_WINDOW_TILE_VERT

Tile Vertical

CMDIFrameWnd::OnMDIWindowCmd

Да

Меню Помощь

ID_APP_ABOUT

About AppName

Отсутствует

N/A

В MFC для некоторых команд есть стандартные обработчики обновления:

·  CFrameWnd::OnUpdateControlBarMenu для команд ID_VIEW_TOOLBAR и ID_VIEW_STATUS_BAR;

·  CMDIFrameWnd::OnUpdateMDIWindowCmd для команд меню Окно.

·  CDocument::OnUpdateFileSendMail для ID_FILE_SEND_MAIL.

Классы-виды CEditView и CRichEditView содержат собственные командные обработчики для команд меню Правка, но в других окнах-видах их надо добавлять самостоятельно (если они нужны).

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

Литература

1)  Microsoft Corporation. Разработка приложений на Microsoft Visual C++ 6.0. Учебный курс: Официальное пособие Microsoft для самостоятельной подготовки. М.: "Русская Редакция", 2000. (В этом учебном пособии приведены инструкции по использованию различных возможностей MFC и среды Visual C++ 6. Некоторым недостатком является отсутствие подробной описательной части, но удачные пошаговые инструкции позволяют отработать выполнение большого количества типичных операций в Visual C++).

2)  Petzold C. Programming Windows. Microsoft Press. 1990. (Наверное, самая известная книга по программированию для Windows на уровне API)

3)  Prosise J. Programming Windows with MFC. Microsoft Press. 1999. (В некотором смысле, аналог книги Petzold'а, но по программированию для Windows с использованием библиотеки классов MFC. Часть лабораторных работ и лекционного материала данного курса основаны на этой книге).

4)  Toth V. Visual C++ 4 Unleashed. Sams Publishing, 1996 (Учебник по программированию для Windows с использованием Visual C++ версии 4.0. Рассчитан на достаточно опытных программистов. Часть глав посвящены описанию архитектуры Windows с точки зрения программиста).

5)  Системное программирование в Windows 2000 для профессионалов. СПб: Питер, 2001. (В этой книге описан ряд средств, доступных в Windows 2000 на уровне API – технология COM, межпроцессное взаимодействие, работа с оболочкой и др. Интересно краткое и доступное введение в технологию COM, причем приведены исходные тексты программ, удачно иллюстрирующие описываемые понятия.)

6)  Шеферд Дж. Программирование на Microsoft Visual C++ 6.0 для профессионалов. СПб: Питер, 2000. (Книга, напоминающая по стилю изложения пособие для самостоятельной подготовки. Подробная энциклопедия приемов практического программирования в Visual C++ и MFC.)

7)  , Теплицкий -русский словарь по вычислительной технике, Интернету и программированию. М.: "Русская Редакция", 2000. (Толковый англо-русский словарь. В данном курсе на CD-ROM приведен перечень используемых терминов, сформированный в основном на основе этого словаря.)

8)  Рихтер Дж. Windows для профессионалов: создание эффективных Win32-приложений с учетом специфики 64-разрядной версии Windows. СПб: Питер, 2001. (Очень известная книга, в которой описаны различные вопросы программирования для 32-разрядных версий Windows 95/NT/2000 на уровне API.)

9)  Тихомиров MFC. СПб: БХВ – Санкт-Петербург, 2000. (Подробное руководство начального уровня по библиотеке MFC, в основном имеющее справочный характер.)

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32