- •О.С. Зеленський
- •Розділ 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. Формування вхідного документа на основі діалогу
- •Контрольні питання
- •Завдання Робота з типовими елементами керування
- •Робота зі списками і комбінованими полями
- •Список літератури
8.8.2. Клас cDialView
Головне вікно додатку показано на рис. 8.16, на цьому рисунку також видно результат роботи класу виду.
Рис. 8.16. Головне вікно додатку
Головна функція для виведення графічної інформації у класі виду це OnDraw:
void CDialView::OnDraw(CDC* pDC)
{
CBitmap* mm, *old_bit;
BITMAP bm;
CDC mem;
CDialDoc* pDoc = GetDocument();
int dlina_1,dlina_2,vis,ots_l,ots_v,par,tol;
LOGFONT logFont = pDoc->dia.logFont;
CFont font;
CString string,str;
double cena;
ots_l = 0;
if (startBitmap)
{
mm = mm->FromHandle(startBitmap);
mem.CreateCompatibleDC(dc);
old_bit = mem.SelectObject(mm);
dc->BitBlt(10,10,1000,1000,&mem,0,0,SRCCOPY);
mm->GetBitmap(&bm);
mem.SelectObject(old_bit);
ots_l = bm.bmWidth;
}
//-----------------------------------------------------------
tol = 2; // товщина лінії
ots_l += 15 ; // відступ для написів
par = DT_VCENTER|DT_CENTER|DT_SINGLELINE;
font.CreateFontIndirect(&logFont);
dc->SelectObject(&font);
dc->SetTextColor(pDoc->dia.color_viv);
dlina_1 = dc->GetTextExtent(" Год выпуска ").cx;
dlina_2 = dc->GetTextExtent(" Mercedes-Benz SLR ").cx;
vis = dc->GetTextExtent("W",1).cy;
vis = (int)(vis*1.4);
ots_v = 100;
CRect p0(ots_l,ots_v,ots_l + dlina_1 + dlina_2,
ots_v -vis);
DrawCell(dc,"Данные по машине:",p0,15,par,tol);
ots_v += vis;
CRect p1(ots_l,ots_v,ots_l+dlina_1,ots_v -vis);
CRect p2(ots_l +p1.Width(),ots_v,
ots_l+dlina_2 +p1.Width(),ots_v -vis);
DrawCell(dc,"Марка",p1,13,par,tol);
DrawCell(dc,pDoc->mas_mach[pDoc->dia.marka],
p2,12,par,tol);
p1.OffsetRect(0,vis);
p2.OffsetRect(0,vis);
DrawCell(dc,"Количество",p1,13,par,tol);
string.Format("%d",pDoc->dia.kol_mach);
DrawCell(dc,string,p2,12,par,tol);
p1.OffsetRect(0,vis);
p2.OffsetRect(0,vis);
DrawCell(dc,"Пробег",p1,13,par,tol);
string.Format("%d тыс.км",pDoc->dia.probeg);
DrawCell(dc,string,p2,12,par,tol);
p1.OffsetRect(0,vis);
p2.OffsetRect(0,vis);
DrawCell(dc,"Год выпуска",p1,13,par,tol);
string.Format("%d год",2008-pDoc->dia.god);
DrawCell(dc,string,p2,12,par,tol);
p1.OffsetRect(0,vis);
p2.OffsetRect(0,vis);
DrawCell(dc,"Состояние",p1,13,par,tol);
string = "отличное";
if (pDoc->dia.sost == 1) string = "хорошее";
if (pDoc->dia.sost == 2) string = "среднее";
if (pDoc->dia.sost == 3) string = "ниже среднего";
DrawCell(dc,string,p2,12,par,tol);
p1.OffsetRect(0,vis);
p2.OffsetRect(0,vis);
DrawCell(dc,"Цвет",p1,13,par,tol);
string = "Красный";
if (pDoc->dia.color == 1) string = "Зелёный";
if (pDoc->dia.color == 2) string = "Синий";
DrawCell(dc,string,p2,12,par,tol);
p1.OffsetRect(0,vis);
p2.OffsetRect(0,vis);
DrawCell(dc,"Кондиция",p1,13,par,tol);
string = "-";
if (pDoc->dia.kond == 1) string = "+";
DrawCell(dc,string,p2,12,par,tol);
p1.OffsetRect(0,vis);
p2.OffsetRect(0,vis);
DrawCell(dc,"Сигнал",p1,13,par,tol);
string = "-";
if (pDoc->dia.signal == 1) string = "+";
DrawCell(dc,string,p2,12,par,tol);
p1.OffsetRect(0,vis);
p2.OffsetRect(0,vis);
DrawCell(dc,"Цена",p1,15,par,tol);
cena = (pDoc->mas_st[pDoc->dia.marka] +
500*(pDoc->dia.kond + pDoc->dia.signal)+
pDoc->dia.color*100 - pDoc->dia.probeg*10)*
(1-0.2*pDoc->dia.sost)*(1-0.03*pDoc->dia.god) * pDoc->dia.kol_mach;
string.Format("%.2f $",cena);
if (pDoc->dia.val == 1)
{
cena*=pDoc->dia.grn;
string.Format("%.2f грн",cena);
}
if (pDoc->dia.val == 2)
{
cena*=pDoc->dia.euro;
string.Format("%.2f €",cena);
}
DrawCell(dc,string,p2,15,par,tol);
// Скроллинг
SetScrollSizes(MM_TEXT,CSize(p2.right,p2.bottom));
}
Створюємо об’єкт CBitmap mm для зберігання зображення. Функція LoadImage зчитує зображення із *.bmp файлу. Наведемо вхідні параметри цієї функції:
HANDLE LoadImage(
HINSTANCE hinst, // вказівка на додаток,
// який містить зображення
LPCTSTR lpszName, // текст з іменем файлу зображення
UINT uType, // тип зображення
int cxDesired, // бажана ширина
int cyDesired, // бажана висота
UINT fuLoad // прапорці для зчитування
);
Створюємо об’єкт CDC mem для забезпечення виведення зображення у контекст екрану. Функцією SelectObject підключаємо зображення до об’єкту mem. Виведення зображення на екран робимо за допомогою рядка коду dc-> BitBlt(10,10,1000,1000, &mem,0,0,SRCCOPY). Розмір зображення заданий як 1000*1000, ми припускаємо що зображення буде меншим, інакше воно буде обрізане.
Функція OffsetRect класу CRect переміщує координати прямокутника на вказаний розмір по горизонталі та вертикалі.
Для зберігання зображень можливо використати не тільки окремі файли *.bmp. Можливо зберігати зображення у ресурсах самого додатку. Такий підхід збільшить розмір виконавчого *.exe файлу, але при цьому окрема папка з файлами зображень стане непотрібною. Для зчитування зображень із ресурсів програми використовується функція LoadBitmap.
Функція для зміни шрифту, має вигляд:
void CDialView::OnFont()
{
CDialDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CFontDialog fontDlg(&(pDoc->dia.logFont));
if(fontDlg.DoModal() == IDOK)
{
fontDlg.GetCurrentFont(&(pDoc->dia.logFont));
pDoc->SetModifiedFlag();
Invalidate();
}
}
Клас стандартного діалогу для зміни шрифту має назву CFontDialog. Створюємо об’єкт цього класу, а вхідним параметром даємо адресу змінної типу LOGFONT з ім’ям logFont. Діалог вибору шрифту буде модальний (викликається функцією DoModal), це означає, що доки користувач не вибере шрифт, або не закриє діалог інші вікна додатку будуть не доступні.
Вибір кольору тексту робиться через стандартний діалог CColorDialog у функції OnColor, яка подібна до описаної вище функції OnFont.