- •О.С. Зеленський
- •Розділ 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.4. Робота з повзунками
Приклад роботи знаходиться у папці DISK\dialog\dialog4.
У цьому блоці показана робота з використанням елементів управління повзунком, а також технологія ініціалізації елементів керування безпосередньо в класі виду похідному від CView.
Програма роботи з повзунком згенерована з використанням режиму Dialog Based.
Найменування програми sliders.
Послідовність роботи.
1. На першому етапі створюється ресурс діалогу, який включає повзунок (slider) і текстове поле, в якому буде відображено положення повзунка. Потім створюємо змінні m_slider типу CSliderCtrl і m_text типу CString за наступними ідентифікаторами аналізованих елементів управління, відповідно IDC_SLIDER1, IDC_EDIT1.
2. При переміщенні бігунка елемент посилає повідомлення WM_HSCROLL (WM_VSCROLL для вертикальних повзунків). За допомогою ClassWizard зв'яжіть повідомлення WM_HSCROLL з методом OnHScroll() (OnVScroll() для вертикальних повзунків). Метод OnHScroll() обробляє повідомлення, призначені для діалогового вікна:
void CSlidersDlg::OnHScroll(UINT nSBCode, UINT nPos,
CScrollBar * pScrollBar)
{
.............................................................
}
Параметрами цього методу є код операції прокрутки, нова позиція бігунка і вказівка на керуючий елемент, від якого надійшло повідомлення. Код операції може приймати стандартні значення, перелічені в табл. 8.2.
Таблиця 8.2
Повідомлення про прокрутку Windows
|
Код операції |
Значення |
|
SB_ENDSCROLL |
Завершення прокручування |
|
SB_LEFT |
Прокрутка в крайню ліву позицію |
|
SB_LINELEFT |
Прокрутка ліворуч |
|
SB_LINERIGHT |
Прокрутка праворуч |
|
SB_PAGELEFT |
Прокручування на сторінку ліворуч |
|
SB_PAGERIGHT |
Прокручування на сторінку праворуч |
|
SB_RIGHT |
Прокрутка в крайню праву позицію |
|
SB_THUMBPOSITION |
Прокрутка в задану позицію |
|
SB_THUMBTRACK |
Переміщення бігунка в задану позицію |
У нашому випадку використовується код SB_THUMBPOSITION, що посилається при переміщенні бігунка. Текст програми:
void CSlidersDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar * pScrollBar)
{
if (SB_THUMBPOSITION == nSBCode)
{
m_text.Format("% ld", nPos);
UpdateData(false);
}
CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}
Тут, при переміщенні повзунка значення його позиції передається в текстове поле. Ініціалізація елементів управління відбувається наступним чином:
BOOL CSlidersDlg::OnInitDialog()
{
CDialog::OnInitDialog();
m_slider.SetRangeMin(1, false);
m_slider.SetRangeMax(100, false);
m_text = "1";
UpdateData(false);
return TRUE;
}
У даному фрагменті встановлюється інтервал повзунка від 1 до 100, який задається за допомогою методів SetRangeMin(), SetRangeMax() класу CSliderCtrl. Початкове значення, що відображається в текстовому полі, прийнято рівним одиниці. На рис. 8.8 продемонстровано роботу додатка.

Рис. 8.8. Робота програми sliders
8.5. Виведення бітових матриць в діалозі та у вікні виду
Приклад роботи знаходиться у папці DISK\dialog\dialog5.
Створимо додаток з назвою ColorDemo, у ньому буде показано створення діалогового вікна для вибору кольору а також виведення бітових зображень у вікнах діалогу з використанням ресурсів та файлів зображень. Створимо діалогове вікно для вибору кольору (з ідентифікатором IDD_DIALOG1 у файлі ресурсу), яке містить: 4 кнопки, 3 вертикальні полоси прокрутки, 7 текстових підписів і 4 підписа без тексту для відображення вибраних параметрів кольору (верхнє вікно на рис. 8.9).

Рис. 8.9. Виведення діалогового вікна вибору кольору
Для діалогового вікна вибору кольору окрім ресурсу IDD_DIALOG1 створимо клас CScrollDial. При зміні позицій у полосах прокрутки буде викликатись функція OnVScroll, її код наведено далі:
void CScrollDial::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
if(nPos==0)nPos = pScrollBar->GetScrollPos();
if(nSBCode == SB_LINEUP) nPos--;
if(nSBCode == SB_LINEDOWN)nPos++;
if(nSBCode == SB_PAGEUP) nPos-=5;
if(nSBCode == SB_PAGEDOWN)nPos+=5;
if(nPos<0)nPos = 0;
if(nPos>255)nPos = 255;
pScrollBar->SetScrollPos(nPos);
InvalidateRect(&rectGl,false);
InvalidateRect(&rectR,false);
InvalidateRect(&rectG,false);
InvalidateRect(&rectB,false);
CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
}
Вхідний параметр nSBCode визначає подію, яка відбулась із полосами прокрутки. Змінна nPos відповідає за позицію повзунків. Константи SB_LINEUP і SB_LINEDOWN визначають події які відбуваються при натисненні на верхню або нижню кнопки скролінгу, вони повинні здійснювати мінімальну прокрутку повзунків. Константи SB_PAGEUP і SB_PAGEDOWN відповідають подіям прокрутки повзунків на одну сторінку документа вверх або вниз. У даному випадку ми не використовуємо полосу прокрутки для відображення деякого документа, тому розмір сторінки обираємо самостійно рівним 5. В іншому випадку виникала б необхідність робити розрахунки розмірів видимої області документа по відношенню до всього документа і кількості мінімальних переміщень функцією SetScrollSizes, яку ми розглядали у п. 5.5.
Для виведення зображень у вікні діалогу створимо клас CDialBitmap. Внесемо у вікно діалогу елемент керування CStatic. Основне призначення цих елементів у виведенні текстової інформації, але у даному випадку ми скористаємось можливістю встановлення фонових зображень. Тексту у ньому не буде так як він буде слугувати рамкою для виведення зображень. Додамо вказівку на об'єкт CStatic* st1, а у функції OnInitDialog присвоюємо їй значення:
BOOL CDialBitmap::OnInitDialog()
{
CDialog::OnInitDialog();
st1 = (CStatic*)GetDlgItem(IDC_STATIC1);
return TRUE;
}
Внесемо у ресурси проекту 2 зображення із папки BMP з ідентифікаторами IDB_BITMAP1 і IDB_BITMAP2, після чого у файлі ресурсів з'являться такі рядки коду:
// Bitmap
IDB_BITMAP1 BITMAP "BMP\\audi.bmp"
IDB_BITMAP2 BITMAP "BMP\\BMW.bmp"
Додамо у діалог 3 кнопки для зміни зображень. Через майстер створимо для них функції OnButton1, OnButton2 та OnButton3. Для роботи з картинкою у класі CDialBitmap необхідно оголосити об’єкт m_Bit класу CBitmap.
void CDialBitmap::OnButton1()
{
// Виведення картинки на основі ресурсів
m_Bit.DeleteObject();
m_Bit.LoadBitmap(IDB_BITMAP1);
st1->SetBitmap((HBITMAP)m_Bit.m_hObject);
}
void CDialBitmap::OnButton2()
{
// Виведення картинки на основі ресурсів
m_Bit.DeleteObject();
m_Bit.LoadBitmap(IDB_BITMAP2);
st1->SetBitmap((HBITMAP)m_Bit.m_hObject);
}
void CDialBitmap::OnButton3()
{
// Виведення картинки з папки BMP з повною перевіркою
if(access("BMP",0))
{
MessageBox("Отсутствует папка BMP,\nгде должны находится файлы *.bmp\nдля работы с картинками \n",
"Внимание!",MB_ICONINFORMATION);
return;
}
if(access("BMP\\GAZ.bmp",0))
{
MessageBox("В папке BMP отсутствует файл GAZ.bmp",
"Внимание!",MB_ICONINFORMATION);
return;
}
HBITMAP startBitmap = (HBITMAP)LoadImage(NULL, "BMP\\GAZ.bmp", IMAGE_BITMAP,0,0, LR_LOADFROMFILE);
if (!startBitmap)
{
MessageBox(
"В папке BMP ошибочная структура файла GAZ.bmp",
"Внимание!",MB_ICONINFORMATION);
return;
}
st1->SetBitmap(startBitmap);
}
У функціях OnButton1 і OnButton2 виведення зображення робиться на основі об'єкту m_Bit класу CBitmap, через який ми завантажуємо зображення із ресурсів. Встановлення зображення відбувається функцією SetBitmap об'єкту st1.
Інколи буває не зручно тримати зображення у ресурсах програми, так як це збільшує розмір програмного файлу а також вимагає перекомпіляції програмного файлу при необхідності замінити зображення. У функції OnButton3 показано варіант із підключенням зовнішнього зображення. Ця функція більша за попередні тому що у ній передбачені випадки контролю наявності зовнішнього файлу, а також відповідності його структури формату *.bmp. На рис. 8.10. продемонстровано результат виведення бітового зображення у вікні діалогу.

Рис. 8.10. Виведення бітового зображення у діалозі
