69272

Створення і маніпулювання панелями інструментів

Лекция

Информатика, кибернетика и программирование

Оскільки панелі інструментів займають дорогоцінний екранний простір вони повинні містити лише найбільш часто використовувані команди. У достатньо великих застосуваннях для вирішення різних завдань застосовується декілька різних панелей інструментів.

Украинкский

2014-10-02

58 KB

0 чел.

Лекція № 14

Тема: Створення і маніпулювання панелями інструментів

План

  1.  Створення і ініціалізація панелі інструментів
  2.  Закріплені і плаваючі панелі
  3.  Відображення і заховання панелі інструментів
  4.  Додавання спливаючих підказок і тексту рядка стану
  5.  Додавання елементів управління, відмінних від кнопок
  6.  Оновлення елементів управління, відмінних від кнопок

Створення і ініціалізація панелі інструментів

Панелі інструментів (toolbar) надають користувачам прямий доступ до команд додатку. Замість того, щоб ритися в меню або в пам'яті, намагаючись пригадати потрібну комбінацію клавіш, досить клацнути на відповідній кнопці панелі інструментів що входить до складу призначеного для користувача інтерфейсу. Оскільки панелі інструментів займають дорогоцінний екранний простір, вони повинні містити лише найбільш часто використовувані команди. У достатньо великих застосуваннях для вирішення різних завдань застосовується декілька різних панелей інструментів. Навіть якщо створюване застосування має тільки одну панель інструментів, все одно має сенс передбачити спосіб, що дозволяє користувачеві видалити її з екрану.

З програмної точки зору панель інструментів — це дочірнє вікно, що володіє поряд кнопок з малюнками на поверхні. Створивши панель інструментів і зробивши її видимою, про останнє можна не турбуватися, оскільки вона генерує ті ж самі повідомлення (WM_COMMAND), що і меню і акселератори (комбінації клавіш). Проте, ідентифікатори команд панелі інструментів повинні співпадати з ідентифікаторами команд меню і акселераторів.

У приведених нижче розділах розглянутий ряд питань, пов'язаних з розробкою панелей інструментів. Спочатку описано місце панелей інструментів в ієрархії MFC, а потім ряд інших, складніших питань, зв'язаних з використанням панелей інструментів, включаючи їх динамічне створення і зміну.

Створення панелі інструментів — це процес з п'яти етапів.

1. Спочатку необхідно завантажити растрове зображення, що містить всі малюнки кнопок. Зображення необхідно зберегти як растровий ресурс, тому відкрийте файл ресурсів створюваного проекту (.RC) і за допомогою графічного редактора створіть зображення для кнопок. За умовчанням прийнятий розмір зображення 16 пікселів шириною і 15 пікселів заввишки. Коли майстер AppWizard створює стандартний проект додатку MFC, що володіє панеллю інструментів, він використовує для неї растрові зображення, що розміщуються в каталозі \res даного проекту. Використання зображень, розміри яких відрізняються від прийнятих за умовчанням, цілком можливо, але про це необхідно повідомити об'єкт панелі інструментів за допомогою функції CToolBar : : SetSizes.

2. Визначите масив код команд (command code), які пов'яжуть зображення кнопок з ідентифікаторами команд. Як показано в приведеному нижче прикладі, це масив цілих беззнакових чисел (тип UINT):

// Кнопки панелі - ідентифікатори команд

static UINT BASED_CODE buttons[] =

{

// Порядок такий же, як і в растровому

// зображенні 'bitmap1.bmp'

ID_TOOLBAR_CREATE,

ID_SEPARATOR,

ID_TOOLBAR_SHOW

};

Два ідентифікатори ID_TOOLBAR_CREATE і ID_TOOLBAR_SHOW— це власне коди команд, а елемент ID_SEPARATOR— це ідентифікатор роздільника, що додає невеликий інтервал між двома кнопками.

3. Створіть і ініціалізуйте об'єкт панелі інструментів. Подібно до будь-яких інших вікон, спочатку створюється сам об'єкт панелі інструментів, а потім здійснюється його ініціалізація за допомогою виклику відповідної функції:

// Отримати екземпляр об'єкту C++ і створити вікно.

m_wndToolbar = new CToolBar ();

m__wndToolbar.Create (this, WS_CHILD | CBRS_TOP, 0x9100);

Функція ініціалізації Create класу CToolBar перевизначає однойменну функцію базового класу CWnd. Подібно до об'єктів вікон інших типів панель інструментів володіє полем стилю, що дозволяє встановити декілька атрибутів, що визначають зовнішній вигляд і поведінку панелі. До прапорів стилю, наприклад, відносяться WS_CHILDH CBRS_TOP. Прапор WS_CHILD встановлює для панелі інструментів стандартний стиль поведінки дочірнього вікна, для якого за допомогою покажчика this вказано батьківське вікно. Прапор CBRS_TOP встановлює стиль, специфічний для панелей управління, який визначає місце розміщення панелі (в даному випадку вверху фреймового вікна). Список найбільш корисних прапорів стилю приведений в таб.

4. Нанесіть зображення на поверхню кнопок панелі інструментів. Для цього приміняється функція CToolBar: :LoadBitmap:

m__wndToolbar.LoadBitmap (IDR_TOOLS) ;

 5. Крім того, з кнопками необхідно асоціювати ідентифікатори команд. Для цього досить викликати функцію CToolBar::SetButtons, передавши їй масив ідентифікаторів ресурсів кнопок, а також кількість кнопок, що підлягають установці:

m_wndToolbar.SetButtons(buttons, sizeof(buttons) /sizeof(UINT));

Отже, панель інструментів закінчена. Якщо всі вищеописані інструкції виконані правильно, то повинна вийти панель інструментів, що відображає декілька кнопок із зображеннями з файлу ресурсу додатку. Тепер можна зробити наступні дії. що дозволяють перенастроювати поведінку створюваної панелі інструментів.

Таблиця. Константи CToolBar::Create

прапор  Опис

WS_VISIBLE Робить вікно панелі інструментів видимим

CBRS_BOTTOM Поміщає панель управління внизу фреймового вікна

CBRS__FLYBY Вирішує відображення опису команди у вікні стану, коли курсор миші знаходиться над кнопкою панелі інструментів

CBRS__NOALIGN Запобігає переміщенню панелі управління при зміні розмірів її батьківського вікна

CBRS_TOOLTIPS Вирішує відображення спливаючої підказки, коли курсор миші знаходиться над кнопкою панелі інструментів

CBRS_TOP  Поміщає панель управління вверху фреймового вікна

Закріплені і плаваючі панелі

За умовчанням положення панелі інструментів класу CToolBar можна змінити тільки програмно. Але можна дозволити користувачам самостійно переміщати панель інструментів і розташовувати її в інших частинах фреймового вікна. Про те, що така можливість дозволена, необхідно повідомити як панель інструментів, так і фреймове вікно. Для цього необхідно викликати функції CToolBar::EnableDocking і CFrameWnd::EnableDocking таким чином:

m_wndToolbar.EnableDocking(CBRS_ALIGN_ANY);

EnableDocking(CBRS_ALIGN_ANY);

Користувач може самостійно закріпити панель інструментів або залишити її плаваючим. Для програмного закріплення панелі інструментів можна скористатися функцією CFrameWnd: : DockControlBar, а щоб зробити її плаваючою — функцією CFrameWnd: FloatControlBar. Створена і закріплена біля однієї з рамок фреймового вікна панель інструментів цілком працездатна, і робити з нею більше вже нічого не потрібно, хіба що можна організувати її заховання і відновлення на вимогу. Саме ця тема і обговорюється в наступному розділі.

Відображення і заховання панелі інструментів

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

Перш ніж приховувати або відображати панель інструментів, слід з'ясувати її поточний стан (отображена/скрыта). Інформацію про видимість панелі інструментів містить прапор WS_VISIBLE стилю її вікна. Для цього за допомогою функції CWnd::GetStyle необхідно набути спочатку значення стилю вікна панелі інструментів, а потім порівняти його по масці із значенням прапора WS_viSIBLE. Приведений нижче фрагмент коди встановлює стан логічної змінної bVisible на підставі видимості вікна панелі інструментів:

// З'ясувати поточний стан видимості.

BOOL bVisible = (m_wndToolbar.GetStyle() & WS_VISIBLE);

Звернення до функції CWnd: :SetStyle дозволяє змінити деякі із значень стилю вікна; на жаль, WS__yiSIBLE — не один з них. Тому доведеться скористатися функцією CWnd: ShowWindow, виклик якої з аргументом SW_HIDE приховує панель інструментів, а з аргументом SW_SHOWNORMAL робить її видимою знов. Приведений нижче фрагмент коди перемикає прапор видимості, звертаючись до значення змінної, встановленого в попередньому прикладі:

// Показати або приховати.

int nShow = (bVisible) ? SW_HIDE : SW_SHOWNORMAL;

m wndToolbar.ShowWindow(nShow) ;

Про всі програмні зміни панелі інструментів необхідно повідомляти фреймове вікно, повторно обчисливши при цьому позицію панелі. Для цього достатньо виклику функції CFrameWnd: :RecalcLayout без параметрів:

// Переконфігурувати елементи панелі інструментів.

RecalcLayout ();

Додавання спливаючих підказок і тексту рядка стану

У сучасних додатках панелі інструментів надають користувачеві допомогу як у вигляді спливаючої підказки (ToolTip), так і у вигляді тексту рядка стану (flyby text). Текст рядка стану — це повідомлення, яке відображається в рядку стану, зазвичай в першій її панелі (відокремленою від інших панелей роздільником, ідентифікатор ID_SEPARATOR якого обговорювався раніше в цьому розділі). Текст допомоги, що відображається в рядку стану, може бути трохи довше, ніж текст спливаючої підказки, оскільки для нього відведено більше місця.

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

Отримавши під час виконання ідентифікатор ресурсу кнопки або пункту меню, середовище виконання MFC перевіряє, чи немає в таблиці ресурсів додатку рядків з тим же самим ідентифікатором. Як не дивно це звучить, але унікальні ідентифікатори ресурсів унікальні тільки усередині своїх категорій. Кожен елемент таблиці рядків містить як текст для рядка стану, так і текст для спливаючої підказки. Розібратися в рядку ресурсу просто: весь текст перед символом нового рядка відображається в рядку стану, а той, що розташований після нього (коротший), — в спливаючій підказці.

Додавання елементів управління, відмінних від кнопок

Безумовно, кнопки займають найбільшу частину площ більшості панелей інструментів. Але існують і інші типи елементів управління, які можна додати в панель інструментів. Наприклад, панель інструментів текстового процесора MS Word містять дуже зручні списки, що розкриваються, дозволяють користувачеві вибрати зображення і розмір шрифту.

Першим етапом додавання елементу управління, відмінного від кнопки, є створення місця для нього – на панелі інструментів. Для цього можна відкрити і відредагувати ресурс панелі інструментів, вставивши в нього роздільник як місце для елементу управління:

IDRJTOOLBAR 16,15 BEGIN

BUTTON ID__CUT

BUTTON ID_COPY BUTTON ID_PASTE

SEPARATOR

SEPARATOR // Місце для елементу управління

 

Другий етап має на увазі виділення простору на панелі інструментів для елементу управління. У цих цілях за допомогою функції CToolBar:: SetButtonlnf про необхідно збільшити ширину області, займаної роздільником:

SetButtonlnfo (4, IDC_FONTS, TBBS_SЕPARATOR, nWidth) ;

