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

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

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

15.10.2001
Вышел двенадцатый выпуск рассылки. Добавлена статья "DirectSound в VB" и ещё один JavaScript.


Уважаемые читатели!
После длительного перерыва выходит очередной выпуск рассылки. Мы надеемся, что Вы поможете её развитию, прислав нам Ваши материалы. По всем вопросам обращайтесь на prs@narod.ru.



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

Имя: Сергей
E-mail: vlas@fm.com.ua
Вопрос:
Как с помощью VB работать организовать отправку E-mail?
Ответить

Имя: VITALIY
E-mail: foma_tar@mail.ru
Вопрос:
Можно ли запускать СЕРВЕР УДАЛЕННОГО ДОСТУПА в режиме РАЗРЕШИТЬ УДАЛЕННЫЕ ПОДКЛЮЧЕНИЯ по расписанию (Без участия пользователя) и в режиме ЗАПРЕТИТЬ УДАЛЕННЫЕ ПОДКЛЮЧЕНИЯ (в WIN98SE) ?, т.е. ВКЛ/ОТКЛ.
Ответить

Имя: Denis
E-mail: info_service@mtu-net.ru
Вопрос:
Как скрыть программу от других программ,анализирующих состояние памяти?Может быть перехватить с помощью hook вызовы ф-ций CreateToolhelp32Snapshot,Process32First,Process32Next?У кого есть соображения,поделитесь!
Ответить

Имя: Sergey
E-mail: vlas@fm.com.ua
Вопрос:
Полное описание WinSock (методы, свойства и т.д.)
Ответить

Имя: Ruslan
E-mail: rustar@takas.lt
Вопрос:
Текст вопроса: как сделать простенько shareware програмку?
Ответить

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


DirectSound в VB

    DirectSound является одной из составных частей DirectX и нужен для работы со звуком. Понять его работу и как он облегчает жизнь программисту можно на примере.

    Для начала нужно создать новый проект и добавить к нему библиотеку dx8vb.dll, затем создать новую форму и модуль. В нём, как обычно, пишем:

Option Explicit
Global DirectX As New DirectX8

    Затем объявляем объект DirectSound и массив буферов. Буфер - это место, где храниться звук. Например, в игре используется 3 буфера: один с музыкой, и два других со звуковыми эффектами. Так вот над буферами очень удобно работать: можно менять баланс, громкость и звуковой файл каждого их них.

Global DirectSound As DirectSound8
Global SoundBuffer() As DirectSoundSecondaryBuffer8

    Теперь надо создать процедуру, которая инициализирует DirectSound. Назовём её DXCreateSound.

Sub DXCreateSound(HWnd As Integer)
Set DirectSound = DirectX.DirectSoundCreate("")
DirectSound.SetCooperativeLevel HWnd, DSSCL_NORMAL
End Sub

    Здесь всё просто. Сначала мы создаём объект DirectSound, а затем устанавливаем кооперативный левел так, что другие программы тоже могут использовать DirectSound. Далее напишем процедуру, которая удаляет DirectSound.

Sub DXDestroySound()
Set DirectSound = Nothing
End Sub

    Создавать и удалять DS мы уже можем. Теперь хорошо бы написать процедуры непосредственно для работы со звуком. Сперва мы напишем процедуру для указания и определения количества звуковых буферов.

Sub DXSetSoundBuffers(Buffers As Integer)
ReDim Preserve SoundBuffer(Buffers)
End Sub

Function DXGetSoundBuffers() As Integer
DXGetSoundBuffers = UBound(SoundBuffer)
End Function

    Здесь мы просто изменяем или определяем количество элементов в массиве. Теперь можно написать процедуры для загрузки и проигрывания файлов.

Sub DXLoadSound(Buffer As Integer, SoundFile As String, HZ As Integer, Bit As Integer, Channels As Integer)
Dim BufferDesc As DSBUFFERDESC

BufferDesc.lFlags = DSBCAPS_CTRLFREQUENCY Or DSBCAPS_CTRLPAN Or DSBCAPS_CTRLVOLUME Or DSBCAPS_STATIC
BufferDesc.fxFormat.nFormatTag = 1 'WAVE_FORMAT_PCM
BufferDesc.fxFormat.nChannels = Channels
BufferDesc.fxFormat.lSamplesPerSec = HZ
BufferDesc.fxFormat.nBitsPerSample = Bit
BufferDesc.fxFormat.nBlockAlign = BufferDesc.fxFormat.nBitsPerSample / 8 * BufferDesc.fxFormat.nChannels
BufferDesc.fxFormat.lAvgBytesPerSec = BufferDesc.fxFormat.lSamplesPerSec * BufferDesc.fxFormat.nBlockAlign

Set SoundBuffer(Buffer) = DirectSound.CreateSoundBufferFromFile(SoundFile, BufferDesc)
End Sub

Sub DXPlaySound(BufferNum As Integer, PlayMode As Integer)
SoundBuffer(BufferNum).Play PlayMode
End Sub

Sub DXStopSound(BufferNum As Integer)
SoundBuffer(BufferNum).Stop
End Sub

    В первой процедуре мы сначала объявляем переменную BufferDesc, которая содержит всю информацию о текущем звуке. Потом меняем эти параметры в соответствии с указанными и создаём новый буфер. В DXPlaySound мы вызываем метод Play у указанного буфера для проигрывания звука, при это указываем ему в качестве параметра номер буфера и способ проигрывания: 0 - проиграть один раз, 1 - проигрывать бесконечно. В последней процедуре тоже самое, но вызывается метод Stop.

    Теперь напишем процедуры для изменения баланса и громкости буферов.

