Visual Basic, .NET, ASP, VBScript
 

   
 

За период изучения данной СУБД мною накоплено большое количество программного кода, советов, трюков и хитростей в создании баз данных средствами MS Access.

 
     
   
 
"Фальшивая" строка заголовка

Использование оформления 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) очень неэкономичный формат и размер базы может быть неоправданно велик, особенно если у Вас используется много картинок. Поэтому перед распространением приложения для уменьшения размера "почистите" формы - оставьте "голые" кнопки (с подписями) и пустые рамки рисунков - картинки подгрузятся динамически.

 

Еще при смене оформления изменяются размеры элементов форм, если пользователь выбирает, например, схемы "Розовая", крупные или огромные. Помните об этом при проектировании форм - если форма нарисована "впритык" на всю доступную рабочую область, то при изменении оформления на более крупную увеличатся размеры заголовков (полос прокрутки и т.п.) и форма "вылезет" за пределы экрана. Мало то, что вылезет, заботливо появившиеся полосы прокрутки испортят весь вид Вашего приложения.

 

Мои мысли, мои скакуны

 
     

   
   
     
  VBNet рекомендует