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

       

Метод OnInitDialog


Когда вы отображаете диалоговую панель на экране, вызывая методы DoModal, Create или CreateIndirect, функции диалоговой панели передается сообщение WM_INITDIALOG. Вы не имеете доступа непосредственно в функции диалога. Ее реализация содержится в базовом классе CDialog.

В ответ на сообщение WM_INITDIALOG вызывается метод OnInitDialog, объявленный как виртуальный метод класса CDialog. Метод OnInitDialog вызывается непосредственно перед выводом панели на экран.

Таблица сообщений класса CDialogDlg не содержит макрокоманд для обработки сообщения WM_INITDIALOG. Метод OnInitDialog вызывается непосредственно MFC.

Чтобы реализовать собственную обработку сообщения WM_INITDIALOG, нужно просто переопределить метод OnInitDialog. Переопределенный метод должен сразу вызвать метод OnInitDialog базового класса CDialog.

Для приложения Dialog MFC AppWizard уже переопределил метод OnInitDialog. В реализации метода добавляется новая строка к системному меню диалоговой панели для вызова краткой справки о приложении. Затем вызывая метод SetIcon, определенный в базовом классе CWnd, мы выбираем пиктограммы для приложения.

Метод OnInitDialog возвращает значение TRUE. Это означает, что фокус ввода будет установлен на первый орган управления диалоговой панели. Первый орган диалоговой панели можно выбрать в редакторе диалоговой панели, выбрав из меню Layout строку Tab Order.

Если во время инициализации диалоговой панели метод OnInitDialog устанавливает фокус ввода другому органу управления, метод должен вернуть значение FALSE.

BOOL CDialogDlg::OnInitDialog()

{

      CDialog::OnInitDialog();

      // Добавление строки "About..." к системному меню приложения

      // Проверяем, что идентификатор IDM_ABOUTBOX относится к

      // системным командам



      ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

      ASSERT(IDM_ABOUTBOX < 0xF000);

      CMenu* pSysMenu = GetSystemMenu(FALSE);

      CString strAboutMenu;

      strAboutMenu.LoadString(IDS_ABOUTBOX);

      if (!strAboutMenu.IsEmpty())

      {

             pSysMenu->AppendMenu(MF_SEPARATOR);

             pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX,

                   strAboutMenu);

      }

      // Выбираем пиктограмму для диалоговой панели. Если главное

      // окно приложения не является диалоговой панелью этот код

      // не нужен

      SetIcon(m_hIcon,TRUE);  // Выбираем пиктограмму большого

                                                                      // размера

      SetIcon(m_hIcon,FALSE); // Выбираем пиктограмму маленького

                                                                      // размера

     

      // TODO: Здесь вы можете выполнить дополнительную

      // инициализацию

      return TRUE;

}



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