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


 

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

40607. Построение диаграмм классов 196.48 KB
  Повторить общие сведения о диаграммах классов Построить диаграмму классов Сформировать отчет по практической работе №7 После того как мы определились с функциональными требованиями к системе и её границами начнём анализировать предметную область с целью построения диаграммы классов. Основные элементы диаграммы классов Основными элементами являются классы и связи между ними. Ассоциация ssocition представляет собой отношения между экземплярами классов.
40608. Построение диаграмм состояний 263.95 KB
  Повторить общие сведения о диаграммах состояний Построить диаграмму состояний Сформировать отчет по практической работе №8 Диаграмма состояний определяет последовательность состояний объектавызванных последовательностью событий. Порядок построения диаграммы Создайте диаграмму состояний для объектов класса Заказ. Соответствующая диаграмма состояний представлена на рисунке: Сохраните диаграмму.
40609. Представление конкретной модели ИС в виде DFD диаграмм 254 KB
  Шаг 1: Создание новой модели В меню File выбрать NewПоявится диалоговое окно BPwin В поле Nme напечатать Банкомат Проверить что в группе Type выбрано Dtflow DFD Нажать OKПоявился пустой прямоугольник контекстного действия. Напечатать:Банкоматзатем нажать OK. Нажать OK. Шаг 4: Рисование внешней ссылки На инструментальной панели BPwin нажать кнопку Externl Reference.
40610. Разработка диаграмм по методу Баркера 44 KB
  Печатать накладные на отпущенные товары. Следить за наличием товаров на складе. Выделим все существительные в этих предложениях это будут потенциальные кандидаты на сущности и атрибуты и проанализируем их непонятные термины будем выделять знаком вопроса: Написать сущностиСразу возникает очевидная связь между сущностями покупатели могут покупать много товаров и товары могут продаваться многим покупателям . Причем каждый товар может храниться на нескольких складах и быть проданным с любого склада.
40611. Визначення жанрово-стильових особливостей медійного продукту Д. Гордона, пошук спільних та відмінних ознак медійного продукту Дмитра Гордона 428.5 KB
  В ходе работы на примере конкретного медийного продукта доказано, что авторская журналистика придерживается своим жанрово стилистическим особенностям. Особое внимание уделено анализу программы «В гостях у Дмитрия Гордона».
40613. Технология внедрения CASE-средств 118.11 KB
  CSEсредство любое программное средство автоматизирующее ту или иную совокупность процессов жизненного цикла ПО и обладающее следующими основными характерными особенностями: мощные графические средства для описания и документирования ИС обеспечивающие удобный интерфейс с разработчиком и развивающие его творческие возможности; интеграция отдельных компонент CSEсредств обеспечивающая управляемость процессом разработки ИС; использование специальным образом организованного хранилища проектных метаданных репозитория. Процесс...
40614. Управление требованиями к системе. Оценка затрат на разработку ПО 23.18 KB
  Средства управления требованиями Перед тем как управлять требованиями разберемся что такое требование и что такое управление требованиями и зачем это нужно. Требование это любое условие которому должна соответствовать разрабатываемая система или программное средство. Требованием может быть возможность которой система должна обладать и ограничение которому система должна удовлетворять. В соответствии с Глоссарием терминов программной инженерии IEEE являющимся общепринятым международным стандартным глоссарием требование это:Условия...