Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Ed->SetWindowText(програмування); //Встановлення тексту у полі редагування 1 страница






return TRUE;

}

Такий спосіб використовується для діалогових вікон. Якщо ж необхідно створити поле редагування у головному вікні, дотримуються іншого способу:

1) Оголосити об’єкт типу CEdit у класі головного вікна, наприклад:

CEdit ed;

2) Визначити ідентифікатор поля редагування, наприклад:

#define IDC_EDIT1 4001

3) У конструкторі головного вікна створити поле редагування із визначеними параметрами:

 

ed.Create(WS_VISIBLE|WS_CHILD|WS_BORDER, CRect(10, 10, 140, 40), this, IDC_EDIT1);

 

де WS_VISIBLE|WS_CHILD|WS_BORDER – стилі поля редагування: видимість поля, дочірнє становище стосовно головного вікна, наявність рамки; CRect(10, 10, 140, 40) – розміри поля редагування, обмежена прямокутником; this – покажчик на вікно-власник (головне вікно); IDC_EDIT1 – ідентифікатор.

4) Провести у конструкторі необхідні операції з ініціалізації об’єкта:

 

ed.SetWindowText(" програмування");

 

У прикладі використано функцію Create() класу CEdit. Слід зазначити, що у такий спосіб можуть бути створені й інші елементи керування: кнопки, списки, перемикачі тощо. Він демонструє можливості ручного визначення параметрів елементів керування.

 

3.4.4 Використання контрольних перемикачів та селекторних кнопок

Контрольні перемикачі та селекторні кнопки належать до додаткових, допоміжних елементів керування [1]. Як і звичайні кнопки, вони належать до класу CButton і мають два основних стани: активний (обраний) і неактивний (не обраний).

У випадку стандартних кнопок, розміщених у діалоговому вікні, схема роботи доволі проста (див. п. 3.2) – у карті повідомлень для кожного повідомлення WM_COMMAND, що надійшло від кнопки із ідентифікатором IDC_BUTTON вказати функцію-обробник, наприклад:

 

ON_COMMAND(IDС_BUTTON1, OnButton1)

 

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

Контрольні перемикачі та селекторні кнопки завжди змінюють свій стан, але, здебільшого, не автоматично, а за потребою користувача.

Клас CButton забезпечує функції для перевірки та встановлення стану кнопки, серед них:

 

int CButton:: GetCheck(); // повертає стан кнопки

void CButton:: SetCheck(int nCheck); // встановлює стан кнопки

 

де стан кнопки: 1 – встановлено, 0 – не встановлено, 2 – не визначається.

Для роботи з контрольними перемикачами та селекторними кнопками необхідно дотримуватися такої послідовності:

1. Визначити у класі діалогового вікна об’єкти перемикачів та кнопок:

 

сlass CSampleDialog: public CDialog

{private: CButton * rb2, * rb1; // об’єкти селекторних кнопок

CButton *ch1; // об’єкт контрольного перемикача

public: ……………………….

};

 

2. У функції OnInitDialog() зв’язати об’єкти кнопок з відповідними ресурсами, створеними у редакторі ресурсів і встановити їх первинний стан:

 

BOOL CSampleDialog:: OnInitDialog()

{CDialog:: OnInitDialog();

rb1=(CButton*)GetDlgItem(IDC_RADIO1);

rb2=(CButton*)GetDlgItem(IDC_RADIO2);

ch1=(CButton*)GetDlgItem(IDC_CHECK1);

rb1-> SetCheck(1); // встановлення активною першої селекторної кнопки

ch1-> SetCheck(0); // деактивація контрольного перемикача

return TRUE;

}

 

3. Для контрольних перемикачів обробити макрокоманду натискання: ON_BN_CLICKED(IDC_CHECK1, OnCheck) та реалізувати відповідний обробник:

void CSampleDialog:: OnCheck()

{if(! ch1-> GetCheck()) {.......}

else {.......}

}

 

4. У необхідних функціях перевірити стан селекторних кнопок, наприклад:

 

void CSampleDialog:: OnFunction1()

{if(rb1-> GetCheck())MessageBox(“Обрано перемикач 1”);

if(rb2-> GetCheck())MessageBox(“Обрано перемикач 2”);

}

