- •О.С. Зеленський
- •Розділ 1. Загальні відомості створення додатку windows
- •1.1. Створення додатку Windows за допомогою майстра AppWizard
- •1.2. Варіанти майстрів для різних проектів
- •1.3. Короткий опис sdi програми
- •1.4. Короткий опис mdi програми
- •1.5. Короткий опис простого діалогового додатку
- •Контрольні питання
- •Розділ 2. Повідомлення і команди
- •2.1. Обробка повідомлень
- •2.2. Цикли обробки повідомлень
- •2.3. Карти повідомлень
- •Контрольні питання
- •Розділ 3. Документи та види
- •3.1. Клас додатку
- •3.2. Клас головного вікна
- •3.3. Клас документа
- •3.4. Класи виду
- •Контрольні питання
- •Розділ 4. Робота з клавіатурою, мишею і меню
- •4.1. Робота з клавіатурою
- •4.2. Робота з мишею
- •4.3. Робота з меню
- •Контрольні питання
- •Розділ 5. Виведення на екран
- •5.1. Класи графічних об'єктів
- •5.2. Робота зі шрифтами
- •5.3. Робота з пензликами та малювання графічних фігур
- •5.4. Робота з пензликом
- •5.5. Робота зі скролінгом
- •5.6. Приклад роботи з таблицями
- •5.7. Малювання на екрані маніпулятором "миша"
- •5.8. Завантаження та виведення на екран бітових зображень
- •5.9. Копіювання бітових образів
- •5.10. Малювання графічних об'єктів з використанням резинових контурів та метафайлів
- •5.11. Виділення графічних об'єктів у прямокутній області
- •5.12. Універсальний приклад роботи з двовимірною графікою з використанням резинового контуру
- •5.13. Запис на диск та зчитування з диску графічних об'єктів
- •5.14. Побудова кругових діаграм і гістограм
- •5.15. Користувацький режим роботи з графікою на прикладі малювання годинника Clock
- •Контрольні питання
- •Завдання
- •Розділ 6. Друк і попередній перегляд документів
- •6.1. Вибір і налаштування параметрів друку
- •6.2. Створення контекста пристрою
- •6.3. Друк документів і бібліотека mfc
- •6.4. Масштабування
- •6.5. Друк багатосторінкового документа
- •Контрольні питання
- •Розділ 7. Робота з файлами
- •7.1. Приклад роботи з файлами на основі класів cFile, cStdioFile та потоку fstream
- •7.1.1. Робота з класом cFile
- •7.1.2. Робота з потоком fstream
- •Можливі режими доступу
- •7.1.3. Робота з класом cStdioFile
- •7.2. Серіалізація даних, клас cArchive
- •7.3. Використання реєстру в додатках
- •Контрольні питання
- •Завдання
- •Розділ 8. Діалогові вікна
- •8.1. Створення діалогового вікна та простіші елементи керування
- •8.2. Робота зі списками і комбінованими полями
- •8.3. Ускладнений приклад зі списками
- •8.4. Робота з повзунками
- •8.5. Виведення бітових матриць в діалозі та у вікні виду
- •8.6. Лінійний регулятор, лінійний індикатор, інкриментний регулятор
- •8.7. Стандартні діалоги вибору файлів, шрифтів та кольору
- •8.8. Взаємоз'вязок діалога, документа та виду при розробці додатку
- •8.8.1. Клас cDialDoc
- •8.8.2. Клас cDialView
- •8.8.3. Клас Cdlg
- •8.9. Формування вхідного документа на основі діалогу
- •Контрольні питання
- •Завдання Робота з типовими елементами керування
- •Робота зі списками і комбінованими полями
- •Список літератури
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. Результат виведення таблиці з врахуванням скролінгу