Приложение STUpload. Отображение диалогового окна Select Fund

   
На этом шаге мы продолжим работу с приложением STUpload.

   
На 26 шаге мы изучили простейший вариант функции OnDraw() приложения 40-44. Теперь Вам предстоит
завершить разработку этого диалогового окна. В его окончательной версии не должно быть кнопок ОК и Cancel,
так как отображением окна будет управлять команда Select Fund меню View или соответствующая
кнопка панели инструментов. Поскольку даже при отсутствии этих кнопок нажатие пользователем клавиш ENTER и ESC
порождает сообщения IDOК и IDCANCEL, для класса диалога Select Fund нужно создать версии
функций-обработчиков, которые не выполняют никакой работы. В противном случае будут запускаться функции OnOk() и OnCancel()
базового класса CDialog, которые вызывают функцию EndDialog() и закрывают диалоговое окно.

   
Удобнее создавать обработчики сообщений от кнопок ОК и Cancel при их наличии в диалоговом окне. Поэтому в первую очередь
мы займемся созданием функций ОnОК() и OnCancel().

  • Создание обработчика OnOk().
  • Нажмите CTRL+W, чтобы открыть ClassWizard. В списке Class name выберите CFundDialog.
  • В списке Object IDs щелкните IDОК.
  • В списке Messages выберите BN_CLICKED.
    Рис.1. Выбор класса и объекта
  • Щелкните Add Function, а затем - ОК, чтобы подтвердить предложенное имя обработчика ОnОК.
    Щелкните Edit Code, чтобы отредактировать функцию CFundDialog::OnOK().
  • Удалите следующую строку:
      CDialog::OnOK();
    
  • Выполните аналогичные действия для функции OnCancel(), обрабатывающей сообщение BN_CLICKED
    от объекта IDCANCEL. Теперь из шаблона диалога можно удалить кнопки ОК и Cancel.
  • Завершение разработки шаблона диалога Select Fund.
  • Откройте в редакторе диалогов ресурс IDD_FUNDDIALOG.
  • Щелкните ОК. Нажмите клавишу DELETE, чтобы удалить кнопку.
  • Щелкните Cancel и нажмите DELETE.
  • Измените размер диалогового окна так, чтобы список совпал с пунктирной границей области редактирования.
    На рисунке 2 показано, как примерно должно выглядеть это окно.


    Рис.2. Диалоговое окно Select Fund

   
Теперь нужно написать код для управления диалоговым окном Select Fund. В объекте главного окна приложения
CMainFrame создадим переменную-член m_wndFundDialog типа CFundDialog. Диалоговое окно
должно быть дочерним окном главного окна приложения, и его отображение на экране будет определяться состоянием
m_bFundsVisible - булевой переменной-членом класса CMainFrame. Значение переменной m_bFundsVisible
будет устанавливаться командой меню и кнопкой панели инструментов.

  • Создание переменной-члена m_wndFundDialog.
  • На вкладке ClassView правой кнопкой мыши щелкните узел CMainFrame.
  • В контекстном меню выберите Add Member Variable.
  • В поле Variable Type диалогового окна Add Member Variable введите CFundDialog.
  • В поле Variable Name введите m_wndFundDialog.
    Рис.3. Добавление переменной m_wndFundDialog
  • Выберите режим доступа Protected. Щелкните OK, чтобы добавить переменную.
  • Проделайте аналогичные действия для создания в классе СMainFrame булевой защищенной переменной
    m_bFundsVisible.
  • Дважды щелкните значок класса CMainFrame на вкладке ClassView. Откроется заголовочный файл,
    а курсор окажется в начале объявления класса.
  • Убедитесь, что ClassView добавил в начало файла следующую строку:
       #include "FundDialog.h"
    
  • Инициализация m_bFundsVisible в конструкторе класса.
  • Дважды щелкните значок, представляющий конструктор класса CMainFrame.
  • Добавьте в тело конструктора следующую строку:
      m_bFundsVisible = FALSE;
    
  • Создание функций доступа к переменной m_bFundsVisible.
  • Вернитесь к объявлению класса CMainFrame в файле MainFrm.h. Добавьте в раздел
    public следующий код:

    BOOL AreFundsVisible() { return m_bFundsVisible; }
    
    void SetFundsVisible( BOOL bSet ) 
    { 
       m_bFundsVisible = bSet; 
       if( bSet ) m_wndFundDialog.ShowWindow( SW_SHOW );
       else m_wndFundDialog.ShowWindow( SW_HIDE );
    } 
    


    Рис.4. Добавленный код

  • Теперь Вам следует инициализировать объект диалога, вызвав функцию Create() и передав ей в качестве
    параметра соответствующий идентификатор ресурса. Во втором параметре этой функции можно указать родительское
    окно диалога. Если параметр опущен (как в данном примере), то используется значение по умолчанию NULL,
    означающее, что родительским считается главное окно приложения.
  • Инициализация объекта m_wndFundDialog.
  • На вкладке ClassView раскройте узел CMainFrame.
  • Дважды щелкните значок функции-члена OnCreate(), чтобы отредактировать ее.
  • В конце функции, но до оператора return вставьте следующий код:
    //Создаем диалоговое окно со списком компаний. 
    m_wndFundDialog.Create(IDD_FUNDDIALOG);
    


    Рис.5. Исправленная функция OnCreate()
    Поскольку для этого диалогового окна не установлен стиль WS_VISIBLE, для его отбражения нужно явно
    вызывать функцию CWnd::ShowWindow().

   