3.4.5 Смуги прокрутки та обробка повідомлень смуг прокрутки

Смуги прокрутки не обов’язково розташовуються саме у діалогових вікнах. Вони однаково успішно пов’язуються з вікнами, породжуваними від класу СFrameWnd, з такими загальними елементами керування, як спін і регулятор.

Загалом, в операційній системі Windows існує два типи смуг прокрутки. Елементи першого типу є частиною вікна (включно із діалоговим вікном). Їх називають стандартними або віконними смугами прокрутки. Елементи другого типу існують незалежно і тому називаються незалежними смугами прокрутки. Перші описуються у класі CWnd, другі – за допомогою класу CScrollBar.

Для того, щоб вікно містило стандартні смуги прокрутки необхідно визначити відповідні стилі. У головному вікні, похідному від CFrameWnd додатково визначаються стилі WS_VSCROLL – для вертикальної смуги прокрутки і WS_HSCROLL – для горизонтальної. Наприклад, конструктор описаний у прикладі 2.17 видозміниться у такий спосіб:

CMainWin:: CMainWin()

{Create(NULL, " Проста MFC-програма",

WS_OVERLAPPEDWINDOW | WS_VSCROLL | WS_HSCROLL, rectDefault, NULL, MAKEINTRESOURCE(IDR_MENU1)); }

Для діалогових вікон ситуація значно простіше: у властивостях шаблону діалогового вікна слід лише зазначити “Horizontal scroll”, “Vertical Scroll”. Це й наведено на рисунку 3.4.

 

Рисунок 3.4 – Визначення додаткових стилів ресурсу діалогового вікна

 

Смуги прокрутки не генерують повідомлень типу WM_COMMAND, а замість цього посилають повідомлення WM_VSCROLL або WM_HSCROLL. Їм відповідають макрокоманди ON_WM_VSCROLL() та ON_WM_HSCROLL().

Кожна макрокоманда має свій обробник:

 

void CWnd:: OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);

void CWnd:: OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);

 

де nSBCode – код дії із смугою прокрутки, nPos – визначає позицію смуги прокрутки (якщо не надіслані коди SB_THUMBPOSITION або SB_THUMBTRACK), pScrollBar – покажчик на об’єкт смуги прокрутки (має значення NULL, якщо повідомлення прийшло від стандартної смуги прокрутки).

Для реалізації обробників необхідно розпізнавати коди дій із смугою. Вони показані у таблиці 3.3. Перед використанням смуги прокрутки задається її діапазон, що визначає кількість умовних позицій повзунка, який за замовчуванням має діапазон (0 – 100).

 

Таблиця 3.3 – Значення кодів обробників OnVScroll та OnНScroll

Код Коментар
SB_BOTTOM повзунок зміщено у найнижчу позицію (для вертикальної смуги)
SB_TOP повзунок зміщено у найвищу позицію (для вертикальної смуги)
SB_ENDSCROLL повзунок зміщено у крайню праву позицію (для горизонтальної смуги)
SB_LINELEFT повзунок зміщено на одну позицію ліворуч (для горизонтальної смуги)
SB_LINERIGHT повзунок зміщено на одну позицію праворуч (для горизонтальної смуги)
SB_PAGELEFT повзунок зміщено на одну сторінку ліворуч (для горизонтальної смуги)
SB_PAGERIGHT повзунок зміщено на одну сторінку праворуч (для горизонтальної смуги)
SB_LINEUP повзунок зміщено на одну позицію вгору (для вертикальної смуги)
SB_LINEDOWN повзунок зміщено на одну позицію вниз (для вертикальної смуги)
SB_PAGEUP повзунок зміщено на одну сторінку вгору (для вертикальної смуги)
SB_PAGEDOWN повзунок зміщено на одну сторінку праворуч (для вертикальної смуги)
SB_THUMBPOSITION повзунок переміщено на нову позицію (для обох смуг)
SB_THUMBTRACK кнопка миші утримується натиснутою, одночасно повзунок переміщено на нову позицію (для обох смуг)

 

Діапазон прокрутки задається функцією SetScrollRange(). Її прототип:

 

void CWnd:: SetScrollRange(int nBar, int nMinPos, int nMaxPos, BOOL bRedraw = TRUE);

 

