11.1 Metoda PSet
11.2 Metoda Line
11.3 Metoda Circle
11.4 Objekt Line
11.5 Objekt Shape
11.6 Vše dohromady aneb Malování "ala" DOS
11.7 Drag And Drop
11.8 Domácí úkol
11.9 V další lekci...
11.1 Metoda PSet
Metoda PSet se využívá u prvků PictureBox anebo se s ní dá vykreslovat přímo na formuláři. Tato metoda nám vykreslí jeden bod podle zadaných souřadnic. Pokud tuto metodu používáte, je důležité nastavit vlastnost AutoRedraw na True a vlastnost ScaleMode na hodnotu Pixel. Vykreslovat můžeme po jednotlivých bodech, buď tak, že prostě zadáme hodnoty, a ty jsou vykresleny, nebo můžeme použít cyklus nejlépe For a Next. Pokud pomocí metody PSet chcete vykreslit třeba přímku, může jeho zápis vypadat třeba takto:
Private Sub Form_Load()
For i = 1 To 80
Form1.PSet (10, i), RGB(250, 0, 0)
Next i
End Sub
Nás teď bude zajímat toto: Form1.PSet (10, i), RGB(250, 0, 0), takže Form1 nám říká, kam se to bude vykreslovat, PSet je druh metody, čísla v závorkách nám říkají souřadnice bodu, první na ose x a druhé na ose y. Poslední nám udává barvu. Zde je použita barva ve formátu RGB. Myslím, že nic víc není potřeba, proto se pustíme do něčeho velmi podobného, a to je metoda Line.
11.2 Metoda Line
Metoda Line se od PSet liší jen pár vymoženostmi a na ně se hned podíváme. Line je, jak název napovídá, úsečka, proto bude tvořena dvěma koncovými body. A musí se zapsat oba. Takže základní zápis vypadá např. takto:
Form1.Line (20, 20)-(50, 25), RGB(0, 150, 0)
Zde zadáváte souřadnice prvního bodu v jedněch závorkách a druhého v druhých a nakonec zase barvu. To ale není vše, protože pomocí této metody se dají vytvářet také obdélníky a čtverce, a to následovně:
Form1.Line (20, 20)-(50, 25), RGB(0, 150, 0), B
Takže pouhým přidáním B se vytvoří v našem případě obdélník a tento obdélník může být i plný, kód potom bude vypadat takto:
Form1.Line (20, 20)-(50, 25), RGB(0, 150, 0), BF
Tak to by bylo vše z metody Line.
11.3 Metoda Circle
Touto metodou se vykreslují kruhy. Její kód je již trošku složitější, ale jen pokud budeme chtít zabrouzdat až do detailů, takže v základě bude kód vypadat případně takto:
Form1.Circle (20, 20), 10, RGB(0, 0, 250)
Tento kód nám vykreslí kružnici o poloměru 10 pixelů se středem v bodě x = 20 , y = 20, v modré barvě. Dále si můžeme určit, jaká část kružnice se má vykreslit, respektive ve které části se má začít a ve které skončit.
Form1.Circle (20, 20), 10, RGB(0, 0, 250), 3.14, 6.2
Pracuje se zde s radiány, to znamená, že kružnici začneme vykreslovat až od půlky a nedotáhneme ji úplně do konce. Pokud chcete vidět, jak vypadá skoro celá kružnice, ale se zápisem posledních dvou hodnot, tak třeba takto:
Form1.Circle (20, 20), 10, RGB(0, 0, 250), 0, 6.27
Půlkruhy takto:
Form1.Circle (20, 20), 10, RGB(0, 0, 250), 3.14, 6.28
Form1.Circle (20, 20), 10, RGB(0, 0, 250), 0, 3.14
Form1.Circle (20, 20), 10, RGB(0, 0, 250), 1.57, 4.71
To ale nejsou všechny možnosti, které nám metoda Circle nabízí, má také možnost zploštění, a to buď z vrchu, nebo z boku takto:
Form1.Circle (20, 20), 10, RGB(0, 0, 250), , , 3
Form1.Circle (20, 20), 10, RGB(0, 0, 250), , , 1 / 3
Mezi čárkami mohou být ještě hodnoty pro začátek a konec kružnice. První nám kruh zploští z boku, druhá z vrchu. Pro stejné zploštění se používá obrácených hodnot. To znamená, že když je hodnota větší než jedna, tak se kružnice zploští z boku, a pokud je menší než jedna, tak shora. Když tedy kružnici zploštíme z boku a zadaná hodnota bude 3, tak pro stejnou hodnotu zploštění shora bude 1/3.
11.4 Objekt Line
Objekt Line je prakticky totéž jako Metoda Line, má ale některé odlišnosti a používá se především jako oddělovací čára u formulářů mezi jednotlivými objekty. Základními vlastnostmi, se kterými můžeme pracovat, jsou souřadnice obou bodu x1,y1,x2,y2. Dále je to barva, tloušťka čáry a typ čáry (plná, přerušovaná, tečkovaná, čerchovaná).
Tady je taková legrácka, něco jako spořič obrazovky:
Dim yl1
Dim yl2
Dim xl1
Dim xl2
Dim fast1
Dim fast2
Dim fast3
Dim fast4
Dim pocet
Dim r
Dim g
Dim b
Private Sub Form_Click()
End
End Sub
Private Sub Form_Load()
Form1.BackColor = &H0
Form1.AutoRedraw = True
Line1.BorderWidth = 5
Form1.ScaleMode = 3
Randomize Timer
fast1 = Rnd
fast2 = Rnd
fast3 = Rnd
fast4 = Rnd
r = 255
g = 255
b = 255
Do
Line1.BorderColor = RGB(r, g, b)
DoEvents
Form1.Show
If xl1 = 0 Then Line1.X1 = Line1.X1 + 5 * fast1
If xl1 = 1 Then Line1.X1 = Line1.X1 - 5 * fast1
If xl2 = 0 Then Line1.X2 = Line1.X2 + 5 * fast2
If xl2 = 1 Then Line1.X2 = Line1.X2 - 5 * fast2
If yl1 = 0 Then Line1.Y1 = Line1.Y1 + 5 * fast3
If yl1 = 1 Then Line1.Y1 = Line1.Y1 - 5 * fast3
If yl2 = 0 Then Line1.Y2 = Line1.Y2 + 5 * fast4
If yl2 = 1 Then Line1.Y2 = Line1.Y2 - 5 * fast4
Form1.Refresh
For i = 1 To 5000
DoEvents
Next i
If Line1.X1 > Form1.ScaleWidth Then xl1 = 1
If Line1.X2 > Form1.ScaleWidth Then xl2 = 1
If Line1.X1 < 0 Then xl1 = 0
If Line1.X2 < 0 Then xl2 = 0
If Line1.Y1 > Form1.ScaleHeight Then yl1 = 1
If Line1.Y2 > Form1.ScaleHeight Then yl2 = 1
If Line1.Y1 < 0 Then yl1 = 0
If Line1.Y2 < 0 Then yl2 = 0
pocet = pocet + 1
If pocet = 500 Then
pocet = 0
fast1 = Rnd
fast2 = Rnd
fast3 = Rnd
fast4 = Rnd
End If
If clr = 0 Then
r = r - 5
If r <= 6 Then clr = 1
End If
If clr = 1 Then
g = g - 5
If g <= 10 Then clr = 2
End If
If clr = 2 Then
b = b - 5
If b <= 6 Then clr = 3
End If
If clr = 3 Then
r = r + 5
If r >= 249 Then clr = 4
End If
If clr = 4 Then
g = g + 5
If g >= 249 Then clr = 5
End If
If clr = 5 Then
b = b + 5
If b >= 249 Then clr = 0
End If
Loop
End Sub
Tak to byla ukázka k Line, jež by mohla být celkovým názorným příkladem, který už moc vysvětlování nepotřebuje.
11.5 Objekt Shape
Je podobný objektu Line, ale nahrazuje větší počet objektů. Můžeme pomocí něj vytvořit ovál, kruh, čtverec, obdélník, zaoblený čtverec a zaoblený obdélník. Má navíc ještě nějaké další vlastnosti. Ty, které nás budou zajímat, jsou BackStyle, ten umožňuje objekt vyplnit barvou. Dále je to BackColor, tím si navolíme barvu výplně. Potom je tu FillStyle, ten umožňuje různé šrafování a pomocí FillColor si volíme barvu šrafování. Nejdůležitější je ale samotná vlastnost Shape, v níž si volíme, jaký tvar bude výsledný objekt mít.
11.6 Vše dohromady aneb Malování "ala" DOS
Tohle je jen taková inspirace, můžete se pokusit to opravit tak, abyste mohli vybírat barvy a zkuste to udělat jen pomocí Shape, Line a PSet. Tím si procvičíte podmínky a používání Shape a Line. Ted už jen ten slibovaný kód, a proto si na formulář ještě vložte jeden objekt Shape.
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = 38 Then Shape1.Top = Shape1.Top - 135
If KeyCode = 37 Then Shape1.Left = Shape1.Left - 135
If KeyCode = 40 Then Shape1.Top = Shape1.Top + 135
If KeyCode = 39 Then Shape1.Left = Shape1.Left + 135
If KeyCode = 13 Then Form1.Line (Shape1.Left, Shape1.Top)- _
(Shape1.Left + 135, Shape1.Top + 135), &HFF00, BF
If KeyCode = 27 Then Form1.Line (Shape1.Left, Shape1.Top)- _
(Shape1.Left + 135, Shape1.Top + 135), &H0, BF
End Sub
Private Sub Form_Load()
Form1.AutoRedraw = True
Form1.BackColor = &H0
Shape1.BorderColor = &HFF
Shape1.BackStyle = 1
Shape1.BackColor = &HFF
End Sub
11.7 Drag And Drop
A nakonec lekce se podíváme na nepostradatelnou metodu Drag and Drop. Umožňuje nám myší chytit objekt a přesunout ho na jiné místo. Jen si představte Windows nebo hry bez možnosti použití této metody. Je opravdu hodně důležitá, proto se jí nevyhneme ani my. Tuto metodu si budeme procvičovat na objektu Image. Vložíme si jeden Image na formulář a vyzkoušíme si to nejjednodušší, přesunout objekt z jednoho na druhé libovolné místo. Jako pracovní objekt si na formulář vložíme jedno tlačítko a s ním budeme pracovat. Jeho vlastnost DragMode nastavíme na 1-Automatic. S tímto tlačítkem budeme pracovat na formuláři. To znamená, že s ním budeme objektem po formuláři pohybovat a pouštět. Takže nebudeme používat proceduru tlačítka, ale formuláře. Procedury jsou pro Drag And Drop dvě. První je DragOver a druhá je DragDrop. Zaprvé se budeme zabývat procedurou DragDrop. Pokud tedy chcete tlačítko na formuláři přesunout, musíte znát jeho souřadnice, ty dostanete přímo z procedury. Kód potom může vypadat třeba takto:
Private Sub Form_DragDrop(Source As Control, _
X As Single, Y As Single)
Command1.Move X, Y
End Sub
Procedura DragDrop tedy reaguje na upuštění objektu. Tenhle kód si již můžete vyzkoušet. Ale zatím není úplně optimální, protože tlačítko se nám sice posouvá, ale jeho levý horní roh se zarovnává ke kurzoru. To by se mělo opravit, protože takhle se snižuje přesnost. Tady je ukázka, která zarovná tlačítko tak, aby byl jeho střed v bodě kurzoru při puštění.
Private Sub Form_DragDrop(Source As Control, _
X As Single, Y As Single)
Command1.Move X - Command1.Width / 2, _
Y - Command1.Height / 2
End Sub
Ted si ukážeme něco, jako je vyhození souboru do koše, no prostě objekt necháme zmizet. Na formulář si přidáme ještě jeden prvek, třeba Image. A napíšeme následující kód:
Private Sub Image1_DragDrop(Source As Control, _
X As Single, Y As Single)
Command1.Visible = False
End Sub
Dále se věnujeme proceduře DragOver, ta se provede, pokud nad nějakým objektem přetáhneme pomocí metody Drag And Drop jiný objekt. Můžeme tam třeba změnit barvu objektu. Tady je taková legrace, zkombinovaná ze všeho dohromady. Tak z formuláře odstraňte Image, vložte na něj PictureBox a do něj vložte ImageBox, tak aby za ním PictureBox vytvořil tenký rámeček. A rámeček bude to, co se bude měnit při přetažení.
Private Sub Form_DragDrop(Source As Control, _
X As Single, Y As Single)
Command1.Move X - Command1.Width / 2, _
Y - Command1.Height / 2
End Sub
Private Sub Form_DragOver(Source As Control, _
X As Single, Y As Single, State As Integer)
Picture1.BackColor = &HFF1111
End Sub
Private Sub Form_Load()
Picture1.Appearance = 0
Picture1.BackColor = &HFF1111
End Sub
Private Sub Image1_DragDrop(Source As Control, _
X As Single, Y As Single)
Command1.Visible = False
Picture1.BackColor = &HFF1111
End Sub
Private Sub Image1_DragOver(Source As Control, _
X As Single, Y As Single, State As Integer)
Picture1.BackColor = &H1111FF
End Sub
To by byly základy Drag And Drop a tím pádem konec lekce.
11.8 Domácí úkol
Domácí úkol pro tuto lekci bude odlišný od těch ostatních a to dosti výrazně. Vaším úkolem totiž bude okomentovat kód z části 11.4 objekt Line a okomentovat toho
co nejvíc, čím víc, tím lepší známka. A proč vám dávám takový úkol? No zkrátka
proto, že programátor musí umět i kódy číst a nejen psát.
A nebude to vše, vaším druhým úkolem bude pokusit se tento kód zjednodušit. (Jde to, abyste si nemysleli, že po vás chci nemožné.)
11.9 V další lekcisi probereme funkce pro práci s čísly a vůbec se budeme zabývat matematikou, třeba vykreslováním grafů, a podíváme se i na logické operátory. A uděláme si digitální a ručičkové hodiny.