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


 

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

29241. Место и роль науки в культурном процессе 28.5 KB
  Для науки характерен системный подход к исследованию объекта. По характеру и методу исследования она делится на: естественные науки общественные науки: технические науки. В структуре науки выделяются два уровня организации знания.
29242. Ницше (Nietzsche) Фридрих 35.5 KB
  Центральное место в философскокультурологической концепции Ницше занимает понятие жизнь основу которой образует воля. Однако взгляды Ницше на протяжении творческой деятельности претерпевали определенную эволюцию. По Ницше понять импульсы воли выразить ее характер невозможно с помощью разума и науки. Искусство представляется Ницше как дополнения и завершение бытия.
29243. Культурологическое образование в России 32 KB
  Главная сложность введения культурологии в систему высшего образования заключалась в том что отечественная культурологическая наука представляла и до сих пор представляет собой полностью эклектическую конструкцию. Первые шаги в организации специального культурологического образования были предприняты в одном из первых негосударственных вузов страны Российском открытом университете где в 1990 началось формирование факультета и кафедры искусствознания и культурологии. В 1995 на базе этого факультета была создана Высшая школа...
29244. Культура 41.5 KB
  Это совпадение имени симптоматично – оно лишний раз подчеркивает единство культуры народов включенных в орбиту европейского мира является знаком своеобразной культурной общности всех разноплеменных носителей европейских языков. Понятие цивилизация воспринимается как синоним слова культура В немецкой традиции впервые было сформулировано – и стало весьма популярным – представление о различии культуры и цивилизации. Со второй половины Х1Х века идея противопоставления культуры и цивилизации приобрела особое значение и...
29245. Религия как культурный феномен 30.5 KB
  Именно религия дает ответ на главный вопрос всех ценностнонормативных систем. Религия формирует у человека чувство независимости и уверенности в себе.Дюркгейм сравнивал религию в качестве интегратора социокультурных систем с клеем поскольку именно религия помогает людям осознавать себя как духовную общность скрепленную общими ценностями и общими целями.
29246. Феномен Ренессанса 37 KB
  Расцвет культуры Ренессанса приходится на XV XVI вв. В этой связи культура Ренессанса рассматривается как отрицание средневековья как антитеза средневековой схоластике. Такова самая общая в значительной мере поверхностная характеристика Ренессанса.
29247. Феномены русской, российской, советской культуры 52.5 KB
  Проблема самосознания русской культуры. Этапы становления русской идеи. Формирование русской национальной культуры на протяжении веков проходило в русле этнического разнообразия преодоления разобщенности в условиях интенсивного воздействия извне: соединение Запада и Востока наслоение различных этнических и региональных культурных типов временных компонентов конфессиональных общностей.
29248. Понятие культурной самоидентичности 32 KB
  Современные глобальные проблемы есть следствие логическое продолжение глубокой структурной несогласованности человеческой субъективности кризиса его самоидентичности. Распад социальной системы начинается с распада социальных связей и разрушения социальных субъектов кризиса их личностных ценностных ориентации и утраты самоидентичности. Проблема самоидентичности является стержнем ядром всей социальной проблематики.
29249. Символ. Смысловая структура символа 53.5 KB
  Языком культуры в широком смысле этого понятия называются те средства знаки символы тексты которые позволяют людям вступать в коммуникативные связи друг с другом ориентироваться в пространстве культуры. Язык культуры это универсальная форма осмысления реальности в которую организуются все вновь возникающие или уже существующие представления восприятия понятия образы и другие подобного рода смысловые конструкции носители смысла. Основной структурной единицей языка культуры с точки зрения семиотики являются знаковые системы.Любой...