де nBar – тип смуги прокрутки: вертикальна (SB_VERT) або горизонтальна (SB_HORZ), nMinPos – мінімальне значення межі прокрутки, nMaxPos – Максимальне значення межі прокрутки, bRedraw – ознака необхідності оновлення зображення прокрутки після зміни стану.

Функція SetScrollPos() встановлює нову позицію смуги прокрутки:

 

int CWnd:: SetScrollPos(int nBar, int nPos, BOOL bRedraw = TRUE);

 

де Pos – позиція, у яку встановлюється повзунок смуги прокрутки. Параметри nBar та bRedraw мають те саме значення, що й у попередній функції.

Інша функція – GetScrollPos() отримує поточне значення повзунка смуги прокрутки:

 

int CWnd:: GetScrollPos(int nBar); // nBar має те саме значення, що у попередніх функціях

 

Приклад 3.9 – Реалізація обробника вертикальної смуги прокрутки для головного вікна програми

void CMainWin:: OnVScroll(UINT SBCode, INT Pos, CScrollBar *SB)

{char str[255];

switch(SBCode)

{case SB_LINEDOWN: vspos++; break;

case SB_LINEUP: vspos--; break;

case SB_PAGEDOWN: vspos+=5; break;

case SB_PAGEUP: vspos-=5; break;

case SB_THUMBTRACK: vspos=Pos; break;

case SB_THUMBPOSITION: vspos=Pos; break;

}

InvalidateRect(NULL); // оновлення всього вікна

SetScrollPos(SB_VERT, vspos); } // встановлення повзунка у нову позицію

3.4.6 Приклад програми із реалізацією стандартних елементів керування у діалоговому вікні

Запропонуємо такий вигляд інтерфейсу діалогового вікна, як зображено на рисунку 3.5.

 

 

Рисунок 3.5 – Вигляд інтерфейсу діалогового вікна програми

 

З точки зору функціонування програми, нехай її робота полягає у таких діях: після завантаження програми кнопки “Add”, “Delete”, “Clear” – неактивні. Вони активуються включенням перемикача “Check1”.

Текст, набраний у полі редагування після натискання на кнопку “Add” додається у список, а якщо поле редагування пусте – користувач отримує повідомлення про помилку. Доданий у список рядок може бути вилучений натисканням кнопки “Delete” (рядок, що вилучається, необхідно виділити, інакше – повідомлення про помилку). Кнопка “Clear” повністю очищає список.

Встановлення селекторної кнопки у позицію “Radio1” перетворює рядок, введений у полі редагування, у верхній регістр (тільки латинські символи). Повний текст програми наведено у прикладі 3.10.

 

Приклад 3.10 – Текст коду програми із реалізацією стандартних елементів керування у модальному діалоговому вікні

 

// файл d01.h

class CSampleDialog: public CDialog

{public: void OnCheck();

void OnClear();

void OnDelete();

void OnAdd();

BOOL OnInitDialog();

void OnClose();

CSampleDialog(UINT id, CWnd *Owner): CDialog(id, Owner){}

DECLARE_MESSAGE_MAP()

private: CButton * rb2, * rb1, *ch1, *bt_clear, *bt_delete, *bt_add;

CEdit *ed;

CListBox *lb;

CComboBox *cb; };

class CApp: public CWinApp

{public: BOOL InitInstance(); };

 

// файл – d01.cpp

#include < afxwin.h>

#include < string.h>

#include " d01.h"

#include " resource.h"

 

BOOL CApp:: InitInstance()

{CSampleDialog a(IDD_DIALOG1, m_pMainWnd);

a.DoModal();

return TRUE; }

 

CApp App;

 

BEGIN_MESSAGE_MAP(CSampleDialog, CDialog)

ON_COMMAND(ID_CLOSE, OnClose)

ON_COMMAND(IDC_BUTTON1, OnAdd)

ON_COMMAND(IDC_BUTTON2, OnDelete)

ON_COMMAND(IDC_BUTTON3, OnClear)

ON_BN_CLICKED(IDC_CHECK1, OnCheck)

END_MESSAGE_MAP()

 

void CSampleDialog:: OnClose()

{SendMessage(WM_CLOSE); }

 

BOOL CSampleDialog:: OnInitDialog()

