РАССЫЛКА #07 - 17.05.2001

Сегодня в выпуске

Новости сайта

17.05.2001 Новая статья "Стандартные диалоговые окна без ActiveX".
Добавлены новые модули для VB.
09.05.2001 Создан архив рассылок с 6 вышедшими рассылками.
Новый исходник на VB: программа Yandex Search.


Вопрос-ответ

Имя: Alex_L
E-mail: newalex7@yandex.ru
Вопрос:
Может кто подскажет как перехватить в любом приложении кнопку Save и запустить по нажатию на кнопку свою прогу на VB.
Ответить

Имя: Павел
E-mail: pasha_nik@mail.ru
Вопрос:
Где можно найти НЕ online библиотеку по API функциям?
Ответить

    Вопросы можете задавать в соответствующем разделе сайта.


Стандартные диалоговые окна без ActiveX

    Все, наверное, знают про стандартные окна открытия и сохранения файлов. Они есть в каждой программе под Windows. Но как их показать? Вы либо делали свои похожие формы или просто ставили на форму ActiveX компонент Common Dialog и вызывали окно всего одной строчкой (например MyDlg.ShowOpen). Но зато при этом Вам нужно носить вместе с программой этот .ocx файл, который занимает во много раз больше места, чем то, в какое увеличился бы Ваш .exe файл, в котором Вы сами написали на VB свой код вызова этого диалога. Так вот сейчас я расскажу как этот самый код написть.

    Диалоговое окно для открытия и сохранения файлов вызывается фуекцией GetOpenFileName и GetSaveFileName из comdlg32.dll

    Вот синтаксис их объявления:

Declare Function GetOpenFileName Lib _
"comdlg32.dll" Alias "GetOpenFileNameA" _
(OpenFileName As OPENFILENAME) As Boolean

Declare Function GetSaveFileName Lib _
"comdlg32.dll" Alias "GetSaveFileNameA" _
(OpenFileName As OPENFILENAME) As Boolean

    Параметер OpenFileName в той и другой функции - это переменная типа OPENFILENAME, в которой перечислены все свойства диалога. Вот объявление этого типа:

Type OPENFILENAME
    StructSize As Long
    Owner As Long
    Instance As Long
    Filter As String
    CustomFilter As Long
    MaxCustrFilter As Long
    FilterIndex As Long
    File As String
    MaxFile As Long
    FileTitle As String
    MaxFileTitle As Long
    InitialDir As String
    Title As String
    Flags As Long
    FileOffset As Integer
    FileExtension As Integer
    DefExt As String
    CustrData As Long
    Hook As Long
    TemplateName As Long
End Type

    Теперь надо просто объявить какую-нибудь переменную этого типа, задать ей свойства и передать её в качестве параметра. Пример программы ниже.

'Переменная с полученным путём до файла
Dim File As String
'Фильтр файлов
Dim CommDlgF As String * 512
'Переменная для передачи API функции
Dim OpenFileName As OPENFILENAME
'Буфер для обработки строки
Dim Buf As Variant

CommDlgF = "Текстовые файлы|*.txt"

'Номер формы
OpenFileName.Owner = Me.hWnd
OpenFileName.Instance = 0
OpenFileName.CustomFilter = 0
OpenFileName.MaxCustrFilter = 0
OpenFileName.Hook = 0
OpenFileName.TemplateName = 0
OpenFileName.CustrData = 0
'Длина файла
OpenFileName.File = String$(512, 0)
OpenFileName.MaxFile = 511

    Далее должны присвоить параметр фильтра переменной OpenFileName, но в отличие от фильтра в ActiveX компоненте, разделителем между названием типа и расширением файла служит не символ "|", а нулевой (vbNullChar). Поэтому это вызывает некоторые сложности при указании фильтра, но для тех, кто привык к "|" пишем следующий код.

