Шаг 74.
Среда программирования Visual C++.
Приложение STUpload. Отображение диалогового окна Select Fund
На этом шаге мы продолжим работу с приложением STUpload.
На 26 шаге мы изучили простейший вариант функции OnDraw() приложения STUpload,
которая отображает хранящиеся в объекте документа данные в виде нескольких текстовых строк. Приложение показывает
все хранящиеся в документе данные, они пока представяют собой фиксированный набор записей для трех ценных бумаг.
В этом и последующих шагах Вам предстоит внести два изменения. Во-первых, Вы создадите немодальное диалоговое
окно Select Fund, предназначенное для выбора ценной бумаги из списка, хранящегося в объекте документа.
Затем Вы реализуете функцию CSTUploadView::OnDraw(), осуществляющую вывод данных о выбранной
ценной бумаге в виде диаграммы.
Отображение диалогового окна Select Fund
Для диалогового окна Select Fund применим шаблон диалога IDD_FUNDDIALOG и класс диалога
CFundDialog, созданные в шагах 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().
- Удалите следующую строку:
- Выполните аналогичные действия для функции 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 добавил в начало файла следующую строку:
- Инициализация m_bFundsVisible в конструкторе класса.
- Дважды щелкните значок, представляющий конструктор класса CMainFrame.
- Добавьте в тело конструктора следующую строку:
- Создание функций доступа к переменной 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:
- Теперь соберите и запустите приложение STUpload. Поэкспериментируйте с диалоговым окном
Select Fund, выбирая соответствующую команду меню или кнопку панели инструментов.
Текст измененного приложения можно взять здесь (55,8 Кб).
На следующем шаге мы продолжим работу с приложением STUpload.
Предыдущий шаг
Содержание
Следующий шаг