Příklady

Práce s CD Modul
Práce s joystickem Modul
Přehrávání multimediálních souborů Třída
K čemu je API funkce BitBLT Kód
Jak udělat "negativ" Kód
Potřebujete vybrat pravoúhlou oblast ? Kód
Rychlé vykreslení elipsy nebo kružnice Kód
Rychlé vykreslení mnohoúhelníku Kód
Zjištění pozice kurzoru Kód
Přehrávání menších zvukových souborů Kód
Nevíte, jestli má počítač zvukovou kartu ? Kód

Práce s CD

Obsahuje základní funkce pro práci s hudebními CD.
8871 bytů Kopírovat

Práce s joystickem

Modul obsahuje deklaraci některých základních API funkcí pro práci s joystickem a několik vlastních funkcí. Bohužel se mi nepodařilo sehnat joystick a tak si nejsem příliš jist funkčností tohoto modulu.
3453 bytů Kopírovat

Přehrávání multimediálních souborů

Pomocí této třídy můžete přehrávat multimediální soubory. Např. WAV, AVI atd.
8539 bytů Kopírovat

K čemu je API funkce BitBLT

API funkce BitBLT rychle přesouvá pravoúhlou oblast pixelů z jedné oblasti do druhé. Např. z formuláře do jiného formuláře nebo rámečku apod.

Omlouvám se, pokud vzniknou nějaké nepřesnosti při výkladu konstant parametru dwRop, nejsem až tak moc zběhlý v teorii počítačové grafiky.

