Инициализация элементов управления функцией OnInitDialog()

   
На этом шаге мы рассмотрим использование функции OnlnitDialog().

   
Для инициализации некоторых типов элементов управления недостаточно стандартных или дополнительных DDX-функций MFC.
Например, в диалоговом окне Connect to Data Source приложения МуАрр
отображаются допустимые источники данных в виде списка, элементы в котором могут со временем меняться.
Средства MFC-функций DDX_LBIndex и DDX_LBString позволяют задать начальное
выделение элемента в списке и определить выбор пользователя, но в этих функциях не предусмотрена возможность
изменения состава списка.

   
Для ввода элементов списка обычно перегружают виртуальную функцию базового класса CDialog::OnInitDialog(),
выполняемую при инициализации класса диалога. Функция OnInitDialog() вызывает метод
CWnd::UpdateData() (а затем и DDX/DDV-функции) и представляет собой наиболее подходящее место
для нестандартной инициализаций элементов управления диалогового окна, так как она вызывается после создания
окон этих элементов, но до их отображения на экране.

   
Практически каждый стандартный элемент управления Window имеет соответствующий MFC-класс.
Средства ClassWizard позволяют создать объекты этих классов в качестве членов класса диалога. Meжду этими
объектами и элементами управления диалогового окна связь устанавливается посредством функции DDX_Control(),
вызываемой в DoDataExchange(). С помощью объектов, представляющих элементами управления, можно
инициализировать или обновлять элементы управления диалогового окна.

   
Добавим объект MFC-класса CListBox в класс диалога, соответствующий списку Data Source, а
затем посредством добавленного члена класса заполним список и установим начальное выделение.

  • Добавление переменной-члена CListBox.
  • Откройте ClassWizard, нажав CTRL+W. Щелкните вкладку Member Variables.
  • В списке Class name выберите CConnectDialog.
  • В списке Control IDs выберите IDC_DSNLIST.
  • Щелкните Add Variable. Появится диалоговое окно Add Member Variable.
  • В поле Member variable name введите m_lbDSN.
  • В списке Category установите Control.
    Рис.1. Добавление переменной m_lbDSN
  • Щелкните OK, чтобы добавить переменную. Имя и тип новой переменной появятся в выделенной строке
    списка Control IDs рядом с идентификатором IDC_DSNLIST.
  • Щелкните ОК, чтобы закрыть ClassWizard.
  • Перегрузка функции OnInitDialog().
  • Откройте ClassWizard, нажав CTRL+W. Щёлкните вкладку Message Maps.
  • В списке Class name выберите CConnectDialog.
  • В списке Object IDs выберите CConnectDialog, а затем в списке Messages щелкните
    WM_INITDIALOG.
  • Щелкните Add Function.
    Рис.2. Выбор функции
  • Щелкните кнопку Edit Code. Обратите внимание на то, куда ClassWizard поместил вызов
    функции базового класса. Вызов CDialog::OnInitDialog() нужен для выполнения CWnd::UpdateData(),
    которая инициализирует элементы управления. Замените строку комментария //TODO следующим кодом:

      m_lbDSN. AddString( "Accounts"); 
      m_lbDSN. AddString("Admin"); 
      m_lbDSN.AddString( "Management");
    


    Рис.3. Текст функции CConnectDialog::OnInitDialog()

   
Обратите внимание на использование новой переменной m_lbDSN при заполнении списка.

   
Определить, какой элемент списка выбран пользователем, поможет объект-член CListBox. Функция
CListBox::GetCurSel() позволит узнать индекс выбранного элемента (первый элемент списка имеет нулевой
индекс). Далее для получения текста, содержащегося в элементе, надо вызвать функцию CListBox::GetText(),
которой в качестве параметра передается индекс этого элемента. В следуют примерах Вы получите имя выбранного
источника данных и сохраните его в переменной CMyAppApp::m_strDSN. Это имя будет отображаться в
строке состояния. Соответствующий код лучше всего поместить в функцию-обработчик кнопки ОК класса диалога,
так как пользователь таким образом подтверждает свой выбор. Проверьте наличие обращения к CDialog::OnOK() -
именно из этого обработчика по умолчанию вызывается функция CWnd:: UpdateData().

  • Получение выбранного пользователем элемента списка.
  • Откройте ClassWizard, нажав CTRL+W. Щелкните вкладку Message Maps.
  • В списке Class name выберите CConnectDialog.
  • В списке Object IDs щелкните IDОК, а затем в списке Messages - BN_CLICKED.
  • Щелкните Add Function. Подтвердите предлагаемое имя функции ОnОК.
    Рис.4. Добавление функции ОnОК
  • Щелкните кнопку Edit Code. Замените в функции строку комментария // TODO следующим кодом:
      CMyAppApp * pApp = dynamic_cast<CMyAppApp *>(AfxGetApp());
      ASSERT_VALID(pApp);
      int nChoice = m_lbDSN.GetCurSel();
      if (nChoice != LB_ERR) 
      {
        m_lbDSN.GetText(nChoice, pApp->m_strDSN);
        pApp->m_isDatabaseConnected = TRUE; 
      }
    

   
Посмотрите, правильно ли отображается список в диалоговом окне. Выберите любую строку списка и щелкните ОК.
Имя указанного источника данных должно появиться в строке состояния приложения.

   
Текст измененного приложения можно взять здесь (50,0 Кб).

   
На следующем шаге мы рассмотрим реализацию обработки сообщений от элемента управления.



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий