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. Якщо її перевизначити, можна оновлювати навіть такі елементи управління, які не мають обробників подій оновлення (наприклад, списки або списки, що розкриваються)


 

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

70660. Аппендицит 118.5 KB
  Летальность при остром аппендиците на протяжении последних 20 лет практически не изменилась, оставаясь в пределах 0.05-0.1%. Диагностические ошибки при этом заболевании встречаются в 12-30% случаев.
70661. НАГНОИТЕЛЬНЫЕ ЗАБОЛЕВАНИЯ ЛЕГКИХ И ПЛЕВРЫ 279 KB
  Острые инфекционные деструкции лёгких: а острый гнойный абсцесс лёгкого; б острый гангренозный абсцесс лёгкого; в распространённая гангрена лёгкого; г хронический абсцесс лёгкого. абсцесс и гангрена лёгкого Абсцесс легкого гнойный очаг в паренхиме легкого имеющий полость стенки и содержимое.
70662. ГРЫЖИ ЖИВОТА 104.5 KB
  Наружные грыжи - выхождение брюшных органов, покрытых пристеночной брюшиной, через дефекты в брюшной стенке под кожу. Внутренние грыжи – выхождение брюшных внутренностей в различные карманы брюшины или брыжейки, или через отверстия диафрагмы – в грудную полость...
70663. Патология диафрагмы 255.59 KB
  Грудинная часть диафрагмы самый незначительный отдел диафрагмы начинается от задней поверхности мечевидного отростка и переходит в сухожильный центр. Реберная часть диафрагмы составляет наибольшую часть диафрагмы и начинается зубцами от внутренней поверхности костных и хрящевых...
70664. ЗАБОЛЕВАНИЯ МОЛОЧНОЙ ЖЕЛЕЗЫ 100.5 KB
  Молочная железа располагается на передней поверхности грудной клетки от III до VII ребра. Паренхима состоит из 15-20 трубчато-альвеолярных желёз, открывающихся на вершине соска. Молочная железа находится в соединительнотканном футляре и условно делится на 4 квадранта – 2 наружных...
70665. ЗАБОЛЕВАНИЯ ПИЩЕВОДА 165.5 KB
  Анатомия и физиология пищевода Пищевод полая цилиндрическая мышечная трубка соединяющая глотку с желудком и расположенная на уровне С6Th11 длиной примерно 25 см. С практической точки зрения в грудном отделе пищевода целесообразна следующая топография: Верхняя часть до дуги аорты.
70666. Острая кишечная непроходимость 130 KB
  Непроходимость кишечника – это синдром, характеризующийся нарушением продвижения кишечного содержимого по ЖКТ от желудка до анального отверстия. Часто именуется илеусом (ileus – от слова ileos – заворот кишечника по-гречески), хотя это относится только к частному виду непроходимости – завороту.