Метод OnSysCommand (системное меню)
Разрабатывая приложение с помощью MFC AppWizard, мы указали, что оно должно иметь возможность отображения краткой справочной информации. Для этого в системное меню приложения была добавлена строка About.
Когда пользователь выбирает строки системного меню любого окна, в том числе и диалоговой панели, или нажимает кнопки максимизации и минимизации, в функцию данного окна поступает сообщение WM_SYSCOMMAND. Для обработки этого сообщения вызывается виртуальный метод OnSysCommand, определенный в классе CWnd.
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
Параметр nID содержит идентификатор строки системного меню, вызвавшего сообщение. Младшие четыре бита параметра nID используются операционной системой и могут принимать любые значения. Параметр nID (без учета четырех младших бит) может принимать одно из следующих значений.
Параметр nID | Описание | ||
SC_CLOSE | Закрывает объект CWnd | ||
SC_HOTKEY | Активизирует объект CWnd, связанный с комбинацией клавиш, определенной приложением. Младшее слово параметра lParam содержит идентификатор активизируемого окна | ||
SC_HSCROLL | Свертка по горизонтали | ||
SC_KEYMENU | Выбор из меню при помощи комбинации клавиш | ||
SC_MAXIMIZE, SC_ZOOM | Максимизировать объект CWnd | ||
SC_MINIMIZE, SC_ICON | Минимизировать объект CWnd | ||
SC_MOUSEMENU | Выбор из меню при помощи мыши | ||
SC_MOVE | Перемещение окна CWnd | ||
SC_NEXTWINDOW | Переключение на следующее окно | ||
SC_PREVWINDOW | Переключение на предыдущее окно | ||
SC_RESTORE | Восстановление нормального расположения и размера окна | ||
SC_SCREENSAVE | Запустить приложение, предохраняющее экран монитора, указанное в секции [boot] файла SYSTEM.INI | ||
SC_SIZE | Изменить размер окна CWnd | ||
SC_TASKLIST | Запустить или активизировать приложение Task Manager | ||
SC_VSCROLL | Свертка по вертикали |
Если строка системного меню выбрана с использованием мыши, параметр lParam содержит координаты курсора. Младшее слово определяет х-координату, а старшее y-координату.
Виртуальный метод OnSysCommand определен в классе CDialog и выполняет обработку сообщений WM_SYSCOMMAND в соответствии с их идентификаторами. Естественно, он не может правильно обработать сообщения от строк меню добавленных вами.
Чтобы обработать сообщения от новых строк системного меню (для нашего приложения это строка About), необходимо переопределить виртуальный метод OnSysCommand.
Сообщения, имеющие стандартные идентификаторы nID, необходимо передавать для обработки по умолчанию методу OnSysCommand базового класса CDialog.
void CDialogDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
// Пользователь выбрал строку About системного меню
if((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
// Все другие сообщение передаем для обработки методу
// OnSysCommand базового класса CDialog
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
Реализация метода OnSysCommand, созданная MFC AppWizard для класса CDialogDlg, определяет причину вызова. Если метод OnSysCommand вызван потому что пользователь выбрал из системного меню строку About, создается объект класса CAboutDlg. Класс CAboutDlg представляет собой класс для управления диалоговой панелью About. Затем вызывается метод DoModal, который и отображает диалоговую панель About на экране.
Если метод OnSysCommand вызван по любой другой причине, тогда вызывается метод OnSysCommand базового класса CDialog, который выполняет обработку этого сообщения по умолчанию.
Описание класса CAboutDlg, а также определение его методов, содержится в файле DialogDlg.cpp (листинг 4.4). Мы не будем подробно описывать класс CAboutDlg, так как он фактически представляет собой упрощенный вариант класса CDialogDlg.