{CDialog:: OnInitDialog();

lb=(CListBox*)GetDlgItem(IDC_LIST1); // cписок

ed=(CEdit*)GetDlgItem(IDC_EDIT1); // поле редагування

bt_add=(CButton*)GetDlgItem(IDC_BUTTON1); // кнопка “Add”

bt_delete=(CButton*)GetDlgItem(IDC_BUTTON2); // кнопка “Delete”

bt_clear=(CButton*)GetDlgItem(IDC_BUTTON3); // кнопка “Clear”

cb=(CComboBox*)GetDlgItem(IDC_COMBO1); // комбінований список

ch1=(CButton*)GetDlgItem(IDC_CHECK1); // перемикач

ch1-> SetCheck(0);

OnCheck();

rb1=(CButton*)GetDlgItem(IDC_RADIO1); // cелекторна кнопка 1

rb2=(CButton*)GetDlgItem(IDC_RADIO2); // cелекторна кнопка 2

rb1-> SetCheck(1);

cb-> AddString(" Kharkiv");

return TRUE;

}

 

void CSampleDialog:: OnAdd()

{char a[50];

ed-> GetWindowText(a, sizeof(a));

if(rb1-> GetCheck())strcpy(_strupr(a), a);

int i=lb-> GetCurSel();

if(strlen(a)==0)MessageBox(" Задана пуста строка", " Error");

else {if(i==LB_ERR)lb-> AddString(a);

else lb-> InsertString(i, a); }

}

 

void CSampleDialog:: OnDelete()

{int i=lb-> GetCurSel();

if(i==LB_ERR)MessageBox(" Оберіть строку", " Error");

if(i! =LB_ERR)lb-> DeleteString(i);

}

 

void CSampleDialog:: OnClear()

{int i=lb-> GetCount();

for(int j=0; j< i+1; j++)lb-> DeleteString(0); }

 

void CSampleDialog:: OnCheck()

{if(! ch1-> GetCheck())

{bt_add-> EnableWindow(FALSE);

bt_clear-> EnableWindow(FALSE);

bt_delete-> EnableWindow(FALSE);

}

else {bt_add-> EnableWindow();

bt_clear-> EnableWindow();

bt_delete-> EnableWindow();

}}

 

3.5 Використання ClassWizard для створення програм із діалоговими вікнами

 

Visual C++ надає широкі можливості розробки програмного забезпечення. У тому числі вони містять і засоби автоматизації. Використовуючи програму MFC Application Wizard, можна побудувати програму на основі концепції “Документ – Вигляд”. Хоча ми, поки що цю концепцію не розглядаємо, окремі елементи автоматизації з успіхом можуть бути використанні при побудові проектів розглянутого вигляду.

За допомогою Class Wizard можна автоматизувати зв’язування ідентифікаторів елементів керування зі змінними, відповідними цим елементам керування. При цьому, необхідність використання механізмів функції GetDlgItem() відпадає, а текст програмного коду обміну буде сформовано автоматично.

Для формування проекту у новому вигляді, виконаємо таку послідовність:

1. Створюємо новий Win32 application проект – пустий “Empty project”.

2. Додаємо шаблон діалогового вікна у проект через меню Visual C++: Insert -> Resource -> Dialog. Розміщуємо елементи діалогового вікна відповідно рисунку 3.6

 

 

Рисунок 3.6 – Вигляду ресурсів проекту із діалоговим вікном

 

3. Зберігаємо файл ресурсів (Script1.rc).

4. Додаємо файл ресурсів до проекту: Project -> Add to project -> Files -> Script1.rc.

5. На шаблоні діалогового вікна натискуємо праву клавішу: обираємо Class Wizard – отримуємо запитання про існування бази даних проекту (існує чи ні, не існує) – створюємо її; пропонується обрати файли – ми нічого не обираємо й натискуємо ОК.

6. Система повідомляє: “IDD_DIALOG1 – новий ресурс, чи створити для нього новий клас? ” – створюємо новий клас.

7. Вводимо інформацію про ім’я нового класу: СSDialog - > OK.

8. У полі “Сlasses” опису проекту (у лівій частині робочого простору проекту) додаємо новий клас – клас прикладки САpp, виводимо його з CWinApp (краще в одному файлі з CSDialog – для запобігання подальших проблем зі знаходженням об’єктів).

