
- •1. Створення проекту додатку
- •2. Розроблення системи меню
- •2.1. Налаштування головного меню додатку
- •2.2. Створення контекстного меню
- •2.3. Визначення функцій-обробників повідомлень системи меню
- •2.4.Перевірка працездатності меню«Data»
- •2.4.Перевірка працездатності контекстного меню
- •3. Створення класу dbFacade
- •3.1.Заголовочний файл класу dbFacade
- •3.2.Файл реалізації класу dbFacade
- •3.3.Тестування класу dbFacade
- •4. Розроблення графічного представлення даних звітів
- •4.1. Функція CalcDocSizes( )
- •4.2. Функція OnDraw( )
- •4.3. Функція-обробник зміни шрифту
- •4.4. Функція-обробник зміни кольору фону
- •5. Додаткові елементи керування
- •5.1. Дублювання пунктів меню на панелі інструментів
- •5.2. Додавання назви звіту у рядок стану додатку
- •Висновок
- •Список рекомендованої літератури
4. Розроблення графічного представлення даних звітів
Клас CCourseView слугує для наочного представлення таблиць бази даних у вікні додатку. Реалізація функціональності цього класу є однією із головних цілей створення додатку.
Для початку, у оголошення класу CCourseView внесемо наступні зміни (подані жирним шрифтом):
//Підключаємо бібліотеку колекцій MFC
#include <afxcoll.h>
class CCourseView : public CScrollView
{
protected: // create from serialization only
CCourseView();
DECLARE_DYNCREATE(CCourseView)
// Attributes
public:
CCourseDoc* GetDocument();
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CCourseView)
public:
virtual void OnDraw(CDC* pDC); // overridden to draw this view
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
protected:
virtual void OnInitialUpdate(); // called first time after construct
virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);
virtual void OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint);
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~CCourseView();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected:
// Generated message map functions
protected:
//{{AFX_MSG(CCourseView)
afx_msg void OnViewFont();
afx_msg void OnViewBkcolor();
afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
//Масив, у якому зберігається ширина стовпців
CUIntArray colWidths;
//Кількість записів у звіті
int recCount;
//Висота шрифту
int textHeight;
//Загальний розмір звіту
CSize sizeTotal;
//Відстань між колонками звіту
int offset;
//Функція-член, що обчислює розмір звіту
void CalcDocSizes();
CMenu myPopupMenu;
//Колір фону
COLORREF bkColor;
//Колір тексту
COLORREF textColor;
//Обраний шрифт
CFont fnt;
};
4.1. Функція CalcDocSizes( )
Спочатку потрібно ініціалізувати дані-члени класу. Робиться це, як завжди, в конструкторі класу:
CCourseView::CCourseView()
{
// TODO: add construction code here
ASSERT(myPopupMenu.LoadMenu(IDR_POPUP_MENU));
//Обнуляємо змінні
recCount = 0;
textHeight = 0;
sizeTotal.cx = 0;
sizeTotal.cy = 0;
//Проміжок між стовпцями
offset = 5;
//Колір фону за замовчуванням – білий
bkColor = RGB(255,255,255);
//Колір тексту – чорний
textColor = RGB(0,0,0);
//Шрифт за замовчуванням
fnt.CreatePointFont(120,"MS Sans Serif");
}
Далі нам необхідно написати реалізацію функції, яка буде розраховувати розмір документу для того, щоб можна було налаштовувати прокрутку (скролінг) вікна додатку:
void CCourseView::CalcDocSizes()
{
//Отримуємо посилання на набір записів
CRecordset& pRs = GetDocument()->getRSet();
//Визначаємо кількість полів в наборі
int fields = pRs.GetODBCFieldCount();
//За потреби очищаємо масив з розмірами стовпців
if(colWidths.GetSize())
colWidths.RemoveAll();
//Встановлюємо новий розмір масиву
colWidths.SetSize(fields);
CSize size;
CString temp;
//Отримуємо покажчик на контекст пристрою представлення
CDC* pDC = this->GetDC();
//Установлюємо новий шрифт і зберігаємо старий
CFont* pOldFnt = pDC->SelectObject(&fnt);
recCount = 0;
//Переходимо до першого запису
pRs.MoveFirst();
//Поки не закінчилися записи в наборі
while(!pRs.IsEOF())
{
//Проходимо по всім полям поточного запису
for(int j=0;j<fields;j++)
{
//Записуємо вміст поля у тимчасову змінну
pRs.GetFieldValue(j,temp);
//Визначаємо розмір поля
size = pDC->GetTextExtent(temp);
//Коригуємо розмір поля
if(colWidths[j]<size.cx)
colWidths[j] = size.cx;
}
//Переходимо до наступного запису
pRs.MoveNext();
//Збільшуємо лічильник кількості записів
recCount++;
}
TEXTMETRIC tm;
//Визначаємо метрику поточного шрифта
pDC->GetTextMetrics(&tm);
//Визначаємо висоту шрифта
textHeight = tm.tmHeight;
sizeTotal.cx = 0;
sizeTotal.cy = 0;
//Визначаємо ширину звіту
for(int i=0;i<fields;i++)
sizeTotal.cx += colWidths[i];
//Додаємо проміжки між стовпцями
sizeTotal.cx += offset*2*fields;
//Визначаємо висоту звіту
sizeTotal.cy = textHeight*recCount;
//Встановлюємо розміри прокрутки
SetScrollSizes(MM_TEXT, sizeTotal);
SetScrollPos(SB_HORZ,0,TRUE);
SetScrollPos(SB_VERT,0,TRUE);
//Відновлюємо старий шрифт
pDC->SelectObject(pOldFnt);
//Звільняємо контекст пристрою
this->ReleaseDC(pDC);
}
Після цього потрібно закоментувати наступні рядки у функції OnInitialUpdate(), яка розраховувала розмір документу за замовчуванням:
void CCourseView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
/*CSize sizeTotal;
// TODO: calculate the total size of this view
sizeTotal.cx = sizeTotal.cy = 100;
SetScrollSizes(MM_TEXT, sizeTotal);*/
}
Далі потрібно перекрити метод базового класу OnUpdate() (рис.4.1):
Рис4.1 – Перекриття методу базового класу
Реалізація цього методу викликає функцію-член CalcDocSizes(), а потім повідомлення знову передається методу базового класу:
void CCourseView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
// TODO: Add your specialized code here and/or call the //base class
CalcDocSizes();
CScrollView::OnUpdate(pSender, lHint, pHint);
}