If Len(CommDlgF) > 0 Then
    For I = 1 To Len(CommDlgF)
        If Mid(CommDlgF, I, 1) = "|" Then
            Buf = Buf + vbNullChar
        Else
            Buf = Buf + Mid(CommDlgF, I, 1)
        End If
    Next I
    CommDlgF = Buf
End If

    Здесь всё просто. Если мы указали фильтр, то проходимся по всей строке и заменяемсимвол "|" на нулевой.

'Присваиваем фильтр
OPENFILENAME.Filter = CommDlgF
'Присваиваем заголовок окна
OPENFILENAME.Title = "Открытие файла"
'Каталог по умолчанию
OPENFILENAME.InitialDir = "c:\"
'Другие свойства диалога
OPENFILENAME.Flags = &H0
'Длина всей переменной
OPENFILENAME.StructSize = Len(OPENFILENAME)

If GetOpenFileName(OpenFileName) = True Then
    Buf = InStr(1, OPENFILENAME.File, Chr(0))
    MsgBox "Вы выбрали " & Left(OpenFileName.File, Buf - 1)
Else
    MsgBox "Ошибка"
End If

Таблица с некоторыми значениями параметра Flags

&H2000 Этот флаг устанавливает, что диалоговое окно сообщает пользователю об отсутствии файла и предлагает его создать ("Файл такой-то не существует. Создать его?").
&H1000 Указывает, что пользователь может выбрать только существующий файл или увидит сообщение "Файл не существует. Проверьте правильность имени файла".
&H10 Показывает кнопку справки.
&H4 Прячет галочку "Только чтение".
&H200000 Использование длинных имён файлов.
&H8 Заставляет открыть диалог в том же каталоге, в котором он был открыть первый раз.
&H40000 Не использовать длинных имён файлов.
&H100 Можно использовать любые символы при указании имени файла.
&H4000 Игнорирует ошибки.

    Вот в принципе и всё. Исходник можно скачать тут.

API функции

Функция CharUpper

Описание: Конвертирует все символы из нижнего регистра в верхний.
Объявление: Declare Function CharUpper Lib "user32" Alias "CharUpperA" (ByVal lpsz As String) As String
Параметры: lpsz
Строка для конвертации в верхний регистр

Возвращаемое значение: Функция возвращает строку со всеми буквами нижнего регистра, конвертируемые в верхний регистр

Функция ClipCursor

Описание: ClipCursor ограничивает область действия курсора мыши в прямоугольной области экрана. Если пользователь попробует переместить курсор за пределы этой области ограничения или вызвать функцию SetCursorPos, то курсор немедленно возвратится в область. Этот эффект ограничения будет действовать в любой программе, на которую Вы переключаетесь и останется, даже если программа, которая ограничила курсор, закрывается! Единственный способ "выпустить" курсор состоит в том, чтобы "ограничить" область полным экраном. Это не очень хорошая идея ограничивать курсор, так как пользователь желает перемещать курсор куда-нибудь за пределы вашей программы.
Объявление:
Declare Function ClipCursor Lib "user32" (lpRect As RECT) As Long) As Long

Type RECT
    left As Long
    top As Long
    right As Long
    bottom As Long
End Type
Параметры: lpRect
Прямоугольник (в экранных координатах), определяющий прямоугольник ограничения

Возвращаемое значение: В случае ошибки функция возвращает 0. В успешном случае функция возвращает значение, отличное от нуля.


Ссылки

Program Studio
Всё для программиста и WEB дизайнера.

DS Visual Basic
Всё для программиста!

Присылайте свои ссылки с описанием на e-mail или просто добавьте их в каталог ссылок, и они будут опубликованы в этом разделе.

Сайт рассылки: Program Studio
Автор: Павел

Ваши предложения можете присылать на prs@narod.ru.

Хотите опубликоваться? Присылайте свои статьи на prs@narod.ru и получите гонорар от 200 до 2000 показов RLE.
Hosted by uCoz