|
Программирование >> Разработка пользовательского интерфейса
Тип параметра Integer По значению Помещает в стек вызовов 16-битовое значение. Long Помещает в стек вызовов 32-битовое значение. Этот адрес стек. обеспечивает ссылку на 32-битовое значение параметра. String Преобразует строку символов в формат, принятый в С, с нулевым (CHR(0)) символом в конце. Помещает 32-битовыйый адрес этой строки в стек. По ссылке Помещает в стек вызовов 32-битовый адрес. Этот адрес обеспечивает ссылку на 16-битовое значение параметра. Помещает 32-битовый адрес в Помещает 32-битовый указатель в стек. Помимо правильного использования параметров, довольно важным при использовании функций DLL является применение указателя. Указатель (handle) - это число, уникально идентифицирующее объект. Среда Windows поддерживает очень много объектов различного типа. Это разнообразные окна, блоки памяти, меню, шрифты, палитры и т. д. Допустим, вы хотите нарисовать голубую линию; тогда вы должны создать объект голубой карандаш . Функция Windows API CreatePen() вернет указатель на этот карандаш , который вы затем можете использовать для рисования. Когда вы закончите работу, этот объект можно убрать, передав указатель в функцию DestroyObject(). Рассмотрим несколько примеров для демонстрации возможностей Windows API. Начнем с таких задач, которые невозможно выполнить стандартными средствами. Давайте посмотрим, как сделать в Visual FoxPro список, в котором будут появляться все устройства, доступные на данном компьютере. При этом для дисководов гибких дисков должна проверяться их готовность к работе (наличие дискеты). Этот список лучше всего оформить в виде класса. Тогда при добавлении его в форму мы сразу получим требуемый элемент управления. Список доступных логических устройств для данного компьютера мы можем получить с помощью следующей функции API Windows (в синтаксисе C, как приведено в файле WIN32API.HLP): DWORD GetLogicalDriveStrings (DWORD nSufferLength, LPTSTR IpBuffer); Эта функция возвращает список доступных устройств в виде строки символов. Тип устройства можно определить с помощью функции UINT GetDriveType (LPCTSTR IpRootPathName); Эта функция возвращает одно из следующих значений: 0 - тип устройства не определен; Опции ByVal или ByRef определяют, что параметр будет передан по значению или по ссылке. В следующей таблице показано, к каким результатам приведет передача параметров по значению или по ссылке различного типа : 1 - нет загрузочного сектора; 2 - устройство для сменного носителя данных; 3 - жесткий диск; 4 - сетевое устройство; 5 - дисковод для лазерных дисков; 6 - виртуальный диск. Эта функция поможет нам украсить список устройств соответствующим его типу изображением. Для определения готовности дисковода к записи нам потребуется еще одна функция, которая переопределяет реакцию операционной системы на критические ошибки, например, на отсутствие дискеты в дисководе при попытке записи: UINT SetErrorMode(UINT fuErrorMode); Эта функция возвращает предыдущую установку реакции на ошибки. В Visual FoxPro нет такого многообразия типов данных, как в Си ++, поэтому тип возвращаемого этими тремя функциями значения DWORD (двойное слово) или UINT (целое без знака) заменим имеющим 4 бита INTEGER. Теперь, проведя необходимую теоретическую подготовку, можно приступать к практическому созданию требуемого класса. В Project Manager при активной вкладке Classes щелкнем на кнопке New и в диалоговом окне New Class укажем название создаваемого класса, класс, на основании которого он создается, и имя библотеки, где он будет храниться. Будем надеяться, что к этому моменту у вас уже есть собственный набор классов и класс для списка в том числе. Дадим этому классу имя lstDrives и установим для него следующие свойства: BoundColumn = 2 (две колонки); ColumnLines = .F. (без разграничительных линий); FontSize = 12 (размер шрифта, обычно лучше использовать 10, но отдельные буквы можно увеличить). Код для создания требуемого списка в событии Init может выглядеть следующим образом: * Определяем функцию для получения списка доступных * устройств DECLARE INTEGER GetLogicalDriveStrings IN Win32API AS GetDrive; INTEGER, STRING * Определяем функцию для определения типа устройства DECLARE INTEGER GetDriveType IN Win32API AS GetType; STRING * Описываем локальные переменные LOCAL cLetter, nLetter, NType, nDrivesNum * Резервируем строку для размещения списка доступных * устройств lpString=SPACE(200) * Определяем размер буфера для строки nBuffSize=LEN(lpString) * Получаем список устройств = GetDrive(nBuffSize,@lpString) * Определяем количество устройств nDrivesNum = OCCURS( : ,lpString) * Получаем их имена FOR nLetter = 1 TO nDrivesNum cLetter = UPPER( + SUBSTR(lpString,AT( : ,lpString,nLetter)-1,1)) Определяем тип устройства nType = GetType(ALLTRIM(cLetter + :\ )) Добавляем обозначение устройства (первая колонка) и его тип (вторая колонка) в список This.AddItem(cLetter, nLetter, 1) This.List(nLetter, 2) = STR(nType) Задаем соответствующее изображение DO CASE CASE NType = 2 This.Picture(nLetter) = FLOPPY.BMP CASE NType = 3 This.Picture(nLetter) = DRIVE.BMP CASE NType = 4 This.Picture(nLetter) = NET.BMP CASE NType = 5 This.Picture(nLetter) = CDROM.BMP ENDCASE ENDFOR Все необходимые файлы изображений вы найдете на дискете. Нам их пришлось создать заново, так как обширная библиотека изображений, поставляемая с Visual FoxPro, содержала подходящие изображения только в формате ICO 32x32. В подобных списках лучше смотрятся изображения 16x16. Впрочем, это легко сделать с помощью утилиты Imagedit из состава Visual FoxPro. Здесь только необходимо учесть, что при выводе изображения Visual FoxPro очень своеобразно обходится с белым цветом, считая, что его вообще нет. Если вы выведете изображение, содержащее белый цвет, например, на серую кнопку, то те места изображения, которые были белые, станут серыми. Для сохранения белого цвета для каждого изображения надо создать двойника - маску (файл с расширением MSK), в котором на месте белого цвета должен располагаться черный. В качестве примера этой операции можно руководствоваться изображениями, которые использует Wizard (Мастер) для графических кнопок управления в форме. В событии Click класса запишем следующий код: LOCAL cLetter cLetter = This.DisplayValue + : * Если устройством является дисковод для гибких дисков, * то проверяем наличие * дискеты с помощью метода IsDiskIn IF ALLTRIM(This.Value) = 2 IF This.IsDiskIn(cLetter) = .T. This.Parent.cmdOk.Enabled = .T. ELSE = MESSAGEBOX( Вставьте дискету в выбранное устройство ! ,0,; Не готов дисковод ) IF This.IsDiskIn(cLetter) = .T. This.Parent.cmdOk.Enabled = .T. ELSE This.Parent.cmdOk.Enabled = .F. ENDIF ENDIF RETURN ENDIF This.Parent.cmdOk.Enabled = .T. Для определения наличия дискеты в дисководе создадим в нашем классе путем выбора команды New Method в меню Class специальный метод IsDiskIn() и запишем в него следующий код: LPARAMETERS cDrive LOCAL lOldError * Регистрируем функцию SetErrorMode, которая определяет, * как ОС реагирует на некоторые критические ошибки, * в том числе дисковые операции DECLARE INTEGER SetErrorMode IN Win32API INTEGER * Определяем наличие и сохраняем имя обработчика ошибок lOldError = ON(ERROR) ON ERROR lDiskError = .T. * Задание функции SetErrorMode с аргументом 1 позволяет * приложению самому обрабатывать критические ошибки * вместо ОС nOldErrorState = SetErrorMode(1) * По умолчанию считаем, что ошибки нет, если не так, * значение будет изменено lDiskError = .f.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |