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

5.5. Робота зі скролінгом

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

Для створення вікон зі скролінгом у бібліотеці класів MFC передбачено клас CScrollView. Створимо програму на основі SDI з назвою Scroll1. На 6-му кроці для класу CScroll1View оберем базовим класом CScrollView (рис. 5.9). Якщо цього не зробити при створенні проекту, то для заміни базового класу CView на CScrollView потрібно буде змінювати програмний код самостійно.

Напевно Ви помітили що майстер AppWizard при створенні класів дає їм імена на основі назви проекту. Створюючи клас вікна виду мастер додає до назви програми спереду букву C а в кінці View. Якщо ми нашу програму назвемо Scroll то клас виду отримає назву CMyScrollView, тому що ім'я CScrollView (яке повинно було виникнути) вжє занято у бібліотеці MFC.

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

Для перевірки роботи скролінгу нам буде потрібно зробити виведення графічної інформації у вікні виду. Будемо виводити у вікно рядки тексту з лініями. Додамо у клас документа три зміних: кількість рядків тексту; структуру шрифта; колір шрифта:

class CScrollDoc : public CDocument

{

.............................................................

public:

int m_NumLines;

LOGFONT logFont;

COLORREF m_Color;

.............................................................

};

Зберігати настройки будемо на диску з використанням серіалізації даних. У функцію Serialize напишемо такий код:

void CScrollDoc::Serialize(CArchive& ar)

{

if (ar.IsStoring())

{

ar << m_NumLines << m_Color;

ar.Write (&logFont,sizeof(logFont));

}

else

{

ar >> m_NumLines >> m_Color;

ar.Read (&logFont,sizeof(logFont));

}

}

Серіалізація детально описана у п. 7.4. посібника.

Початкові настройки параметрів зробимо у функції OnNewDocument:

BOOL CScrollDoc::OnNewDocument()

{

if (!CDocument::OnNewDocument())

return FALSE;

// Начальная загрузка ini-файла

if (OnOpenDocument("scroll.ini"))

{

SetTitle("scroll.ini");

return TRUE;

}

m_Color = 0L;

m_NumLines = 5;

logFont.lfHeight = -20;

logFont.lfWidth = 0;

logFont.lfEscapement = 0;

logFont.lfOrientation = 0;

logFont.lfWeight = FW_NORMAL;

logFont.lfItalic = 0;

logFont.lfUnderline = 0;

logFont.lfStrikeOut = 0;

logFont.lfCharSet = ANSI_CHARSET;

logFont.lfOutPrecision = OUT_DEFAULT_PRECIS;

logFont.lfClipPrecision = CLIP_DEFAULT_PRECIS;

logFont.lfQuality = PROOF_QUALITY;

logFont.lfPitchAndFamily = VARIABLE_PITCH|FF_ROMAN;

strcpy(logFont.lfFaceName,"Times New Roman");

return TRUE;

}

При створенні нового документу ми намагаємося зчитати настройки з файлу scroll.ini завдяки функції OnOpenDocument, яка викликає серіалізацію. Якщо файл знайдено і всі настройки зчитались, то ставимо заголовок для вікна та виходимо з функції. У випадку першого запуску (коли *.ini файл ще не створено) або невдачі (*.ini файл може бути пошкодженим або бути відсутнім) заповнюємо параметри самостійно.

Для вибору параметрів шрифту і його кольору додамо до меню команди Font та Color. У функцію для вибору шрифту напишемо такий код:

void CScroll1View::OnFont()

{

CScrollDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

CFontDialog fontDlg(&(pDoc->logFont));

if(fontDlg.DoModal() == IDOK)

{

fontDlg.GetCurrentFont(&(pDoc->logFont));

pDoc->SetModifiedFlag();

Invalidate();

}

}

