На этом шаге мы продолжим работу с приложением 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.