Microsoft Visual C++ и MFC. Программирование для Win95 и WinNT

       

Метод 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.


Содержание раздела