|
В этом выпуске
Новости сайта
Вопрос-ответ
Имя: 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
Функция 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 или
просто добавьте их в каталог ссылок, и они будут опубликованы в этом разделе.
|