CFontDialog є класом стандартного діалогу для вибору настройок шрифта у Windows. При створенні даний діалог потребує структуру із шрифтом, на основі якого він визначить початкові настройки шрифту. Функція DoModal створює модальне вікно діалогу. Якщо користувач у діалозі вибору шрифта натисне OK то він закриється і поверне в результаті значення IDOK. Отже через оператор if ми перевіряємо чи користувач дійсно захотів змінити шрифт, якщо так то виконуємо наступні дії. Діалог вибору шрифтів сам по собі не змінює структури шрифта, яка була йому передана у конструкторі. Функція GetCurrentFont з класу CFontDialog дозволяє отримати внутрішні настройки шрифта з діалогу. Тобто якщо користувач після зміни шрифту у діалозі не натисне OK то змінна структури pDoc->logFont залишиться не зміненою. Функція SetModifiedFlag повідомляє класу документа про те що в ньому відбулись зміни параметрів, які потрібно записати на диск. Тобто після виклику цієї функції при спробі закриття документа програмою буде задано питання користувачу про його бажання зберегти на диск документ. Зберігання документа як і зчитування робиться у функції Serialize. Відображення змін шрифту на екрані робиться після виклику функції Invalidate, яка визиває функцію OnDraw.

У функцію для вибору кольору напишемо такий код:

void CScroll1View::OnColor()

{

CScrollDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

CColorDialog color(pDoc->m_Color);

if (color.DoModal()==IDOK)

{

pDoc->m_Color = color.GetColor();

pDoc->SetModifiedFlag();

Invalidate();

}

}

Принцип роботи функції OnColor такий же як і у OnFont. Відмінності полягають в тому, що викликається діалог зміни кольору CColorDialog, який є стандартним класом діалогу для вибору кольору у Windows. А його функція GetColor повертає значення зміненого у діалозі кольору.

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

void CScroll1View::OnDraw(CDC* pDC)

{

CScrollDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

int num_lines = pDoc->m_NumLines;

LOGFONT logFont = pDoc->logFont;

CFont font;

font.CreateFontIndirect(&logFont);

pDC->SelectObject(&font);

pDC->SetTextColor(pDoc->m_Color);

CString string = " Строка - 1 ";

string+=" Проверка скроллинга по длине";

string+=" первой строки Конец|";

CSize dl = pDC->GetTextExtent(string);

int chir = pDC->GetTextExtent("1",1).cx;

int h = abs((int)(logFont.lfHeight*1.2));

UINT position = 0;

for (int x = 0; x < num_lines;x++)

{

if (x > 0) string.Format(" Строка - %d", x+1);

pDC->TextOut(0,position,string);

pDC->MoveTo(0,position);

pDC->LineTo(100,position);

position+= h;

}

pDC->MoveTo(0,position);

pDC->LineTo(100,position);

CRect rect;

GetClientRect(&rect);

CSize clientSize(rect.right,rect.bottom);

CSize docSize(dl.cx,h*num_lines);

CSize unitSize(chir,h);

SetScrollSizes(MM_TEXT,docSize,clientSize,unitSize);

}

Робота зі шрифтами та лініями розглядалася у п. 5.2. Пояснимо нові функції. Функція GetTextExtent розраховує розмір текстового рядку у пікселях. Функція GetClientRect повертає розміри області клієнтського вікна. У змінну dl записуються розміри самого довгого рядка тексту, у chir ширина 1-го символа, у h висота текстового рядка. В циклі виводиться форматований текст, підкреслений лініями. Далі йдуть настройки скролінгу у функції SetScrollSizes. Ця функція приймає такі параметри: 1) режим виведення (див. табл. 6.1); 2) розмір документа; 3) розмір клієнтського вікна; 4) розмір мінімального переміщення скролінгу при натисненні кнопок на бігунках. Розміри вертикального і горизонтального бігунків розраховуються автоматично у функції SetScrollSizes, достатньо їй передати вказані вище параметри. Результат роботи показано на рисунку 5.10:

Рис. 5.10. Результат роботи зі скролінгом

При роботі зі скролінгом можна також звернути увагу на функцію OnInitialUpdate. Вона викликається при створенні документа і задає початкові розміри документа. Якщо у програмі розмір документа не буде змінюватися, тоді можливо налаштувати його саме у функції OnInitialUpdate. У даному випадку ми цю функцію не використовували, тому що розмір нашого документа може змінюватись і початкове задання розмірів у таких умовах доцільно задати константами (як це автоматично робить майстер AppWizard).

Увага!!! Дії по прокрутці враховуються лише у контексті пристрою, спеціально підготовленному для методу OnDraw(). Для прив'язки скролінга до власного контексту використовується функція OnPrepareDC(), входом у яку є адреса нового контексту.

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