Главная страница Случайная страница Разделы сайта АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
💸 Как сделать бизнес проще, а карман толще?
Тот, кто работает в сфере услуг, знает — без ведения записи клиентов никуда. Мало того, что нужно видеть свое раписание, но и напоминать клиентам о визитах тоже.
Проблема в том, что средняя цена по рынку за такой сервис — 800 руб/мес или почти 15 000 руб за год. И это минимальный функционал.
Нашли самый бюджетный и оптимальный вариант: сервис VisitTime.⚡️ Для новых пользователей первый месяц бесплатно. А далее 290 руб/мес, это в 3 раза дешевле аналогов. За эту цену доступен весь функционал: напоминание о визитах, чаевые, предоплаты, общение с клиентами, переносы записей и так далее. ✅ Уйма гибких настроек, которые помогут вам зарабатывать больше и забыть про чувство «что-то мне нужно было сделать». Сомневаетесь? нажмите на текст, запустите чат-бота и убедитесь во всем сами! Спільні елементи керування 1 страница
5.1 Загальна інформація про спільні елементи керування Раніше згадувалося, що існують три типи елементів керування: стандартні, спільні та елементи керування ActiveX. Створення стандартних елементів керування розглядалося у розділі 3. Стандартні елементи керування суттєво поліпшують інтерфейс програм, розроблених для операційної системи Windows. Але стандартні елементи керування є лише початковим етапом розвитку програмних інтерфейсів. Їх подальший розвиток припав на появу операційної системи Windows’95, коли з’явилися спільні елементи керування. Ці нові елементи керування підтримуються MFC, починаючи з версії 4.0 Спільні елементи керування є розвитком стандартних елементів, вони додають нових, більш розширених можливостей, надають гнучкості програмі, роблять її більш привабливою з точки зору користувача. У таблиці 5.1 наведені спільні елементи керування відповідно Visual C++ 6.0.
Таблиця 5.1 – Спільні елементи керування
Перелічені елементи керування називаються спільними (common controls), тому що використовуються багатьма програмними додатками операційної системи Windows. Можна із упевненістю сказати, що з багатьма з них ви користуєтесь. Опис класів, відповідних спільним елементам керування та усіх функцій знаходиться у заголовочному файлі afxcmn.h. Таким чином усі програми зі спільними елементами керування містять таку директиву препроцесора:
#include < afxcmn.h>
Для ініціалізації загальних елементів керування також необхідно викликати API-функцію ініціалізації загальних елементів керування:
void InitCommonControls(VOID);
Усі спільні елементи керування є, за походженням, вікнами дочірнього типу, які наслідують властивості класу CWnd. Тому не випадково, що як буде видно надалі, усі спільні елементи керування можна створити функцією Create(). З іншого боку, при розміщенні ресурсів спільних елементів керування у шаблонах діалогових вікон, пов’язування із об’єктами відповідних класів відбувається так само, як і для стандартних елементів керування. 5.2 Використання панелей інструментів
5.2.1 Порядок створення панелі інструментів Серед спільних елементів керування, можливо, найбільш широко вико-ристовується панель інструментів. Панель інструментів є прямокутним дочірнім вікном, що містить одну чи більше кнопок з графічними зображеннями. Кнопки можуть займати декілька рядків у вікні програми. Коли користувач обирає кнопку панелі інструментів, програмі надсилається повідомлення. Як правило, кнопки панелі відповідають пунктам меню програми і, таким чином, забезпечують більш простий і візуально привабливий шлях вибору команд програми. На рисунку 5.1 зображено приклад панелі інструментів, взятої з програми Microsoft Word.
Рисунок 5.1 – Фрагмент панелі інструментів програми Microsoft Word
У MFC панель інструментів описується за допомогою класу CToolBarCtrl. CToolBarCtrl забезпечує функціональні можливості панелі інструментів. Вперше панелі інструментів (як і сам клас CToolBarCtrl) з’явилися з появою Windows’95 та Windows NT 3.51. Об’єкти класу CToolBarCtrl містять декілька важливих структур даних: список зображень кнопок, їх текстових полів, список структур TBBUTTON, що об’єднує разом зображення, текстові поля, а також позицію, стан та ідентифікатор кнопки. При цьому кожна кнопка має індекс, відмінний від 0. Для використання ПІ слід достримуватися такої послідовності дій: 1) оголосити об’єкт класу CToolBarCtrl у класі відповідного вікна; 2) створити графічне зображення панелі інструментів у редакторі ресурсів Visual C++; 3) за допомогою функції Create() зв’язати графічний ресурс панелі інструментів із відповідним об’єктом або пов’язати їх у спосіб, характерний для стандартних елементів керування діалогового вікна; 4) здійснити ініціалізацію структур TBBUTTON панелі інструментів та додати їх у панель за допомогою функції AddButtons(); 5) додати зображення кнопок за допомогою функції AddBitmap(); 6) за необхідністю організувати обробку повідомлень спливаючих підказок. Створення панелі інструментів (ПІ) у діалоговому вікна забезпечується за допомогою функції Create(), що має такий прототип:
BOOL CToolBarCtrl:: Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID);
де dwStyle визначає стиль вікна панелі інструментів (зазначені у таблиці 5.2); rect – визначає розмір та положення панелі інструментів (має тип CRect); pParentWnd – покажчик на вікно-власник панелі інструментів; nID – іденти-фікатор панелі інструментів.
Таблиця 5.2 – Основні стилі визначення панелі інструментів
При побудові панелі інструментів її розміри встановлюються автоматично відповідно до кількості кнопок у самій панелі та розміру батьківського вікна.
5.2.2 Додавання кнопок у панель інструментів Панель інструментів, створена функцією Create() не є ініціалізованою і не може використовуватися. Для застосування панелі інструментів тепер слід створити графічний ресурс панелі; ініціалізувати структури TBBUTTON, відповідні кнопкам; додати визначені кнопки у панель інструментів; додати зображення кнопок панелі інструментів. Додавання кнопок у панель інструментів забезпечує функція AddButtons() із таким прототипом:
BOOL CToolBarCtrl:: AddButtons (int nNumButtons, LPTBBUTTON lpButtons);
її параметрами є: nNumButtons – кількість кнопок, що додається у панель; lpButtons – покажчик на масив типу TBBUTTON, який складається зі структур з інформацію про кнопки, які додаються у панель інструментів. Розмір масиву має співпадати з параметром nNumButtons. Із кожною кнопкою пов’язується об’єкт структури TBBUTTON, яка містить інформацію про індекс зображення, ідентифікатор кнопки, стиль оформлення та початковий стан. Структура TBBUTTON має такий вигляд:
typedef struct _TBBUTTON { int iBitmap; // індекс зображення кнопки (> 0) int idCommand; // ідентифікатор програми, відповідний натиску кнопки BYTE fsState; // початковий стан кнопки BYTE fsStyle; // стиль кнопки DWORD dwData; // параметр, що визначається користувачем int iString; // індекс рядка кнопки} TBBUTTON;
Додатково до опису зазначимо: - iBitmap є індексом зображення кнопки і відраховується від 0, значення NULL означає відсутність зображення; - idCommand є ідентифікатором команди програми, позв'язаної з кнопкою; якщо кнопка натиснута – надсилається повідомлення WM_COMMAND, якщо кнопка має стиль TBSTYLE_SEP idCommand задається рівним 0; - fsState визначає початковий стан кнопки, який може бути комбінацією таких значень, наведених у таблиці 5.3; - fsStyle визначає стиль кнопки відповідно до таблиці 5.4.
Таблиця 5.3 – Визначення початкових станів кнопок
Таблиця 5.4 – Визначення стилів кнопок
5.2.3 Додавання зображень до кнопок панелі інструментів Зображення кнопок панелі інструментів додаються за допомогою функції AddBitmap(). При цьому одна кнопка має повний розмір 24x22 пікселі, а графічне зображення кнопки – 16x15 пікселі. Зображення кнопок не зберігаються по-одинці, а містяться у єдиному файлі toolbar.bmp, що зберігає зображення усіх кнопок. Наприклад, шість кнопок мають розмір 16x6 = 96 пікселів. Функції додавання кнопок мають такі прототипи:
int CToolBarCtrl:: AddBitmap(int nNumButtons, UINT nBitmapID); int CToolBarCtrl:: AddBitmap(int nNumButtons, CBitmap* pBitmap);
У разі успішного виконання, обидві функції повертають індекс першого зображення. Параметрами функції є такі: nNumButtons – кількість кнопок у файлі зображень; nBitmapID – ідентифікатор ресурсу растрового зображення кнопок; pBitmap – покажчик на об’єкт типу CBitmap, що містить зображення кнопок. 5.2.4 Додаткові функції роботи з панелями інструментів Після того, як панель інструментів ініціалізовано, її розмір встановлюється відповідно до розміру батьківського вікна. Але, якщо змінити розміри вікна, розмір панелі інструментів не зміниться. Цю проблему можна вирішити за допомогою функції AutoSize():
void CToolBarCtrl:: AutoSize();
Стан окремої кнопки ПІ встановлюється за допомогою функції PressButton(): BOOL CToolBarCtrl:: PressButton(int nID, BOOL bPress = TRUE);
де nID – номер кнопки, що необхідно натиснути або відпустити; bPress= TRUE означає натискування зазначеної кнопки, bPress=FALSE – її вивільнення. Перевірка стану кнопки забезпечує функція CheckButton():
BOOL CheckButton(int nID, BOOL bCheck = TRUE);
де nID - номер кнопки, стан якої перевіряється; bCheck – стан, який перевіряється (може приймати значення TRUE або FALSE). Для приховання кнопки можна використати функцію HideButton():
BOOL CToolBarCtrl:: HideButton(int nID, BOOL bHide = TRUE); де nID – номер кнопки, що необхідно заховати, bHide – ознака, яка має значення TRUE, якщо кнопку необхідно приховати, FALSE – якщо показати. Активація та деактивація кнопок реалізується функцією EnableButton():
BOOL CToolBarCtrl:: EnableButton(int nID, BOOL bEnable = TRUE);
де nID – номер кнопки, що необхідно активізувати (деактивізувати); bEnable має значення TRUE, якщо кнопку активізують; FALSE - якщо відключають.
5.2.5 Розробка програми із використанням панелі інструментів Для роботи з панеллю інструментів необхідно дотримуватися такої послідовності дій: 1. У редакторі ресурсів створити зображення кнопок панелі інструментів, зафіксувати ідентифікатор (наприклад IDR_TOOLBAR1 – значення за замовчуванням); 2. У класі головного вікна програми оголосити об’єкт панелі інструментів: сlass CMainWin:: public CFrameWnd { CToolBarCtrl m_TB; // об’єкт панелі інструментів public: void OnSize(UINT How, int Width, int Height); ………… void InitToolBar(); };
3. У тест програми додати директиву препроцесора для підключення спільних елементів керування: #include < afxcmn.h>
4. Оголосити глобальним масив структур tbButton[3]:
TBBUTTON tbButton[2]; // масив панелі інструментів із трьох кнопок
5. Видозмінити конструктор класу головного вікна у такий вигляд:
CMainWin:: CMainWin() {…….. InitCommonControls(); // ініціалізація спільних елементів керування void InitToolBar(); // ініціалізація панелі інструментів void OnShow(); // обробник показу панелі інструментів void OnHide(); // обробник приховання панелі інструментів } 6. У карту повідомлень додати макрокоманди: ON_WM_PAINT() ON_WM_SIZE() ON_COMMAND(ID_SHOWTB, OnShow) ON_COMMAND(ID_HIDETB, OnHide) 7. Описати обробник зміни розміру панелі інструментів: void CMainWin:: OnSize(UINT How, int Width, int Height) {m_TB.AutoSize(); } 8. Описати обробник відображення панелі інструментів: void CMainWin:: OnShow() {m_TB.ShowWindow(SW_RESTORE); } 9. Описати обробник приховання панелі інструментів: void CMainWin:: OnShow() {m_TB.ShowWindow(SW_HIDE); } 10. Описати функцію ініціалізації панелі інструментів:
void CMainWin:: InitToolBar() {RECT r; r.left=r.top=r.right=r.bottom=0; m_TB.Create(WS_VISIBLE | WS_CHILD | WS_BORDER, r, this, IDR_TOOLBAR1); tbButton[0].iBitmap=0; tbButton[0].idCommand=ID_FIRST; tbButton[0].fsState=TBSTATE_ENABLED; tbButton[0].fsStyle=TBSTYLE_BUTTON; tbButton[0].dwData=0; tbButton[0].iString=0; tbButton[1].iBitmap=1; tbButton[1].idCommand=ID_SECOND; tbButton[1].fsState=TBSTATE_ENABLED; tbButton[1].fsStyle=TBSTYLE_CHECK; tbButton[1].dwData=0; tbButton[1].iString=0; m_TB.AddButtons(2, tbButton); // додавання масиву кнопки у панель інструментів m_TB.AddBitmap(2, IDR_TOOLBAR1); // додавання зображень }
5.3 Створення спливаючих підказок панелей інструментів
Кожен користувач системи Windows напевно помічав, як під час наведення курсора миші на окремі елементи інтерфейсу з’являлися невеличкі ін-формаційні віконця, що містять текст із описом властивості елемента, на який наведено курсор. На рисунку 5.2 зображено приклади спливаючих підказок.
Рисунок 5.2 − Приклади відображення спливаючих підказок
Спливаючі підказки не є обов’язковими з технічної точки зору, але необхідними для реалізації сучасного інтерфейсу програми, для надання додаткової інформації для користувача. Якщо спливаючі підказки реалізовані у програмі і курсор миші знаходиться більше 0.5 секунди над елементом, для якого створено підказку, програмі надсилається повідомлення WM_NOTIFY. Це повідомлення обробляється макрокомандою ON_NOTIFY() та її різновидом ON_NOTIFY_RANGE(). Остання макрокоманда забезпечує обробку повідомлень від набору однотипних елементів керування, що як раз підходить для організації спливаючих підказок панелі інструментів. Макрокоманда ON_NOTIFY_RANGE() має такий прототип:
ON_NOTIFY_RANGE(wNotifyCode, id, idLast, OnTTipHandler)
де wNotifyCode – код повідомлення нотифікації, що для спливаючої підказки матиме вигляд TTN_NEEDTEXT; id – перший ідентифікатор у діапазоні ідентифікаторів; idLast – останній ідентифікатор діапазону; OnTTipHandler – ім’я обробника, що викликається у відповідь на повідомлення нотифікації. Прототип обробника має вигляд:
void OnTTipHandler (UINT idNotUsed, NMHDR * Hdr, LRESULT * resultNotUsed);
де idNotUsed – ідентифікатор, пов’язаний з повідомленням WM_NOTIFY (ос-кільки не є унікальним – не використовується); Hdr – спеціальний параметр типу NMHDR, що містить інформацію про повідомлення нотифікації; resultNotUsed – також не використовується. В принципі, обробка повідомлень спливаючих підказок не виглядає складною, однак шлях встановлення підказки для кожного окремого елемента є не таким простим. Перш за все повідомимо про тип NMHDR: typedef struct tagNMHDR { HWND hwndFrom; // дескриптор вікна, який надіслав повідомленняUINT idFrom; // ідентифікатор елемента, який надіслав повідомлення UINT code; // код нотифікації (зазначені у таблиці 5.5).} NMHDR;Елемент типу NMHDR у свою чергу входить до структури TOOLTIPTEXT:
typedef struct { NMHDR hdr; LPTSTR lpszText; WCHAR szText[80]; HINSTANCE hinst; UINT uflags; } TOOLTIPTEXT, FAR *LPTOOLTIPTEXT;
Таблиця 5.5 – Визначення стилів кнопок панелі інструментів
Параметрами структури TOOLTIPTEXT є: hdr – спеціальна структура, яка дозволяє передати покажчик на структуру TOOLTIPTEXT як параметр повідомлення WM_NOTIFY; lpszText – покажчик на рядок, що містить текст підказки елемента керування; szText – буфер, який отримує текст підказки; hInst – дескриптор об’єкта, який містить рядок ресурсу, що використовується як під-казка; uflags – прапорець, що вказує спосіб інтерпретації параметра idFrom структури NMHDR. Таким чином, якщо для панелі інструментів необхідно створити спливаючі підказки, у програму слід внести такі зміни: 1. Під час створення об’єкта панелі інструментів зазначити стиль TBSTYLE_TOOLTIPS підтримки спливаючих підказок:
m_TB.Create(WS_VISIBLE | WS_CHILD | TBSTYLE_TOOLTIPS, r, this, IDR_TOOLBAR1);
2. У черзі повідомлень головного вікна програми зазначити макрокоманду обробки повідомлень нотифікації для спливаючих підказок:
ON_NOTIFY_RANGE(TTN_NEEDTEXT, 0, IDR_TOOLBAR1, OnTTip)
3. У відповідному класі головного вікна спочатку оголосити прототип, а потім і реалізувати код обробника OnTTip(), який наведено у прикладі 5.1.
Приклад 5.1 – Обробник повідомлень спливаючих підказок void CMainWin:: OnTTip(UINT idNotUsed, NMHDR *hdr, LRESULT *ResultNotUsed) {switch(hdr-> idFrom) {case ID_FIRST_EXIT: ((TOOLTIPTEXT *)hdr)-> lpszText=" Exit"; break; case ID_SECOND_MESSAGE: ((TOOLTIPTEXT *)hdr)-> lpszText=" SECOND MESSAGE"; break; }}
Увесь текст програми із використанням панелі інструментів наведений у прикладі 5.2, а результат виконання – на рисунку 5.3.
Приклад 5.2 – Текст програми із панеллю інструментів
// main.h class CMain: public CFrameWnd {public: void OnFirst(); void OnTTip(UINT idNotUsed, NMHDR *hdr, LRESULT *ResultNotUsed); void InitToolBar(); void OnExit(); CMain(); DECLARE_MESSAGE_MAP() private: CToolBarCtrl m_TB; };
class CApp: public CWinApp {public: BOOL InitInstance(); }; // main.app #include < afxwin.h> #include < afxcmn.h> #include " Main.h" #include " resource.h"
CMain:: CMain() {Create(NULL, " Example with toolbar", WS_OVERLAPPEDWINDOW, rectDefault, NULL, MAKEINTRESOURCE(IDR_MENU1)); RECT a; a.bottom=a.left=a.right=a.top=0; InitCommonControls(); m_TB.Create(WS_CHILD|WS_VISIBLE|WS_BORDER|CCS_TOP| TBSTYLE_TOOLTIPS, a, this, IDR_TOOLBAR1); InitToolBar(); }
BEGIN_MESSAGE_MAP(CMain, CFrameWnd) ON_COMMAND(ID_FILE_FIRST, OnFirst) ON_COMMAND(ID_FILE_EXIT, OnExit) ON_NOTIFY_RANGE(TTN_NEEDTEXT, 0, IDR_TOOLBAR1, OnTTip) END_MESSAGE_MAP()
BOOL CApp:: InitInstance() {m_pMainWnd = new CMain; m_pMainWnd-> ShowWindow(m_nCmdShow); m_pMainWnd-> UpdateWindow(); return TRUE; }
CApp App;
void CMain:: OnExit() {int r=MessageBox(" You really want to Exit", " Exit", MB_YESNO | MB_ICONEXCLAMATION); if(r==IDYES)SendMessage(WM_CLOSE); } void CMain:: InitToolBar() {TBBUTTON tb[2]; tb[0].iBitmap=0; tb[0].idCommand=ID_FILE_EXIT; tb[0].fsState=TBSTATE_ENABLED; tb[0].fsStyle=TBSTYLE_BUTTON; tb[0].dwData=0; tb[0].iString=0;
tb[1].iBitmap=1; tb[1].idCommand=ID_FILE_FIRST; tb[1].fsState=TBSTATE_ENABLED; tb[1].fsStyle=TBSTYLE_BUTTON; tb[1].dwData=0; tb[1].iString=0; m_TB.AddButtons(2, tb); m_TB.AddBitmap(2, IDR_TOOLBAR1); }
void CMain:: OnTTip(UINT idNotUsed, NMHDR *hdr, LRESULT *ResultNotUsed) { switch(hdr-> idFrom) {case ID_FILE_EXIT: ((TOOLTIPTEXT*)hdr)-> lpszText=" Exit"; break; case ID_FILE_FIRST: ((TOOLTIPTEXT*)hdr)-> lpszText=" First"; break; }}
void CMain:: OnFirst() {MessageBox(" First item"); }
Рисунок 5.3 – Вигляд вікна програми із панеллю інструментів
5.4 Елемент стрілка та робота з ним Під час створення MFC-програм доволі часто необхідно встановлювати та змінювати поточні параметри. Якщо ці параметри мають цілий числовий тип, можна скористатися спеціальним спільним елементом керування, що має назву spin або стрілка. Його зовнішній вигляд демонструє рисунок 5.4. Цей елемент власне, є смугою прокрутки, у якій вилучена сама смуга і залишені лише дві кнопки: «вгору» і «вниз». За допомогою цих кнопок користувач має змогу змінювати поточний стан стрілки і, таким чином, змінювати значення певного параметра програми. Стрілка має певний обмежений діапазон змін, що може визначатися програмно.
Рисунок 5.4 – Використання стрілки у програмі встановлення часу. Стрілка розташована праворуч. Текст «2004» міститься у приятельському вікні стрілки
Стрілка може використовуватися із додатковим елементом відображення інформації про її стан – спеціальним приятельським вікном. Саме воно відображує поточне положення стрілки. У MFC стрілка подається за допомогою класу CSpinButtonCtrl. Зазвичай оголошення об’єкта розташовується в межах класу відповідного вікна, наприклад діалогового вікна, як це наведено у прикладі 5.3.
Приклад 5.3 – Оголошення класу зі стрілкою class CSDialog: public CDialog {public: void OnVScroll(UINT SBCode, UINT Pos, CScrollBar *SB); BOOL OnInitDialog(); CSDialog(UINT id, CWnd *Owner): CDialog(id, Owner){} DECLARE_MESSAGE_MAP() private: CEdit *edd2; CSpinButtonCtrl m_Spin; // оголошення стрілки };
Окрім оголошення, стрілку необхідно фізично створити. Для цього, як і раніше, використовується функція CSpinButtonCtrl:: Create():
BOOL CSpinButtonCtrl:: Create(DWORD dwStyle, RECT& rect, CWnd* pParentWnd, UINT nID);
де параметр dwStyle визначає стиль стрілки, rect – її положення та розмір, pParentWnd є покажчиком на батьківське вікно, nID – ідентифікатор. Найбільш різнобічним є визначення стилю. Окрім стандартних стилів WS_CHILD, WS_VISIBLE, WS_BORDER визначаються додаткові (таблиця 5.6).
Таблиця 5.6 – Визначення стилів кнопок
Приятельським вікном виступає поле редагування. У такому полі користувач може записати необхідне значення. Підключення приятельського вікна здійснюється функцією SetBuddy() (англійською “Buddy” є приятель):
CWnd* CSpinButtonCtrl:: SetBuddy(CWnd* pWndBuddy);
де pWndBuddy є покажчиком на приятельське вікно. Функція повертає покажчик на можливого попереднього «приятеля». Клас CSpinButtonCtrl також має й ряд інших необхідних функцій. Зміна діапазону значень стрілки може здійснюватися за допомогою функції SetRange() класу CSpinButtonCtrl:
void CSpinButtonCtrl:: SetRange(int nLower, int nUpper);
де nLower, та nUpper – нижня та верхня межі діапазону стрілки, відповідно. За замовчуванням стрілка має діапазон значень від 0 до 100. Ніщо не заперечує проти встановлення негативних значень діапазону.
|