Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Visual1.doc
Скачиваний:
8
Добавлен:
07.03.2016
Размер:
4.35 Mб
Скачать

5.6. Приклад роботи з таблицями

Приклад роботи з таблицями знаходиться у папці DISK\GDI\GDI4.

Створимо SDI програму Table для роботи з таблицями даних. У даній програмі приводиться методика виведення таблиці на екран дисплею.

Для малювання комірок таблиці створено універсальну функцію DrawCell.

//Функція виведення рядку у комірці

void CTableView::DrawCell(CDC*dc,CString text,LPRECT lpRect,

UINT border, UINT par,int tol, COLORREF color)

{

CPen pen(PS_SOLID,tol,color);

CPen* old_pen;

old_pen = dc->SelectObject(&pen);

if(border&1)

{

dc->MoveTo(lpRect->left,lpRect->top);

dc->LineTo(lpRect->left,lpRect->bottom);

}

if(border&2)

{

dc->MoveTo(lpRect->left,lpRect->top);

dc->LineTo(lpRect->right,lpRect->top);

}

if(border&4)

{

dc->MoveTo(lpRect->right,lpRect->top);

dc->LineTo(lpRect->right,lpRect->bottom);

}

if(border&8)

{

dc->MoveTo(lpRect->left,lpRect->bottom);

dc->LineTo(lpRect->right,lpRect->bottom);

}

dc->DrawText(text,lpRect,par);

dc->SelectObject(old_pen);

}

Функція DrawCell приймає такі параметри:

CDC* dc – контекст пристрою;

CString text – текст, який буде виводитись у комірці;

LPRECT lpRect – прямокутник котрий задає розміри комірки;

UINT border – комбінація бітових параметрів, що задають виведення 4-х границь;

UINT par – параметри для функції DrawText, котрі визначають форматування тексту (константи що починаються з префіксу DT_);

int tol – товщина рамки комірки у пікселях;

Функція DrawText із класу CDC виводить текст у вказаний контекст пристрою.

int CDC::DrawText const CString & str, LPRECT lpRect, UINT nFormat) –

Параметр lpRect вказує на структуру RECT або об’єкт класу CRect, які вміщують координати, в логічних одиницях прямокутної області в яку власне і відбувається форматоване виведення тексту.

Параметр nFormat визначає спосіб форматування заданого тексту та може бути комбінацією наступних прапорів (табл. 5.2):

Таблиця 5.2.

Прапори для виведення тексту у функції DrawText

Назва

Опис

DT_BOTTOM

встановлює вирівнювання по нижній межі заданої прямокутної області. Повинно комбінуватися з DT_SINGLELINE

DT_CALCRECT

визначення ширини і висоти прямокутної області виведення. Для тексту в декілька рядків використовується ширина прямокутної області, заданої параметром lprect і настроюється висота, так щоб помістити весь текст. Для тексту в один рядок навпроти настроюється ширина так, щоб точно відповідати ширині виведеного тексту. У будь-якому випадку функція повертає висоту області необхідну для повного виведення тексту, проте власне виведення – не здійснюється. Не може використовуватися спільно зDT_TABSTOP

DT_CENTER

встановлює вирівнювання по центру (по горизонталі) заданої області

DT_EXPANDTABS

при виведенні проводиться заміна символів табуляції на пропуски. Кожна табуляція має розмір у вісім символів

DT_EXTERNALLEADING

при визначенні висоти рядка включається розмір між рядками. Не може використовуватися спільно зDT_TABSTOP

Продовження таблиці 5.2

Назва

Опис

DT_LEFT

встановлює вирівнювання по лівому краю заданої прямокутної області

DT_NOCLIP

здійснення виведення без урахування ширини прямокутної області, що задається. Не може використовуватися спільно зDT_TABSTOP

DT_NOPREFIX

при виведенні амперсант (&) не інтерпретується як вказівка на необхідність підкреслення наступного за ним символу, а подвійний амперсант (&&) як вказівка на виведення тільки одного. Не може використовуватися спільно зDT_TABSTOP

DT_RIGHT

встановлює вирівнювання по правому краю заданої прямокутної області

DT_SINGLELINE

вказує на виведення одного рядка тексту, при цьому символи переведення рядка і повернення каретки не розбивають рядок

DT_TABSTOP

встановлює розмір табуляції, в старшому байті параметра nFormat міститься кількість символом на табуляцію (за умовчанням розмір табуляції дорівнює восьми символам)

DT_TOP

встановлює вирівнювання по верхній межі заданої прямокутної області. Повинно комбінуватися зDT_SINGLELINE

DT_VCENTER

встановлює вирівнювання по центру (по вертикалі) заданої області. Повинно комбінуватися зDT_SINGLELINE

DT_WORDBREAK

встановлює режим автоматичного перенесення рядка між словами, якщо наступне слово виходить за рамки заданої прямокутної області. Символи перенесення рядка інтерпретуються як завжди.

Функція DrawText для виведення тексту використовує поточний шрифт, колір символів та фону. Якщо прапор DT_NOCLIP не заданий, текст не виходить за задані границі. При цьому у випадку, якщо поточний шрифт дуже великий для заданої прямокутної області, функція DrawText не робить спроб його зменшити або замінити.

Для формування даних таблиці використаємо генератор випадкових чисел. Наведемо функцію OnDraw, де відбувається виведення табличної інформації.

void CTableView::OnDraw(CDC* pDC)

{

CTableDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

//Виведення таблиці

int dl1,dl2,dl3,dl4;

int ots1,ots2,vis;

double cena;

int i,kol,tol;

CString str;

CRect rect;

ots1 = 10;

ots2 = 10;

tol = 2;

//Включення генератора

srand(t);

dl1=pDC->GetTextExtent(" Наименование товара ").cx;

dl2=pDC->GetTextExtent(" Цена единицы товара ").cx;

dl3=pDC->GetTextExtent(" Количество товара ").cx;

dl4=pDC->GetTextExtent(" Выручка от реализации ").cx;

vis = pDC->GetTextExtent("М").cy;

rect.SetRect(ots1,ots2,ots1+dl1+dl2+dl3+dl4,ots2+2*vis);

//Виведення заголовку таблиці

pDC->SetTextColor(RGB(0,0,255));

DrawCell(pDC, "Выручка от реализации товаров",

&rect,15, DT_CENTER|DT_VCENTER|DT_SINGLELINE,tol);

//Виведення шапки таблиці

rect.SetRect(ots1,ots2+2*vis,ots1+dl1,ots2+4*vis);

DrawCell(pDC, "Наименование товара", &rect,13,

DT_CENTER|DT_VCENTER|DT_SINGLELINE,tol);

rect.OffsetRect(dl1,0);

rect.right=rect.left+dl2;

DrawCell(pDC, "Цена единицы товара", &rect,13,

DT_CENTER|DT_VCENTER|DT_SINGLELINE,tol);

rect.OffsetRect(dl2,0);

rect.right=rect.left+dl3;

DrawCell(pDC, "Количество товара", &rect,13,

DT_CENTER|DT_VCENTER|DT_SINGLELINE,tol);

rect.OffsetRect(dl3,0);

rect.right=rect.left+dl4;

DrawCell(pDC, "Выручка от реализации", &rect,13,

DT_CENTER|DT_VCENTER|DT_SINGLELINE,tol);

//Виведення змісту таблиці

pDC->SetTextColor(RGB(0,0,0));

rect.SetRect(ots1,ots2+4*vis,ots1+dl1,ots2+6*vis);

for(i=0;i<100;i++)

{

//1-й стовпець

str.Format("Товар № %d",i+1);

DrawCell(pDC, str, &rect,13,

DT_CENTER|DT_VCENTER|DT_SINGLELINE,tol);

rect.OffsetRect(dl1,0);

rect.right=rect.left+dl2;

//2-й стовпець

cena = rand()%6001+4000;

str.Format("%0.2f",cena);

DrawCell(pDC, str, &rect,12,

DT_CENTER|DT_VCENTER|DT_SINGLELINE,tol);

rect.OffsetRect(dl2,0);

rect.right=rect.left+dl3;

//3-й стовпець

kol = rand()%15+1;

str.Format("%d",kol);

DrawCell(pDC, str, &rect,12,

DT_CENTER|DT_VCENTER|DT_SINGLELINE,tol);

rect.OffsetRect(dl3,0);

rect.right=rect.left+dl4;

//4-й стовпець

str.Format("%0.2f",cena*kol);

DrawCell(pDC, str, &rect,12,

DT_CENTER|DT_VCENTER|DT_SINGLELINE,tol);

rect.OffsetRect(0,2*vis);

rect.left = ots1;

rect.right = rect.left+dl1;

}

//Установка скролінгу

SetScrollSizes(MM_TEXT, CSize(ots1+dl1+dl2+dl3+dl4+1,

rect.top+1));

}

Результат роботи програми приведено на рис. 5.11.

Рис. 5.11. Результат виведення таблиці з врахуванням скролінгу

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