Программирование и дизайн
Выпуск #10
7 июля, 2001 г.
Сайт рассылки: http://prs.narod.ru - всё для программиста и дизайнера.
Всего подписчиков: ~3650

В этом выпуске

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

07.07.2001 Вышел десятый выпуск рассылки.
Теперь Вы можете скачать все выпуски рассылки начиная с первого в одном архиве!
Новая статья "Direct Input в VB".


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

Имя: Dima
E-mail: nikulindm@mail.ru
Вопрос:
Как использовать Chart or MsChart. Интересует все относительно объектов и подключения Бд. По возможности подробнее. Спасибо!
Ответить

Имя: Alex
E-mail: alex_rabotiajev@mtu-net.ru
Вопрос:
Как сделать чтоб при изменении расширения форма и элементы формы соответствовали своему состоянию на момент проектирования.Просто если делать форму 800х600 при просмотре ее в режиме 1024х768 она маленькая и наоборот?
Ответить

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


Direct Input в VB

    Direct Input, как все уже догадались, нужен для работы с устройствами ввода, например с клавиатурой и мышкой. Почему нельзя обойтись стандартными средствами Visual Basic? Потому что вы не сможете обрабатывать одновременно 5 нажатых клавиш. Например когда вы играете в какую-нибудь игру, вы, к примеру, бежите вперёд, одновременно заворачиваете направо и стреляете. Такое сделать чисто на VB нельзя. Поэтому мы используем DirectX.

    В этой статье мы сделаем небольшую программу, которая продемонстрирует работу Direct Input. Для начала создаём новый проэкт. Изменяем свойство ScaleMode формы на "3 - Pixel". Теперь помещаем на форму 2 Label'а рядом в верхней части формы и 1 PictuteBox в её центре. Имена объектов оставьте по умолчанию. Должно получиться примерно так:

Откройте страницу в Онлайне для загрузки картинки


    Теперь приступим к написанию кода программы. Чтобы работать с DirectX'ом, подключите файл dx8vb.dll (dx7vb.dll для 7-ого DirectX'а). Теперь создайте модуль. В нем напишем:

Option Explicit

Global DirectX As New DirectX8

Global Working As Boolean

Global DirectInput As DirectInput8
Global DirectInputDevice As DirectInputDevice8
Global DirectInputState As DIKEYBOARDSTATE

    Здесь мы сначала создали объект DirectX, а затем переменные типа DirectInput8, DirectInputDevice8 и DIKEYBOARDSTATE. Поскольку наша программа будет состоять из цикла, то переменная Working нужна для выхода их программы. Теперь начинаем писать функции. Сначала напишем функцию, которая создаёт объекты на основе созданных выше переменных.

    Создаём объект DirectInput:

Sub DX8CreateKeyboard(HWnd As Integer)
Set DirectInput = DirectX.DirectInputCreate()

    Теперь создаём устройство клавиатуры и устанавливаем формат приходящей информации мультииспользование (все программы могут использовать клавиатуру).

Set DirectInputDevice = DirectInput.CreateDevice("GUID_SysKeyboard")
DirectInputDevice.SetCommonDataFormat DIFORMAT_KEYBOARD
DirectInputDevice.SetCooperativeLevel HWnd, DISCL_BACKGROUND Or DISCL_NONEXCLUSIVE
DirectInputDevice.Acquire
End Sub

    Теперь функция для удаления объектов из памяти:

Sub DX8DestroyKeyboard()
Set DirectInput = Empty
Set DirectInputDevice = Empty
End Sub

    А теперь функция, ради которой мы и создавали 2 последние:

Function DX8GetKeyState(ByVal KeyNumber As Integer) As Boolean
DirectInputDevice.GetDeviceStateKeyboard DirectInputState
DX8GetKeyState = DirectInputState.Key(KeyNumber)
End Function

    Эта функция возвращает True или False в зависимости от того, нажата ли клавиша, код которой мы передали в качестве параметра функции. Эти коды клавиш не совпадают с ascii кодами. Чтобы определить код клавиш, можно написать такой код в Form_Load:

Private Sub Form_Load()
DX8CreateKeyboard Me.HWnd
Dim K As Integer
Me.Show

Do
    For K = 0 to 255
        If DX8GetKeyState(K) = True Then
            Label1 = K
        End If
    Next K
    DoEvents
Loop
End Sub

    Если вы испытаете эту программу, то увидмте что у стрелки вверх код развен 200, вниз - 208, влево - 203, а вправо - 205. Но это не цель нашей программы. Нам нужно, чтобы можно было нажимать сразу несколько кнопок. Для этого Изменяем Form_Load на этот:

Private Sub Form_Load()
DX8CreateKeyboard Me.HWnd
Me.Show
Working = True
Do
    If DX8GetKeyState(200) = True Then
        Label1 = "200"
        Picture1.Top = Picture1.Top - 1
    End If
    If DX8GetKeyState(208) = True Then
        Label1 = "208"
        Picture1.Top = Picture1.Top + 1
    End If
    If DX8GetKeyState(203) = True Then
        Label1 = "203"
        Picture1.Left = Picture1.Left - 1
    End If
    If DX8GetKeyState(205) = True Then
        Label1 = "205"
        Picture1.Left = Picture1.Left + 1
    End If
    If DX8GetKeyState(157) = True Then
        Label1 = "157"
        Picture1.BackColor = RGB(255, 0, 0)
    End If
    If DX8GetKeyState(157) = False Then
        Picture1.BackColor = RGB(192, 192, 192)
    End If

    Label2 = "X: " & Picture1.Left & _
                "; Y: " & Picture1.Top

    DoEvents
    If Working = False Then Exit Do
Loop
DX8DestroyKeyboard
End Sub

    Сначала мы создаём Direct Input вызовом функции DX8CreateKeyboard, затем показываем форму и присваиваем значение True переменной Working. Далее начинается цикл, в котором мы наблюдаем за стрелками на клавиатуре и кнопкой Ctrl. При нажатии/отжатии кнопок, меняются свойства Picture1. Теперь программа для Form_Unload:

Private Sub Form_Unload(Cancel As Integer)
Working = False
End Sub

    Тут и объяснять не надо.

    Работающая программа должна выглядеть как на рисунке:

Откройте страницу в Онлайне для загрузки картинки


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

Автор: Павел Николаевич
E-mail: pasha_nik@mail.ru

API функции

Функция MoveFile

Описание: MoveFile перемещает или переименовывает файл или папку. Если переименовывается или перемещается папка, то переименовываются или перемещаются все подпапки (изменяются пути к подпапкам).
Объявление: Declare Function MoveFile Lib "kernel32" Alias "MoveFileA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String) As Long
Параметры: lpExistingFileName
Файл или папка для перемещения или переименовывания

lpNewFileName
Новое имя для файла или папки

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

Функция FindWindow

Описание: FindWindow ищет все окна, которые соответствуют имени класса окна и/или названию (заголовку) окна. Механизм поиска функции не чувствителен к регистру. Если Вы не желаете определять имя класса или заголовок окна, Вы должны использовать пустой указатель, как признак его незначимости (vbNullString).
Объявление: Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As Any, ByVal lpWindowName As Any) As Long
Параметры: lpClassName
Имя класса окна. Используйте vbNullString, чтобы игнорировать класс окна

lpWindowName
Имя окна (заголовок в верхней части окна). Используйте vbNullString, чтобы игнорировать заголовок окна

Возвращаемое значение: Если произошла ошибка, или соответствующее окно не было найдено, функция возвращает 0. При успешной операции, функция возвращает дескриптор найденного окна.


Ссылки

Исходники для VB
Исходные коды программ на Visual Basic.

Visual Basic Helper
Visual Basic Helper - помощь по VB для новичков и нетолько.

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



Подписка на рассылку "Мир программирования на Visual BASIC и HTML".
Архив рассылок

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

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

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