Public Declare Function BitBlt Lib "gdi32" Alias "BitBlt" _
       (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, _
	ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, _
	ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long

'hDestDC	handle kontextu zařízení - jinak řečeno kam kopírovat
'x		levý horní roh cílové oblasti
'y		pravý horní roh cílové oblasti
'nWidth		šířka zdrojové a cílové oblasti
'nHeight	výška zdrojové a cílové oblasti
'hSrcDC		handle kontextu zařízení - odkud kopírovat data
'xSrc		levý horní roh zdrojové oblasti
'ySrc		pravý horní roh zdrojové oblasti
'dwRop		parametr, jak vykreslovat obrázek

'konstanty parametru dwRop
Public Const BLACKNESS = &H42 		'vyplní cílovou oblast barvou s indexem 0
					've fyzické paletě (default černá)
Public Const DSTINVERT = &H550009       'invertuje cílovou oblasti
Public Const MERGECOPY = &HC000CA       'spojí barvu určené palety se zdrojem pomocí AND
Public Const MERGEPAINT = &HBB0226      'spojí inverzní zdroj s cílem pomocí operátoru OR
Public Const NOTSRCCOPY = &H330008      'kopíruje inverzní zdrojovou oblast
Public Const NOTSRCERASE = &H1100A6     'zkombinuje barvu zdroje a cíle použitím
					'operátoru OR a výsledek invertuje
Public Const PATCOPY = &HF00021 	'kopíruje určenou paletu do cílové bitmapy
Public Const PATINVERT = &H5A0049       'kombinuje určenou paletu a cíl pomocí operátoru XOR
Public Const PATPAINT = &HFB0A09        'kombinuje určenou paletu se zdrojem pomocí OR a
					'výsledek kombinuje s cílovou oblastí
Public Const SRCAND = &H8800C6  	'kombinuje zdroj a cíl pomocí AND
Public Const SRCCOPY = &HCC0020 	'zkopíruje zdrojovou oblast do cílové
Public Const SRCERASE = &H440328        'kombinuje inverzní barvu cíle s barvou zdroje pomocí AND
Public Const SRCINVERT = &H660046       'kombinuje zdrojovu a cílovou barvu pomocí XOR
Public Const SRCPAINT = &HEE0086        'kombinuje barvu zdroje a cílu pomocí OR
Public Const WHITENESS = &HFF0062	'vyplní cílovou oblast barvou s indexem 1
					've fyzické paletě (default bílá)

Jak udělat "negativ"

Potřebujete-li udělat k Vašemu obrázku jeho inverzní podobu, není nic jednoduššího než API funkce InvertRect. Tato funkce používá logickou operaci NOT pro každý pixel vybrané oblasti. Na černobílém monitoru změní černou barvu na bílou a naopak. Zde je deklarace funkce:

Public Declare Function InvertRect Lib "user32" Alias "InvertRect" _
       (ByVal hdc As Long, lpRect As RECT) As Long

Public Type RECT
  Left As Long
  Top As Long
  Right As Long
  Bottom As Long
End Type

Potřebujete vybrat pravoúhlou oblast ?

Potřebujete-li vybrat nějakou pravoúhlou oblast, musíte uživateli umožnit vykreslit obdélník, pomocí něhož si může oblast vybrat a to pomocí API funkce DrawFocusRect. Jak to vypadá, si můžete vyzkoušet sami, když kliknete třeba na plochu Windows a táhnete myší. Použijete-li tuto funkci poprvé, vykreslí se obdélník, podruhé se stejnými souřadnicemi se obdélník překreslí barvou pozadí, tj. vymaže se. Funkce má velice jednoduché parametry, takže uvedu jen její deklaraci.

Public Declare Function DrawFocusRect Lib "user32" _
       (ByVal hdc As Long, lpRect As RECT) As Long

Public Type RECT
  Left As Long
  Top As Long
  Right As Long
  Bottom As Long
End Type
Použití může vypadat třeba takto: (picture1 musí mít ScaleMode nastaveno na Pixel)
Private x1 As Long
Private x2 As Long
Private y1 As Long
Private y2 As Long

Private obdelnik As RECT

Private Sub Picture1_MouseDown(Button As Integer, _
	Shift As Integer, X As Single, Y As Single)
  If Button = vbLeftButton Then
    x1 = X
    y1 = Y
  End If
End Sub

Private Sub Picture1_MouseMove(Button As Integer, _
	Shift As Integer, X As Single, Y As Single)
  If Button = vbLeftButton Then
    'Smazani stareho obdelniku
    If (y2 <> 0 Or x2 <> 0) Then DrawFocusRect Picture1.hdc, obdelnik
    
    x2 = X: y2 = Y
    
    With obdelnik
      .Left = x1
      .Right = x2
      .Top = y1
      .Bottom = y2
    End With

    DrawFocusRect Picture1.hdc, obdelnik
  End If
End Sub

Rychlé vykreslení elipsy nebo kružnice

Na nakreslení elipsy nebo kružnice se ve Windows používá API funkce Ellipse. Její použití je jednoduché. Jen nezapomeňte nastavit vlastnost ScaleMode prvku, na který ji chcete vykreslit na Pixel.

Private Declare Function Ellipse Lib "gdi32" _
	(ByVal hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, _
	 ByVal X2 As Long, ByVal Y2 As Long) As Long
Příklad použití:
Ellipse Picture1.hDC, 1, 1, 100, 100	'Vykreslí kružnici jejíž 
					'průměr je 100 pixelů

Rychlé vykreslení mnohoúhelníku

Mnohoúhelník se dá ve Windows jednoduše nakreslit pomocí API funkce Polygon. Parametry jsou: hDC zařízení, ukazatel na první prvek v poli, počet prvků v poli. Nezapomeňte opět nastavit vlastnost ScaleMode na Pixel.

Public Declare Function Polygon Lib "gdi32" Alias "Polygon" _
       (ByVal hdc As Long, lpPoint As POINTAPI, ByVal nCount As Long) As Long

Public Type POINTAPI
  x As Long
  y As Long
End Type
Příklad:
Dim vrchol(1 to 3) As POINTAPI

vrchol(1).x=1
vrchol(1).y=3
.....

Polygon(Me.hDC,vrchol(1),3)

Zjištění pozice kurzoru

Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long

Type POINTAPI
  X As Long
  Y As Long
End Type

Přehrávání menších zvukových souborů

Pro přehrávání menších zvukových souborů je výhodné použít API funkci sndPlaySound. Zde je její deklarace a několik základních konstant pro parametr uFlags:

Public Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" _
       (ByVal lpszSoundName As String, ByVal uFlags As Long) As Long

Public Const SND_ASYNC = &H1         
Public Const SND_LOOP = &H8         
Public Const SND_NODEFAULT = &H2         
Public Const SND_SYNC = &H0         

Následující kód přehraje soubor media.wav. Konstanta SND_SYNC způsobí, že program bude pokračovat až po přehrátí zvuku.
sndPlaySound ("media.wav", SND_SYNC)
Nechcete-li čekat na ukončení přehrávání, musíte nastavit parametr uFlags na SND_ASYNC.
sndPlaySound ("media.wav", SND_ASYNC)
V případě, že soubor nebude nalezen, přehraje se standardní (default) systémový zvuk (to platí jak pro SND_SYNC, tak i pro SND_ASYNC). Jestli není žádný definován, funkce skončí chybou. Nechcete-li v případě nenalezení souboru přehrávat default zvuk, přidejte ještě konstantu SND_NODEFAULT.
sndPlaySound ("media.wav", SND_SYNC + SND_NODEFAULT)
Přehrávat můžete také systémové zvuky pod jejích jménem. Doopravdy to funguje tak, že funkce sndPlaySound nejdříve hledá parametr lpszSoundName v systémových zvucích a až potom jako soubor na disku.

Soubor může být přehráván také ve smyčce, tj. pořád dokola.

sndPlaySound ("media.wav", SND_LOOP + SND_ASYNC)
V tomto případě musí být uveden flag SND_ASYNC. Program pokračuje hned dále. Chcete-li přehrávání ukončit, zapište tento příkaz:
sndPlaySound (vbNull, 0)

Nevíte jestli má počítač zvukovou kartu ?

Na to je jednoduchá pomoc:

Declare Function waveOutGetNumDevs Lib "winmm.dll" Alias "waveOutGetNumDevs" () As Long

Dim i As Integer 

i = waveOutGetNumDevs()
If i > 0 Then 
	MsgBox "V počítači je zvuková karta.", vbInformation, "Test zvukové karty" 
Else
	MsgBox "V počítači není zvuková karta.", vbInformation,"Test zvukové karty" 
End If


© 1999 Vogel Publishing, s. r. o.