"Фальшивая" строка заголовка
Использование оформления Windows в
приложениях
Access
В свойствах экрана на
вкладке "Оформление" пользователь может выбрать различные цветовые схемы для
придания Windows приятной цветовой гаммы, отличающейся от
набившей оскоминой стандартной. Продвинутые пользователи могут и создавать
собственные цветовые гаммы в дополнение к многочисленным имеющимся или изменять
некоторые элементы по своему вкусу...
Вот и я, экспериментируя с навязыванием
собственных цветовых оформлений пользователям моих программ, пришел к выводу, что
лучше всего будет дать возможность пользователю самому выбирать гамму или
изменять оформление программы по своему вкусу, на который, как говорится, не
угодишь. Тем более, что в Windows это делается очень
просто (свойства экрана - вкладка [Оформление]),
и также легко можно вернуться к стандартным схемам, если что-нибудь пошло не так в
"раскраске".
Именно поддержке Вашим
приложением Access предпочитаемого оформления
Windows и предназначена эта статья. Еще специально для Вас поделюсь
простым секретом, как использовать в формах и кнопках приложения картинки с
прозрачным фоном (независимо от смены оформления Windows
фон всегда будет оставаться прозрачным), раз уж мы тут говорим об оформлении.
Все сказанное выше
справедливо для "классических" версий Windows, т.е.
систем, где используется классическое оформление - в это число не входит
Windows XP с включенными темами (которые лично я считаю немного
легкомысленными). Если хотите и под XP получать
описываемый эффект оформления - переключитесь в классический режим. (сам никак
на XP не могу перейти - все коплю деньги на лицензионную
систему ;)
В Windows имеются
предопределенные цвета, которые цветами на самом деле не являются ;), а являются
константами, описывающими определенные элементы схем оформления (константы
системных цветов - System Color Constants).
Чтобы было понятно, о чем речь, рассмотрим
сразу таблицу констант:
Идентификатор
Описание цвета (в скобках внутренние константы
Access)
-2147483648 Scroll bar
Полоса прокрутки (vbScrollBars)
-2147483647 Desktop
Рабочий стол (vbDesktop)
-2147483646 Active window title bar
Цвет заголовка активного окна (vbActiveTitleBar)
-2147483645 Inactive window title bar Цвет
заголовока неактивного окна (vbInactiveTitleBar)
-2147483644 Menu bar
Цвет фона строки меню (vbMenuBar)
(я использую как
цвет фона форм и цвет фона надписей, чтобы оставались "прозрачными")
-2147483643 Window
Цвет фона окон Windows (vbWindowBackground)
(можно использовать для задания цвета фона текстовых
полей)
-2147483642 Window frame
Тончайшая полоска по краю форм (vbWindowFrame)
-2147483641 Menu Text
Цвет текста меню (vbMenuText)
(я использую этот
цвет текста в надписях)
-2147483640 Window Text
Цвет текста окон Windows (vbWindowText)
(можно
использовать для управления цветом текста текстовых полей в контрасте с
-2147483643)
-2147483639 Title bar text
Цвет текста заголовка активного окна (vbTitleBarText)
-2147483638 Active window border
Граница активного окна (vbActiveBorder)
-2147483637 Inactive window border
Граница неактивного окна (vbInactiveBorder)
-2147483636 Application background
Рабочая область приложения (фон MDI-окна приложения) (vbApplicationWorkspace)
-2147483635 Highlight
Цвет фона выделенного пункта меню (vbHighlight)
-2147483634 Highlight Text
Цвет текста выделенного пункта меню (vbHighlightText)
-2147483633 3-D face
"Лицевой" цвет фона 3D-элементов, кнопки,
например (vbButtonFace)
(можно
использовать также как цвет фона форм)
-2147483632 3-D shadow
Отбрасываемая тень 3D-элементов (vbButtonShadow)
-2147483631 Dimmed (disabled) text
Недоступный, "серый" текст (vbGrayText)
-2147483630 Button Text
Цвет текста "нажатой" кнопки (vbButtonText)
(цвет текста
кнопок, меню, вкладок, кнопок управления окном, строки состояния)
-2147483629 Inactive window title bar text Цвет текста заголовка неактивного
окна (vbInactiveCaptionText)
-2147483628 3-D highlight
"Яркий" цвет 3D-элементов (vb3DHighlight)
(можно
использовать для цвета фона текстовых полей вместо -2147483643)
-2147483627 3-D dark shadow
"Темная" тень 3D-элементов (vb3DDKShadow)
-2147483626 3-D light
"Светлый" цвет 3D-элементов (vb3DLight),
но темнее, чем -2147483628
-2147483625 ToolTip Text
Текст всплывающей подсказки (vbInfoText)
-2147483624 ToolTip background
Фон всплывающей подсказки (vbInfoBackground)
Всю эту таблицу использовать не просто, а
очень просто: открываем свойства элемента управления, например, элемента
[Поле], и в свойства
[Цвет фона] вписываем
-2147483643, а в свойство [Цвет текста]
-2147483640. И все! теперь юзер может выбирать любые схемы оформления - наше
поле будет всегда следовать цветовой гамме выбранного оформления и будет всегда хорошо читаемо. Точно
также можно подобрать цвет границы поля, например, хорошо смотрится -2147483646.
В общем, тут надо экспериментировать не с самими цветами, а с константами,
грамотно подбирая цветовую гамму, которая при любом оформлении будет смотреться
гармонично. Точно также можно задавать цвета абсолютно для любых элементов
формы, включая и саму форму (точнее, области формы).
Ну а что же это за константы такие в
скобочках? Это тоже необходимые константы, но уже для управления из программного
кода.
Иногда нужно изменять цвета элементов "на
ходу", вот тут и встроенные константы Access и приходят на помощь:
Me.txtПоле.ForeColor
= vbWindowText ' системный цвет текста окон
Windows
me.txtПоле.BackColor
= vbWindowBackground ' системный цвет фона окон
Windows
-------------------
Теперь о картинках с прозрачным фоном.
Действительно, такие кнопки и рисунки на форме смотрятся красиво и
профессионально.
Для достижения такого эффекта необходимо использовать иконки - т.е. файлы в
расширением .ICO, в которых используется прозрачный
фон. Иконки для последующего использования в Access я
подготавливаю в замечательной (и бесплатной программе) AWicons
http://www.awicons.com.
При импорте Access
внедряет иконку, заменяя прозрачный фон на текущий фон кнопки или формы
(если иконку внедряем в элемент Рисунок). Вы не думайте, что иконки, это такие
маленькие квадратики, на которых ничего не понятно ;). Размер иконок ограничен
лишь возможностями редактора. Обычно я использую иконки размером 32х32 пикселя
для кнопок и до 128х128 пикселей для оформления форм.
Но проблема в том, что
Access при импорте любых форматов картинок превращает их в формат
DIB для внутреннего хранения.
DIB (Device-Independent Bitmap) -
структура DIB. Структура данных для Windows bitmap (растрового представления в
видеопамяти выводимых на экран объектов), содержащая заголовки полей,
дополнительную таблицу цветов (palette) и данные. В зависимости от числа цветов,
используемых в данной битовой карте, ее точки могут быть представлены
соответственно 1, 4, 8 или 24 битами с таблицей цветов или без неё (именно
поэтому Access противится внедрению 32-битных иконок)
Есть пара путей, как обойти проблему
прозрачного фона при смене оформления. Первый - самый очевидный - использовать
не внедренные рисунки, а связанные (в свойствах кнопки Тип рисунка = связанный).
При открытии формы Access подгрузит иконку и
соответственно, заменит прозрачный цвет иконки на текущий цвет фона. При
изменении оформления пользователем изменений цвета фона картинки в реальном
времени не произойдет, но, заново открыв форму, можно заставить
Access заново подгрузить иконку и прозрачный цвет
иконки заменится на текущий цвет фона формы или кнопки. С изменением в реальном
времени можно и смириться, но то, что для указания иконки используется
абсолютный путь - это никуда не годится. Надеюсь, Вы разрабатываете приложения
не только под себя, по планируете их еще и распространить на компьютеры
благодарных пользователей? Вот тут-то и будут проблемы с абсолютными путями к
этим иконкам, если пользователь установит приложение не в то место, на какое Вы
рассчитывали при разработке.
Поэтому я пошел по второму пути: загрузку
иконок во время выполнения программы кода при наступлении события
Resize у формы. Событие
Resize наступает не только во время изменения размеров
формы, но и во время открытия формы и интересно! после смены оформления
Windows - то, что нам и надо. Благодаря этому событию
мы можем перегружать иконки в реальном времени, сразу, как только пользователь
сменит оформление Windows.
Код для этого очень простой:
Private Sub
Form_Resize()
' это событие возникает после смены оформления в Windows и
при загрузке формы
Dim strAppPath As
String
' установим путь к базе
strAppPath = Application.CurrentProject.Path & "\"
' заполняем кнопки иконками
' подгрузка иконок для обеспечения прозрачности при смене оформления
Me.cmdNewRecord.Picture = strAppPath & "AddOns\Icons\New.ico"
Me.cmdNextRecord.Picture = strAppPath & "AddOns\Icons\Next.ico"
Me.cmdPreviousRecord.Picture = strAppPath & "AddOns\Icons\back.ico"
Me.cmdPrint.Picture = strAppPath & "AddOns\Icons\Documents.ico"
Me.cmdDeleteRecord.Picture = strAppPath & "AddOns\Icons\Delete.ico"
Me.cmdPrintПостановление.Picture = strAppPath & "AddOns\Icons\Print.ico"
Me.cmdExit.Picture = strAppPath & "AddOns\Icons\ExitForm.ico"
End Sub
Поясню код: в папке приложения есть
подпапка AddOns (для хранения всякой всячины), а в
этой подпапке есть папка Icons. Вот в ней-то и
хранятся все иконки, используемые для оформления приложения.
Путь к этим иконкам вычисляется
относительно текущего пути работающего приложения, следовательно, куда бы
пользователь ни установил приложение (со всей иерархией каталогов, конечно) все
будет работать безошибочно.
По этому принципу в приведенном примере на
кнопки "одеваются" заранее подготовленные картинки, сохраненные в формате
.ICO.
Дополнения: формат
DIB (как и BMP) очень
неэкономичный формат и размер базы может быть неоправданно велик,
особенно если у Вас используется много картинок. Поэтому перед
распространением приложения для уменьшения размера "почистите" формы - оставьте
"голые" кнопки (с подписями) и пустые рамки рисунков - картинки подгрузятся
динамически.
Еще при смене оформления изменяются размеры
элементов форм, если пользователь выбирает, например, схемы "Розовая", крупные
или огромные. Помните об этом при проектировании форм - если форма нарисована
"впритык" на всю доступную рабочую область, то при изменении оформления на более
крупную увеличатся размеры заголовков (полос прокрутки и т.п.) и форма "вылезет"
за пределы экрана. Мало то, что вылезет, заботливо появившиеся полосы прокрутки
испортят весь вид Вашего приложения.
Мои мысли, мои скакуны