Отображением диалогового окна будет управлять обработчик команды Selection Fund меню View.
Далее для команды с идентификатором ID_VIEW_FUNDSELECTION создадим обработчик команды и
обработчик обновления пользовательского интерфейса.

  • Добавление функции CMainFrame::OnViewFundselection().
  • Нажмите CTRL+W, чтобы открыть ClassWizard. Щелкните вкладку Message Maps.
  • В списке Class Name выберите CMainFrame.
  • В списке Object IDs щелкните ID_VIEW_FUNDSELECTION.
  • В списке Messages выберите COMMAND.
  • Щелкните Add Function, а затем - OK, чтобы подтвердить предлагаемое имя функции OnViewFundselection.
    Рис.6. Добавление функции OnViewFundselection
  • Щелкните Edit Code. Откроется файл MainFrm.cpp, а курсор будет установлен в начало функции.
  • Добавьте в тело функции OnViewFundselection() следующую строку:
        SetFundsVisible(m_bFundsVisible ? FALSE : TRUE);
    
  • Реализация функции CMainFrame::OnUpdateViewFundselection().
  • Средствами ClassWizard создайте функцию OnUpdateViewFundselection для сообщения
    UPDATE_COMMAND_UI и идентификатора объекта ID_VIEW_FUNDSELECTION.
  • Выберите в меню Project команду Settings. На вкладке C/C++ в списке Category щелкните
    C++ Language. Убедитесь, что установлен флажок Enable Run-Time Type Information (RTTI). Щелкните
    OK, чтобы закрыть диалоговое окно Project Settings.


    Рис.Установка флажка Enable Run-Time Type Information (RTTI)

  • Добавьте в тело функции OnUpdateViewFundselection() следующий код:
    // Активизируем команду Funds Selection меню View,
    // если документ CStockDataList не пустой
    // Если команда активизирована, изменяем состояние кнопки
    // в зависимости от того, показано окно или спрятано.
    BOOL bEnable = FALSE;
    CSTUploadDoc * pDoc = 
    	dynamic_cast< CSTUploadDoc * >( GetActiveDocument() );
    if( pDoc )
    	bEnable = pDoc->GetDocList().GetCount() ? TRUE : FALSE;
    pCmdUI->Enable( bEnable );	
    if( bEnable )
    	pCmdUI->SetCheck( m_bFundsVisible ? 1 : 0 );	
    
  • Добавьте следующую строку в начало файла MainFrm.cpp:
        #include "STUploadDoc.h"
    
  • Теперь соберите и запустите приложение STUpload. Поэкспериментируйте с диалоговым окном
    Select Fund, выбирая соответствующую команду меню или кнопку панели инструментов.

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

   
На следующем шаге мы продолжим работу с приложением STUpload.



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

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