9. У CАpp додаємо функцію BOOL InitInstance() записуємо:

 

BOOL CApp:: InitInstance()

{CSDialog a; a.DoModal(); return TRUE; }

 

10. У файлі SDialog.cpp змінюємо директиви

#include “stdafx.h” - на #include < afxwin.h>

#include “script1.h” - на #include “resource.h”

11. Додаємо СApp App; (створення об’єкта прикладки).

12. Змінюємо опції компілятора (використання MFC);

 

Після цього можна переходити до безпосередньо до використання Class Wizard. Class Wizard викликається натисканням правої клавіші миші на робочій площині проекту та вибором відповідного пункту “Class Wizard” з випадаючого меню. Class Wizard містить декілька сторінок. Перша з них відображає карту повідомлень і відображена на рисунку 3.7.

Як видно з рисунка 3.7, на сторінці “Message Map” можна обрати кнопки із ідентифікаторами IDC_BUTTON1, IDC_BUTTON2, IDC_BUTTON3 та за допомогою вибору повідомлень BN_CLICKED (натискання на клавішу), натиснувши кнопку “Add Function” додати функції, відповідні вибору кнопок.

За допомогою другої сторінки, можна задати змінні-члени класу діалогового вікна, відповідні списку та полю редагування. Вигляд другої сторінки Class Wizard наведено на рисунку 3.8. Для додавання змінної необхідно обрати ідентифікатор, відповідний елементу керування та, натиснувши кнопку „Add variable”, додати у клас діалогового вікна змінну для елемента керування.

Якщо змінні задані, а пусті функції-члени, відповідні натиснутим кнопкам „Add”, „Delete” та „Сlear” оголошені раніше, можна визначити код функцій OnButton1(), OnButton2(), OnButton3(), який наведено у прикладі 3.11.

Найбільш цікава ділянка коду – функція DoDataExchange(), яка формується автоматично. Саме у ній здійснюється взаємодія між елементами керування, зазначені ідентифікаторами IDC_EDIT1, IDC_EDIT1 та змінними-членами m_list1 та m_ed. Обмін здійснюється за допомогою функції DDX_Control(). Зазначимо, що карта повідомлень програми також сформована автоматично. Це додатково підкреслює переваги застосування Class Wizard.

Об’єкти m_list1 та m_ed і використовуються в усіх обробниках, відповідних натисканню кнопок „Add”, „Delete” та „Сlear”. Єдина різниця обробників цієї програми і обробників програми прикладу 3.10 полягає в тому, що більш рання програма використовувала покажчики на об’єкти, а ця – самі об’єкти.

 

 

Рисунок 3.7 – Сторінка карти повідомлень Class Wizard

 

Слід зауважити, що програма стала зрозумілою за умов вивчення всього попереднього матеріалу. Це вказує на доречність вивчення методів створення Visual C++ програм на основі використання MFC Application Wizard на більш пізніх етапах.

 

 

Рисунок 3.8 – Сторінка Class Wizard для визначення змінних-членів

Приклад 3.11 – Текст коду програми для роботи з діалоговим вікно, сформованої за допомогою Сlass Wizard

// SDialog.h:: header file

class CSDialog: public CDialog

