На этом шаге мы рассмотрим обработку уведомляющих сообщений от диалогового окна Select Fund.
Назначение диалогового окна Select Fund - предоставить информацию о ценах только для выбранной пользователем
ценной бумаги. Список ценных бумаг уже создан, и теперь нужно реализовать обработку команд пользователя.
Вначале добавим переменную m_strCurrentFund для хранения названия выбранной ценной бумаги. Поскольку в
дальнейшем мы сделаем переменную m_strCurrentFund частью данных документа, она должна быть членом
класса CSTUploadDoc.
Чтобы эта переменная всегда представляла выделенную в диалоговом окне Select Fund строку, надо обрабатывать
уведомляющие ее общения от соответствующего элемента управления. Список посылает своему родительскому окну
(объекту CFundDialog) сообщение LBN_SELCHANGE всякий раз, когда выделяется другая строка.
Обработчик этого сообщения можно создать средствами ClassWizard.
Изменим функцию CSTUploadView::OnDraw() таким образом, чтобы она считывала название выбранной ценной
бумаги из хранящейся в объекте документа переменной и отображала только относящиеся к ней данные.
- Добавление переменной CDocument::m_strCurrentFund.
- Правой кнопкой мыши щелкните узел CSTUploadDoc на вкладке ClassView и добавьте защищенную
переменную-член m_strCurrentFund типа CString. - Инициализация переменной-члена m_strCurrentFund в конструкторе класса.
- Дважды щелкните значок, представляющий конструктор класса CSTUploadDoc.
- Добавьте следующую строку:
m_strCurrentFund = "";
- Создание функций доступа к переменной-члену m_strCurrentFund.
- Добавьте следующий код в раздел public объявления класса CSTUploadDoc:
CString GetCurrentFund () {return m_strCurrentFund;} void SetCurrentFund (CString strSet){m_strCurrentFund= strSet;}
Рис.1. Добавление кода - Добавление метода в класс CFundDialog для обработки сообщения LBN_SELCHANGE.
- Нажмите CTRL+W, чтобы открыть ClassWizard. Щелкните вкладку Message Maps.
- В списке Class Name выберите CFundDialog.
- В списке Object IDs щелкните IDC_FUNDLIST.
- В списке Messages выберите LBN_SELCHANGE.
- Щелкните Add Function. Щелкните OK, чтобы подтвердить предлагаемое имя функции-обработчика OnSelchangeFundlist.
Рис.2. Добавление функции OnSelchangeFundlist - Щелкните Edit Code. Откроется файл FundDialog.cpp, и курсор будет установлен в начало функции.
- Реализация функции CMainFrame::OnSelchangeFundlist().
- Добавьте в тело функции следующий код:
CMainFrame * pWnd = dynamic_cast< CMainFrame * > (AfxGetMainWnd()); ASSERT_VALID( pWnd ); CSTUploadDoc * pDoc = dynamic_cast< CSTUploadDoc * >( pWnd->GetActiveDocument()); ASSERT_VALID( pDoc ); CString strCurFund; int sel = m_listBox.GetCurSel(); if( sel == LB_ERR ) sel = 0; m_listBox.GetText( sel, strCurFund ); pDoc->SetCurrentFund( strCurFund ); pDoc->UpdateAllViews( NULL );
- Добавьте следующие строки в начало файла:
#include "MainFrm.h" #include "STUploadDoc.h"
- Изменение функции CSTUploadView::OnDraw().
- Найдите цикл отображения в конце функции CSTUploadView::OnDraw().
После обращения к функции CStockDataList::GetNext() добавьте следующий код:if(sd.GetFund() != pDoc->GetCurrentFund()) continue;
Рис.3. Добавление кода
Весь цикл теперь должен выглядеть следующим образом:while( pos ) { CStockData sd = pData.GetNext( pos ); if(sd.GetFund() != pDoc->GetCurrentFund()) continue; pDC->TextOut( 10, yPos, sd.GetAsString() ); yPos += nTextHeight; }
- Соберите и запустите приложение STUpload. Убедитесь, что данные загружаются как и прежде.
Однако записи появляются только после того, как Вы выберете ценную бумагу в диалоговом окне Select Fund.
Текст измененного приложения можно взять здесь (58,1 Кб).
На следующем шаге мы рассмотрим реализацию отображения этого окна поверх остальных окон.