Шаг 56 - OnSysCommand

Создание проекта

Работаем с нашим диалоговым окном из прошлого проекта. Добавим кнопку минимизации к диалоговому окну в ресурсах.

56_1.gif (7936 b)

Создаем код

Виртуальная функция реакции на системные сообщения в классе диалогового окна.

class CTestDlg : public CDialog				// класс диалогового окна
{
...................
void AfxMessageBox(int i); // показывать int
afx_msg void OnSysCommand( UINT i, LONG l); // системные сообщения
protected:
.................
};

Реализация

void CTestDlg::OnSysCommand( UINT i, LONG l)
{
//............
// В описании разговор идет именно о этой части.
//...........

}

И обязательно в макросах событий, который говорит о том, что мы будем обрабатывать системные события.

BEGIN_MESSAGE_MAP(CTestDlg, CDialog)
ON_BN_CLICKED(IDC_BUTTON1, OnSend)
ON_WM_CTLCOLOR() // требуется кисть
ON_WM_SYSCOMMAND() // будем обрабатывать системные события
END_MESSAGE_MAP()

Описание

OnSysCommand позволяет Вам обрабатывать многие события связанные с изменением окна, как минимизация, восстановление, перемещение и т.д. Для оценки того, что эта команда значит, пробуем собрать и запустить вот такой код функции обработки системных событий.

void CTestDlg::OnSysCommand( UINT i, LONG l)
{
}

И запустите. Вы будете потрясены. Окно нельзя переместить, свернуть, окно, как китайская стена, просто непреклонно. Даже к системному меню нет доступа. Для того, чтобы оживить все-таки окно, надо вызвать функцию OnSysCommand у предка. Но эта функция передана из далека. Еще от прадедушки CWnd.

void CTestDlg::OnSysCommand( UINT i, LONG l)
{
CDialog::OnSysCommand(i,l); // метод предка
}

И все стало нормально. Если Вы меня спросите, зачем всё это делается, я буду страшно удивлен. Честно. Теперь мы можем отслеживать минимизацию, перемещение окна , или запретить, например, восстановление. Все что надо сделать - разобраться с параметрами, передающимися в эту функцию. Первый параметр, который у нас UINT отвечает как раз за тип команды. Давайте отловим событие минимизации.

void CTestDlg::OnSysCommand( UINT i, LONG l)
{
//CDialog::OnSysCommand(i,l); // метод предка
if (i!=SC_MINIMIZE) CDialog::OnSysCommand(i,l); // если не команда минимизации выполнить команду
}

Окно не будет уменьшаться. Мы просто проглотили эту команду, не дав её обработать. Последний параметр в OnSysCommand отвечает за координаты курсора, если команда выбрана мышью из меню.

56_2.gif (7662 b)

Шпаргалка

Описать виртуальную функцию

class CTestDlg : public CDialog				// класс диалогового окна
{
...................
afx_msg void OnSysCommand( UINT i, LONG l); // системные сообщения
.................
};

Описать макрос обработки сообщений

BEGIN_MESSAGE_MAP(CTestDlg, CDialog)
..............
ON_WM_SYSCOMMAND() // будем обрабатывать системные события
END_MESSAGE_MAP()

Реализовать функцию

void CTestDlg::OnSysCommand( UINT i, LONG l)
{
..............
}

Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 19.10.99 (обновлено 15.07.2001)