Sub DXSetSoundBufferPan(Buffer As Integer, PanVolume As Integer)
Select Case PanVolume
    Case 0
        SoundBuffer(Buffer).SetPan -10000
    Case 100
        SoundBuffer(Buffer).SetPan 10000
    Case Else
        SoundBuffer(Buffer).SetPan (100 * PanVolume) - 5000
End Select
End Sub

Sub DXSetSoundBufferVolume(Buffer As Integer, Volume As Integer)
SoundBuffer(Buffer).SetVolume (60 * Volume) - 6000
End Sub

    Здесь кончается написание кода для модуля. Теперь приступим к форме. Создайте и расположите элементы управления примерно как на рисунке.

Для отображения рисунка откройте рассылку в Onlin'е


    Поменяйте параметр Name у кнопок на "Play" с индексами от 0 до 3, у полос прокрутки громкости на "Vol", у полос прокрутки баланса на "Pan", у надписей, отображающих их состояние на "VolV" и "PanV" также с индексами 0-3. Теперь напишем код для Form_Load и Form_Unload.

Private Sub Form_Load()
'Инициализируем DirectSound
DXCreateSound Me.HWnd
'Устанавливаем количество буферов
DXSetSoundBuffers 3

'Загружаем 4 звука в 4 буфера
DXLoadSound 0, App.Path & "\Sounds\bigwarning.wav", 11025, 8, 1
DXLoadSound 1, App.Path & "\Sounds\sparks.wav", 11025, 8, 1
DXLoadSound 2, App.Path & "\Sounds\dronemachine3.wav", 11025, 8, 1
DXLoadSound 3, App.Path & "\Sounds\labdrone1.wav", 11025, 8, 1
End Sub

Private Sub Form_Unload(Cancel As Integer)
'Уничтожаем DS
DXDestroySound
End Sub

    Теперь код для кнопок.

Private Sub Play_Click(Index As Integer)
If Play(Index).FontBold = False Then
    Play(Index).FontBold = True
    DXPlaySound Index, 1
Else
    Play(Index).FontBold = False
    DXStopSound Index
End If
End Sub

    Здесь мы определяем параметр FontBold у кнопки: если False, то звук не играет. Тогда параметру FontBold присваивается значение True, и начинает играть звук. Если параметр FontBold True, то всё наоборот.

Private Sub Vol_Change(Index As Integer)
DXSetSoundBufferVolume Index, Vol(Index).Value
VolV(Index).Caption = Vol(Index).Value
End Sub

Private Sub Vol_Scroll(Index As Integer)
Vol_Change Index
End Sub

    В процедуре Vol_Change мы меняем громкость буфера и отображаем текущее состояние. Во второй процедуре мы обращаемся к первой, чтобы изменять громкость во время перемещения полосы прокрутки мышкой.

Private Sub Pan_Change(Index As Integer)
DXSetSoundBufferPan Index, Pan(Index).Value
PanV(Index).Caption = Pan(Index).Value - 50
End Sub

Private Sub Pan_Scroll(Index As Integer)
Pan_Change Index
End Sub

    Здесь тоже самое, только с балансом.

    Теперь программа должна работать. Сохраните её перед запуском на всякий случай (при некоторых ошибках VB вылетает) и посмотрите, что получилось. Во время работы программа должна выглядеть примерно так.

Для отображения рисунка откройте рассылку в Onlin'е


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

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



API функции

Функция ShowCursor

Описание: Функция показывает или скрывает курсор мыши.
Объявление: Declare Function ShowCursor Lib "user32" (ByVal bShow As Long) As Long
Параметры: bShow
Если False, то курсор невидим, если True - курсор видим

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

Функция SwapMouseButton

Описание: SwapMouseButton меняет левую и правую кнопки мыши.
Объявление: Declare Function SwapMouseButton Lib "user32" (ByVal bSwap As Long) As Long
Параметры: bSwap
Определяет настройки кнопки мыши. Значение 0 не меняет кнопки. Значение 1 меняют левые и правые кнопки.

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


Java Script'ы

Мигающий текст:

<html>
<head>
<script>
var sR = 1;
var sG = 7;
var sB = 0;
var R = 255;
var G = 255;
var B = 255;
var b = true;

function h(color)
{
hn = new Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A" ,"B", "C", "D", "E", "F")
if (color < 0)
    {return "00"}
    else if (color > 255) {return "FF"}
else
    {
        s = "" + hn[Math.floor(color/16)] + hn[color%16]
        return s
    }
}

function toH(red, green, blue) {return h(red) + h(green) + h(blue)}

function RGB(red, green, blue) {return toH(red, green, blue)}

function setButtonColor(r, g, b) {document.all["button"].style.color = RGB(r, g, b)}

function startChanging()
{
if(b == true)
    {
    if((R > 256)||(G > 256)||(B > 256))
        {
        b = false;
        }
    R += sR; G += sG; B += sB;
    }
else
    {
    if((R < 0) || (G < 0) || (B < 0))
    {
        b = true;
    }
    R -= sR; G -= sG; B -= sB;
    }
setButtonColor(R, G, B);
setTimeout("startChanging()", 1)
}
</script>
</head>

<body onload="startChanging()">
<a name=button>Мигающий текст</a>
</body>
</html>



Ссылки

GeoHOST.RU
Профессиональный хостинг!

Visual Basic Helper
Статьи, примеры, исходные коды программ, ActiveX, приколы, API и ещё много чего!




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



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

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

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