{public: CSDialog(CWnd* pParent = NULL); // standard constructor

// Dialog Data

//{{AFX_DATA(CSDialog)

enum { IDD = IDD_DIALOG1 };

CEdit m_ed;

CListBox m_list1;

//}}AFX_DATA

// Overrides // ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CSDialog)

protected:

virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support

//}}AFX_VIRTUAL

// Implementation

protected:

// Generated message map functions

//{{AFX_MSG(CSDialog)

afx_msg void OnButton1();

afx_msg void OnButton2();

afx_msg void OnButton3();

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

 

class CApp: public CWinApp

{public: BOOL InitInstance();

CApp();

virtual ~CApp(); };

 

// SDialog.cpp: implementation file

#include < afxwin.h>

#include " resource.h"

#include " SDialog.h"

CSDialog:: CSDialog(CWnd* pParent /*=NULL*/): CDialog(CSDialog:: IDD, pParent)

{ //{{AFX_DATA_INIT(CSDialog)

//}}AFX_DATA_INIT

}

 

void CSDialog:: DoDataExchange(CDataExchange* pDX)

{ CDialog:: DoDataExchange(pDX);

//{{AFX_DATA_MAP(CSDialog)

DDX_Control(pDX, IDC_EDIT1, m_ed);

DDX_Control(pDX, IDC_LIST1, m_list1);

//}}AFX_DATA_MAP

}

 

BEGIN_MESSAGE_MAP(CSDialog, CDialog)

//{{AFX_MSG_MAP(CSDialog)

ON_BN_CLICKED(IDC_BUTTON1, OnButton1)

ON_BN_CLICKED(IDC_BUTTON2, OnButton2)

ON_BN_CLICKED(IDC_BUTTON3, OnButton3)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

 

CApp:: CApp(){}

CApp:: ~CApp(){}

 

 

BOOL CApp:: InitInstance() {CSDialog a;

a.DoModal();

return TRUE; }

 

CApp App;

 

void CSDialog:: OnButton1()

{ char ss[40];

m_ed.GetWindowText(ss, strlen(ss));

int i=m_list1.GetCurSel();

if(strlen(ss)==0)MessageBox(" You've set empty string", " Error");

else {if(i==LB_ERR)m_list1.AddString(ss);

else m_list1.InsertString(i, ss);

}}

 

void CSDialog:: OnButton2()

{ int i=m_list1.GetCurSel();

if(i==LB_ERR)MessageBox(" You need string selection", " Error");

if(i! =LB_ERR) m_list1.DeleteString(i);

}

 

void CSDialog:: OnButton3() {int i=m_list1.GetCount();

for(int j=0; j< i+1; j++)m_list1.DeleteString(0); }

 

3.6 Контрольні завдання

 

1. Пояснити відмінності у властивостях та порядку створення діалогових вікон модального та немодального типу.

2. Пояснити порядок створення та використання ресурсів у MFC-програмах.

3. Пояснити особливості обробки повідомлень діалогових вікон.

4. Пояснити можливість використання діалогового вікна як головного вікна програми.

5. Пояснити порядок ініціалізації стандартних елементів керування у діалогових вікнах.

6. Розробити MFC-програму, у якій діалогове вікно реалізувати головним вікном програми.

7. Розробити MFC-програму діалогового типу із реалізацією списку, поля редагування, кнопок додавання та вилучення елементів зі списку.

8. Розробити MFC-програму із реалізацією обробників вертикальної та горизонтальної смуг прокручування.

9. Розробити MFC-програму діалогового типу за допомогою програми Class Wizard із реалізацією списку, поля редагування, кнопок додавання та вилучення елементів зі списку, контрольних перемикачів та селекторних кнопок.

 

 


4 РОБОТА з ГРАФІКОЮ ТА ТЕКСТОМ

4.1 Визначення піктограм, курсорів, пензлів оформлення вікна

 

4.1.1 Загальна інформація

Піктограми (іконки), курсори та растрові зображення є ресурсами, що містять графічну інформацію. Вони можуть бути створюватися за допомогою графічного редактора або редактора ресурсів Visual C++. Після створення ці ресурси мають бути включені у відповідний файл ресурсів і завантажені до програми.

Курсори мають стандартний розмір 32x32 пікселя. Піктограми – 32x32 (стандартна піктограма) і 16x16 (маленька). Маленька піктограма не підтримується у старих версіях Windows 3.xx.

 

4.1.2 Реєстрація піктограм і курсорів

Як зазначувалося у визначенні прототипу функції Create() класу СFrameWnd, першим параметром цієї функції йде клас вікна СlassName. Якщо за основу оформлення приймаються стандартні стилі, у значенні ClassName вказується NULL. ClassName не є ім’ям класу у стандартному розумінні C++, скоріше це набір параметрів, що формують єдиний клас оформлення вікна.

Для формування класу оформлення у MFC-програмах використовується WinAPI-функція із таким прототипом:

 

LPCSTR AFXAPI AfxRegisterWndClass(UINT Style, HCURSOR hCur=0,

HBRUSH hBrush=0, HICOPN hIcon=0);

 

де hCur – дескриптор курсору, hBrush – дескриптор пензля, hIcon – дескриптор піктограми. Як видно з прототипу, після успішного завершення функція повертає рядковий опис (типу LPCSTR) класу оформлення вікна. Далі залишається передати отриманий клас оформлення у перший параметр функції Create(), яка, власне, виконує основну роботу конструктора головного вікна програми.

 

4.1.3 Завантаження піктограм та курсорів

Для використання піктограм та курсорів, їх спочатку слід завантажити. Завантаження в основному пов’язується із визначенням необхідних ресурсів. У MFC існує ряд функцій, які забезпечують вирішення зазначених завдань. Зокрема завантаження піктограм забезпечує функція LoadIcon(), її прототипи:

 

HICON CWinApp:: LoadIcon(LPCTSTR lpszResourceName);

HICON CWinApp:: LoadIcon(UINT nIDResource);

 

де lpszResourceName – рядковий опис ресурсу піктограми, nIDResource - ідентифікатор ресурсу піктограми. Таким чином, можна створити певне зображення піктограми у редакторі ресурсів, зберегти її із ідентифікатором, наприклад IDI_ICON1 і завантажити у дескриптор піктограми:

HICON MyIcon = LoadIcon(IDI_ICON1);

Аналогічною є ситуація для курсорів. Для них існують такі функції:

HCURSOR CWinApp:: LoadCursor(LPCTSTR lpszResourceName);

HCURSOR CWinApp:: LoadCursor(UINT nIDResource);

де також lpszResourceName – рядковий опис ресурсу курсору, nIDResource ідентифікатор ресурсу створено користувачем курсору. Якщо створений курсор має ідентифікатор IDC_CURSOR1, можемо завантажити його у такий спосіб:

HCURSOR MyCursor = LoadCursor(IDC_CURSOR1);

Окрім створюваних власноруч піктограм та ресурсів, можна використовувати декілька стандартних. Завантаження стандартних елементів оформлення забезпечують такі функції:

 

HICON CWinApp:: LoadStandardIcon(LPCTSTR lpszResourceName);

HICON CWinApp:: LoadStandardIcon(UINT nIDResource);

HCURSOR CWinApp:: LoadStandardCursor(LPCTSTR lpszResourceName);

HCURSOR CWinApp:: LoadStandardCursor(UINT nIDResource);

 

До стандартних піктограм належать:

IDI_APPLICATION – стандартна системна піктограма;

IDI_ASTERISK – інформаційна піктограма із позначкою “i”;

IDI_EXCLAMATION – піктограма із знаком оклику “! ”;

IDI_HAND – піктограма із надписом “Stop”;

IDI_QUESTION – піктограма із знаком питання “? ”.

Вбудованими курсорами є:

IDC_ARROW – стандартний курсор у вигляді стрілки;

IDC_CROSS – курсор у вигляді перехрестя;

IDC_IBEAM – курсор текстового редактора;

IDC_WAIT – курсор у вигляді пісочного годинника.

 

4.1.4 Визначення пензлів

Пензлі подаються за допомогою об’єктів класу CBrush. Після реєстрації класу вікна стиль пензля визначатиме заповнення фону робочої області вікна. При цьому може використовуватися стандартний пензель або пензель, створений користувачем.

Стандартні пензлі завантажуються за допомогою функції CreateStockObject():

BOOL CGDIObject:: CreateStockObject(int nIndex);

де параметр nIndex може приймати такі значення:

BLACK_BRUSH – пензель чорного кольору;

DKGRAY_BRUSH – темно-сірий пензель;

LTGRAY_BRUSH – світло-сірий пензель;

WHITE_BRUSH – білий пензель;

HOLLOW_BRUSH – прозорий пензель.

У разі використання прозорого пензля у фонове зображення вікна копіюється поточний фон, тобто ним може бути зображення робочого столу користувача, робочий простір Visual C++ та інші зображення. На жаль, при переміщенні вікна програми фонове зображення може зіпсуватися.

Приклад завантаження пензля:

СBrush userBrush;

userBrush.CreateStockObject(LTGREY_BRUSH);

Якщо ж користувач хоче створити власний пензель, він може використати функцію CreateSolidBrush():

 

BOOL CBrush:: CreateSolidBrush(COLORREF crColor);

 

де колір crColor визначатиметься у форматі RGB. Детальніше про цей спосіб – у наступному розділі.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.