div.main {margin-left: 20pt; margin-right: 20pt}
Гайдар Магдануров Поддержка Windows XP
С выходом новой версии операционной системы
Windows XP ощутимое количество пользователей перешло на новую платформу,
либо планирует это сделать в ближайшем будущем. С этим связаны небольшие
неприятности для программиста - разработчика программ вообще и на
Visual Basic в частности. Когда разработка ведется в
одной среде, то при переносе в другую возможно появления непредвиденных ошибок.
Это может быть связанно с отсутствием или модификацией в
Windows XP используемых Windows API функций,
тут трудно что-либо сделать (хотя некие попытки предпринимаются, но об этом
дальше). Также весьма неприятно, если привлекательный диалог вдруг исказился,
как с этим бороться и будут описано в данной статье, появление которой обязано
множеству писем с вопросами на эту тему.
Toolbar'ы и
ImageList'ы
Панель инструментов вашего приложения прекрасно выглядит в
Windows NT/9x/2k, но в Windows XP
прозрачный (казалось бы) фон становиться серым. Это связано с тем, что вы
использовали картинку не 16 цветную, а больше, поэтому свойство
Mask color не очень-то и помогло. Избежать этого легко
- используйте стандартный 16 цветные картинки.
Элементы управления и изменение размеров формы
При изменении размеров формы приходится увеличивать/уменьшать
некоторые элементы, а также по-разному позиционировать их на форме, при этом
многие программисты забывают, что настройки размеров окон в
Windows могут быть различными, в Windows XP при
стандартном стиле оформления это не проявляется, но при использовании стиля по
умолчанию легко заметно: ширина заголовка окна не такая, как обычно и при этом
некоторые элементы заезжают друг на друга (например поле редактирования текста
на statusbar). Для этого я рекомендую производить
изменения положений и размеров элементов управления с учетом системных
параметров, которые определяются так:
Declare
Function GetSystemMetrics Lib
"user32" (ByVal
nIndex As
Long)
As
Long
nIndex это заранее
определенная константа (часть из возможных значений приведена ниже):
Const SM_CXSCREEN = 0 'Ширина экрана (X
координаты)Const SM_CYSCREEN = 1 'Высота экрана (Y
координаты)Const SM_CXVSCROLL = 2 'Размер стрелки в вертикальном
scrollbar'e (X координата)
Const SM_CYHSCROLL = 3 'Размер стрелки в горизонтальном
scrollbar'e (Y координата)
Const SM_CYCAPTION = 4 'Высота заголовка окна
Const SM_CXBORDER = 5 'Ширина не изменяемых границ
Const SM_CYBORDER = 6 'Высота неизменяемых границ
Const SM_CXDLGFRAME = 7 'Ширина границ диалогового окна
Const SM_CYDLGFRAME = 8 'Высота границ диалогового окна
Const SM_CYVTHUMB = 9 'Высота
кнопки на горизонтальном scrollbar'e
Const SM_CXHTHUMB = 10 ' Ширина кнопки на горизонтальном
scrollbar'e
Const SM_CXICON = 11 'Ширина стандартной иконки
Const SM_CYICON = 12 'Высота стандартной иконки
Const SM_CXCURSOR = 13 'Ширина стандартного курсора
Const SM_CYCURSOR = 14 'Высота стандартного курсора
Const SM_CYMENU = 15 'Высота меню
Const SM_CXFULLSCREEN = 16 'Width of client area of maximized window
Const SM_CYFULLSCREEN = 17 'Height of client area of maximized window
Const SM_MOUSEPRESENT = 19 'Возвращает True
если мышь есть
Const SM_CYVSCROLL = 20 'Высота стрелки в вертикальном
scrollbar'e
Const SM_CXHSCROLL = 21 'Ширина стрелки в вертикальном
scrollbar'e
Const SM_DEBUG = 22 'Возвращает True, если
запущена Windows в
режиме отладкиConst SM_SWAPBUTTON = 23 'Возвращает
True если левая и правая кнопки заменены
Const SM_CXMIN = 28 'Минимальная ширина окна
Const SM_CYMIN = 29 'Минимальная высота окна
Const SM_CXSIZE = 30 'Ширина картинки в заголовке окна
Const SM_CYSIZE = 31 'Высота картинки в заголовке окна
Const SM_CXICONSPACING = 38 'Ширина между иконками на рабочем столе
Const SM_CYICONSPACING = 39 'Высота между иконками на рабочем столе
Const SM_CMOUSEBUTTONS = 43 'Количество кнопок мыши
Const SM_CXMENUCHECK = 71 'ширина картинки выбора в меню
Const SM_CXMENUSIZE = 54 'ширина кнопки меню
Const SM_CYMENUCHECK = 72 'высота
картинки выбора в меню
Const SM_CYMENUSIZE = 55 'высота кнопки меню
Использования функции:
MsgBox "Height
of windows caption:" &
GetSystemMetrics(SM_CYCAPTION)
Если учитывать эти константы, то можно избежать неприятных эффектов заезжания
элементов управления друг на друга в любой версии ОС
MS
Windows (9x/NT/2k/XP).
Системные значки
Если вы используете в приложении значки операционной системы (типа "Мой
компьютер", "Мои документы" и т.д.), то лучше не зашивать их в приложение, а
использовать картинки хранящиеся в системных библиотеках
Windows. Например вам нужно получить значки, которые используются в
MsgBox. Для этого определим как-нибудь место, где
лежит содержащая их библиотека user32.dll,
например так:
Declare Function
GetSystemDirectory Lib "kernel32"
Alias
"GetSystemDirectoryA" (ByVal
lpBuffer As
String,
ByVal nSize
As
Long)
As
Long
SysDir
= Space(255) ReValt = GetSystemDirectory(sSave, 255) SysDir = Left(SysDir, RetVal) LibPath = SysDir & "user32.dll"
Потом загрузим иконки, использую другую API
функцию:
Declare Function
ExtractIcon Lib "shell32.dll"
Alias
"ExtractIconA" (ByVal
hInst As
Long,
ByVal lpszExeFileName As
String,
ByVal nIconIndex
As
Long)
As
Long
RetVal = ExtractIcon(Me.hWnd,
LibPath, 3) RetVal = DrawIcon(Picture_Critical.hdc,
0, 0, RetVal)
Так мы загрузим иконку Critical (красный крест)
в Picture_Critical на нашей форме.
Windows Common Controls
Чтобы используемые вами контролы выглядели соответственно нужно добавить
такой код, инициализирующий библиотеку стандартных Windows
контролов:
Declare Sub InitCommonControls Lib "comctl32" ()
Private Sub Form_Activate()
InitCommonControls
End Sub
А также с помощью редактора ресурсов добавить xml
файл с информацией о программе и присвоить ему ID =
1. Содержание xml файла таково:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity version="1.0.0.0" processorArchitecture="X86" name="MySoft.Software_name"
type="win32"/>
<description>MySoft Cool Software</description>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0"
processorArchitecture="X86" publicKeyToken="6595b64144ccf1df" language="*" />
</dependentAssembly>
</dependency>
</assembly>
Функции для различных версий
Windows
Функции вашего приложения могут отличаться для разных ОС
MS Windows, поэтому рекомендую использовать проверку на версию
Windows, для таких функций:
Declare
Function GetVersion
Lib
"kernel32" ()
As
Long
Function GetWinVersion()
As
String Ver = GetVersion() WinVer = Ver And
&HFFFF& GetWinVersion = Format((WinVer Mod 256) + ((WinVer 256) / 100),
"Fixed") End
Function
Windows API
функции
Это факт, что в Windows XP недостает некоторых
API функций, но в действительности с этим приходиться
сталкиваться в очень экзотических случаях, поэтому это не очень актуально. Хотя
мне известно, что одно время разрабатывалась DLL,
через которую вызывались API функции и уже определение
имени функции или замещение стандартной Windows
функцией библиотечной было заботой разработчиков библиотеки, я был одним из тех,
кто помогал в работе, но поняв бесперспективность попытки запихать все
WinAPI в DLL отговорил всех,
и так уже сомневающихся товарищей. Я считаю это ничтожной проблемой, поэтому не требующей такого внимания.
|