Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOMPP_Method.doc
Скачиваний:
4
Добавлен:
24.11.2019
Размер:
673.79 Кб
Скачать

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);

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]