У приведеному вище фрагменті перший аргумент містить позицію елементу управління на панелі інструментів, IDC_FONTS— ідентифікатор ресурсу елементу управління, TBBS SEPARATOR — константа MFC, що представляє роздільник панелі інструментів, а аргумент nWidth містить ширину елементу управління. Після звернення до функції CToolBar : : SetButtonlnfo можна нарешті створювати елемент управління:

CRect rect;

GetltemRect (4, &rect);

rect.bottom = rect.top + nHeight;

m_ctlFonts.Create(WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_SORT | CBS_DROPDOWNLIST, rect, this, IDC_FONTS);

На практиці, весь вищеописаний код і звернення до функції SetButtonlnfo розміщують зазвичай у функції-обробнику події OnCreate панелі інструментів.

Оновлення елементів управління, відмінних від кнопок

Якщо панель інструментів містить лише кнопки, то для їх оновлення використовується стандартний механізм класу CCmdUI. Але якщо в панель інструментів додані елементи управління, відмінні від кнопок, то цей механізм непридатний. Зневірятися не варто, бібліотека MFC надає вирішення у вигляді іншого класу панелі інструментів, CControlBar, і його механізму оновлення — функції CControlBar : : OnUpdateCmdUI.

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


 

А также другие работы, которые могут Вас заинтересовать

10527. Случаи, когда договор страхования может быть расторгнут 41 KB
  Случаи когда договор страхования может быть расторгнут. Срочный договор: заключается на год. Но если страховой случай наступил то он потом прекращается после выплаты страховки. В результате гибели застрахованного имущества по причинам иным чем страховой случ...
10528. Страхование грузов: КАРГО 39.5 KB
  Существуют районы которые не покрываются страхованием: ─ Юг: ближе к 60 параллели - Север: выше 70 параллели - Финский залив - Гудзон. Страхование грузов: КАРГО. Основные принципы - такие же. В чем отличие: Страхователями грузов могут быть продавец или по...
10529. Коммерческие условия пассажирских перевозок 32.5 KB
  Коммерческие условия пассажирских перевозок. Три категории: Богатые. Курьеры. Бедные. Не выдержало конкуренции с авиацией. Появилось два вида: паромное круизное. Особенность паромов короткие морские. Каюты минимальных р...
10530. Социальная педагогика 27 KB
  Педагогическая деятельность это одна из сторон профессиональной деятельности специалиста по социальной работе. Педагогическая деятельность специалиста направлена на превращение неуправляемой неорганизованной деятельности члена социального сообщества в управляему...
10531. Социальная педагогика: предмет и основные понятия 109 KB
  Социальная педагогика: предмет и основные понятия План. 1. Основная функция и предмет педагогики. 2. Основная функция и предмет социальной педагогики. 3. Основные понятия социальной педагогики. 1. Основная функция и предмет педагогики. Область любой проф
10532. Российский менталитет. Его сущность и национальная специфика 40.5 KB
  Российский менталитет. Его сущность и национальная специфика. Идеалы равенства и социальной справедливости в российской ментальности. 1 равенство и социальная справедливость а также на настороженное отношение к частной собственности и особенное отношение к деньгам...
10533. Структура и механизм функционирования индивидуального сознания. Понятия: хитрость и мудрость; разум и интеллект 58 KB
  Структура и механизм функционирования индивидуального сознания. Понятия: хитрость и мудрость; разум и интеллект Структура сознания. Понятие сознание не однозначно. В широком смысле слова под ним имеют в виду психическое отражение действительности независимо от того...
10534. Идеалистическое и материалистическое понимание общественной жизни. Гегель и Маркс 39.5 KB
  Идеалистическое и материалистическое понимание общественной жизни. Гегель и Маркс. Материалистическое понимание общества. Марксистский философский материализм неизбежно приводит к материалистическому пониманию истории к революционнокоммунистическим выводам. В