Původně jsem měl v plánu vás seznámit s tvorbou elips a kruhů, které jsou necelé, jenže plány se mění. Sice by to byla možnost, ale určitě víc využijete kruhů a elips, které jsou vevnitř vybarvené, a proto se podíváme prve na to, jak vybarvovat různé části obrázků, abychom mohli vytvářet plné elipsy a kružnice. Ale nebude na to psát vlastní funkci.
Psaní vlastní funkce by bylo moc zdlouhavé a složité. Proto využijeme API funkce ExtFloodFill. Kód bude vypadat takto:
Private Declare Function ExtFloodFill Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal crColor As Long, ByVal wFillType As Long) As Long
Private Sub Vybarvi(Img As PictureBox, X As Single, Y As Single, mode As Boolean, clr As Long, gclr As Long)
On Error Resume Next
Imgp = Img.Point(X, Y)
Img.FillColor = clr
Img.FillStyle = vbSolid
If mode = True Then
rtn = ExtFloodFill(Img.hdc, X, Y, gclr, 0)
End If
If mode = False Then
rtn = ExtFloodFill(Img.hdc, X, Y, Imgp, 1)
End If
End Sub
Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Vybarvi Picture1, X, Y, True, &H663322, 0
End Sub
Co tento kód umí? No umí vybarvovat části obrázků, které mají něco společného. To, čím bude tato společná vlastnost, má na starost parametr mode. Pokud bude mít hodnotu False, bude se vybarvovat každá plocha, která má stejnou barvu a je spojená. Pokud ale dáme do parametru mode True, budeme využívat speciální typ vybarvování a ten funguje tak, že se vybarví určitá část ohraničená nějakou barvou. Zatím nepočítejte s tím, že by se brala v potaz tolerance nebo tak, to už jsou techniky pokročilejší, na které si budeme muset psát vlastní algoritmy anebo si hledat knihovny.
Ještě bych se vrátil ke kódu a popsal parametry. První z nich (Img) určuje obrázek, ve kterém pracujeme. X a Y určují souřadnice. Mode, jak jsem psal, určuje mód vybarvování, Clr barvu, kterou se vybarvuje a poslední gclr se používá, jen když je mode na true a určuje barvu ohraničení, kterým se vybarvování řídí.
Příště tedy ony slibované částečné kruhy a elipsy.