20 ноября 2019 года    
Среда | 19:19    
Главная
 Новости
Базы данных
Безопасность PC
Всё о компьютерах
Графика и дизайн
Интернет-технологии
Мобильные устройства
Операционные системы
Программирование
Программы
Связь
Сети
 Документация
Статьи
Самоучители
 Общение
Форум







Разделы / Программирование / Basic

Поддержка Windows XP

Гайдар Магдануров
Поддержка 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 отговорил всех, и так уже сомневающихся товарищей.
Я считаю это ничтожной проблемой, поэтому не требующей такого внимания.

 

 Поддержка Windows XP
Лента новостей


2006 (c) Copyright Hardline.ru