|
-
Oct 22nd, 2000, 12:59 PM
#1
Hi!
I'm working on a 3D-like progressbar but am experiencing problems with the ExtFloodFill function, so I threw it out. If anyone would like to have a look at my project and help me with it I'd greatly appreciate it. Tell me your e-mail adress and I'll send you a copy (Zip-file, about 4kb) to have a look at it.
Please help, anyone?
-
Oct 22nd, 2000, 02:58 PM
#2
Frenzied Member
Can i have a look at the floodfill code, i have used this before and it worked for me:
[email protected]
-
Oct 22nd, 2000, 06:20 PM
#3
Yes, but I'm using Extfloodfill.
I set the scalemode to vbPixels and am using the SURFACE constant to fill up an area. I set the crColor to the form's background color, but nothing happens. Any ideas? I'll post the code in a minute...
[Edited by RobIII on 10-22-2000 at 07:31 PM]
-
Oct 22nd, 2000, 06:31 PM
#4
I know it's a lot of code, but only the extfloodfillpart is where the problem is... Put this code in a class, and try for yourself: (Code for a form is below the classcode...)
Also note that the coordinates (20,20) are just for test purposes, I've tried lots of other possibilities...(Oh, and the comments are in Dutch...sorry fot that)
Code:
Option Explicit
' Api Constanten/Functies
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 Const FLOODFILLBORDER = 0
Private Const FLOODFILLSURFACE = 1
Private br3D_Top As Long
Private br3D_Left As Long
Private br3D_Width As Long
Private br3D_Height As Long
Private br3D_Angle As Byte
Private br3D_EmptyDarkColor As Long
Private br3D_EmptyLightColor As Long
Private br3D_FillDarkColor As Long
Private br3D_FillLightColor As Long
Private br3D_FillTopColor As Long
Private br3D_FillBottomColor As Long
Private br3D_LineColor As Long
Private br3D_TextColor As Long
Private br3D_Min As Long
Private br3D_Max As Long
Private br3D_ShowText As Boolean
Private br3D_Value As Long
Private br3D_OwnFrm As Form
Private OwnerSet As Boolean
' Default Kleuren
Private Const Def_EmptyDarkColor = 14706792
Private Const Def_EmptyLightColor = 16744576
Private Const Def_FillDarkColor = 8535190
Private Const Def_FillLightColor = 9192128
Private Const Def_FillTopColor = 10510496
Private Const Def_FillBottomColor = 8011916
Private Const Def_LineColor = 16769248
Private Const Def_TextColor = 8388700
' Default Uiterlijk en Gedrag
Private Const Def_Angle = 5
Private Const Def_Min = 0
Private Const Def_Max = 100
Private Const Def_ShowText = True
Private Const Def_MinHeight = 500
Private Const Def_MinWidth = 250
Private Sub DrawBar(Percentage As Byte)
Dim br3DOffset As Long
Dim br3DMid As Long
Dim br3DBarPos As Long
Dim TPPX As Long
Dim TPPY As Long
' "Backup" variabelen
Dim tmpFontBold As Boolean
Dim tmpForeColor As Long
Dim tmpAutoRedraw As Boolean
Dim tmpScalemode As Integer
' Ongeldige waardes afvangen...
If Percentage > 100 Then Exit Sub ' Kleiner als 0 kan niet, want type is byte.
With br3D_OwnFrm
' Oude waarde opslaan, dan autoredraw op True zetten
tmpAutoRedraw = .AutoRedraw
.AutoRedraw = True
' Stuk schoonmaken waar we gaan tekenen
br3D_OwnFrm.Line (br3D_Left, br3D_Top)-(br3D_Left + br3D_Width, br3D_Top + br3D_Height), .BackColor, BF
' Algemene berekeningen
br3DOffset = br3D_Width / br3D_Angle
br3DMid = (br3D_Width / 2) + br3D_Left
br3DBarPos = ((br3D_Height + br3D_Top) - br3DOffset) - ((((br3D_Top + (br3D_Height - br3DOffset)) - (br3D_Top + br3DOffset)) / 100) * Percentage)
TPPX = Screen.TwipsPerPixelX
TPPY = Screen.TwipsPerPixelY
' 2 Buitenste Lijnen (Links, Rechts)
br3D_OwnFrm.Line (br3D_Left, br3D_Top + br3DOffset)-(br3D_Left, br3D_Top + (br3D_Height - br3DOffset)), br3D_LineColor
br3D_OwnFrm.Line (br3D_Left + br3D_Width, br3D_Top + br3DOffset)-(br3D_Left + br3D_Width, br3D_Top + (br3D_Height - br3DOffset)), br3D_LineColor
' Middelste Lijn
br3D_OwnFrm.Line (br3DMid, br3D_Top + (br3DOffset * 2))-(br3DMid, br3D_Top + br3D_Height), br3D_LineColor
' Bovenste Vierkant (LinksOnder,RechtsOnder,LinksBoven,RechtsBoven)
br3D_OwnFrm.Line (br3D_Left, br3D_Top + br3DOffset)-(br3DMid, br3D_Top + (br3DOffset * 2)), br3D_LineColor
br3D_OwnFrm.Line (br3DMid, br3D_Top + (br3DOffset * 2))-(br3D_Left + br3D_Width, br3D_Top + br3DOffset), br3D_LineColor
br3D_OwnFrm.Line (br3D_Left, br3D_Top + br3DOffset)-(br3DMid + (TPPX), br3D_Top), br3D_LineColor
br3D_OwnFrm.Line (br3D_Left + br3D_Width, br3D_Top + br3DOffset)-(br3DMid, br3D_Top), br3D_LineColor
' Onderste 3 lijnen (LinksOnder,RechtsOnder,Rechtsboven)
br3D_OwnFrm.Line (br3D_Left, br3D_Top + (br3D_Height - br3DOffset))-(br3DMid, br3D_Top + br3D_Height), br3D_LineColor
br3D_OwnFrm.Line (br3DMid, br3D_Top + br3D_Height)-(br3D_Left + br3D_Width, br3D_Top + (br3D_Height - br3DOffset)), br3D_LineColor
br3D_OwnFrm.Line (br3D_Left + br3D_Width - TPPX, br3D_Top + (br3D_Height - br3DOffset) - TPPY)-(br3DMid, br3D_Top + br3D_Height - (br3DOffset * 2)), br3D_FillTopColor
' FillBar TopVierkant (LinksOnder,RechtsOnder,LinksBoven,RechtsBoven)
br3D_OwnFrm.Line (br3D_Left + TPPX, br3DBarPos)-(br3DMid, br3DBarPos + br3DOffset), br3D_FillTopColor
br3D_OwnFrm.Line (br3DMid + TPPX, br3DBarPos + br3DOffset)-(br3D_Left + br3D_Width, br3DBarPos), br3D_FillTopColor
br3D_OwnFrm.Line (br3D_Left + TPPX, br3DBarPos)-(br3DMid, br3DBarPos - br3DOffset), br3D_FillTopColor
br3D_OwnFrm.Line (br3DMid + TPPX, br3DBarPos - br3DOffset)-(br3D_Left + br3D_Width, br3DBarPos), br3D_FillTopColor
' Oude waarden behouden
tmpForeColor = .ForeColor
tmpFontBold = .FontBold
tmpScalemode = .ScaleMode
.ScaleMode = vbPixels
.FillColor = vbBlue
ExtFloodFill .hdc, 20, 20, .BackColor, FLOODFILLSURFACE
.ScaleMode = tmpScalemode
' Percentage neerzetten?
If br3D_ShowText Then
.FontBold = True
.ForeColor = br3D_TextColor
.CurrentX = br3DMid - (.TextWidth(Percentage & "%") / 2) ' X Berekenen (Gecentreerd)
.CurrentY = br3D_Top + br3DOffset + (br3D_Height / 2) ' Y Berekenen (Gecentreerd)
br3D_OwnFrm.Print Percentage & "%"
End If
' Oude waarden terugzetten
.ForeColor = tmpForeColor
.FontBold = tmpFontBold
.AutoRedraw = tmpAutoRedraw
DoEvents ' Altijd zorgen dat de progressbar wordt bijgewerkt. Wel zo netjes...
End With
End Sub
Private Sub Class_Initialize()
' Owner al gezet?
OwnerSet = False
' Default kleuren
br3D_EmptyDarkColor = Def_EmptyDarkColor
br3D_EmptyLightColor = Def_EmptyLightColor
br3D_FillDarkColor = Def_FillDarkColor
br3D_FillLightColor = Def_FillLightColor
br3D_FillTopColor = Def_FillTopColor
br3D_FillBottomColor = Def_FillBottomColor
br3D_LineColor = Def_LineColor
br3D_TextColor = Def_TextColor
' Default Positie & Percentage
br3D_Top = 120
br3D_Left = 120
br3D_Width = 800
br3D_Height = 6000
br3D_Min = 0
br3D_Max = 100
br3D_Angle = Def_Angle
br3D_ShowText = Def_ShowText
End Sub
' =======================================================================================
' =======================================================================================
' Hieronder alle properties
' =======================================================================================
' =======================================================================================
Public Property Let Owner(ByVal frmOwnerHwnd As Form)
Set br3D_OwnFrm = frmOwnerHwnd
OwnerSet = True
End Property
Public Property Let Value(ByVal Value As Long)
' Binnen de geldige range?
If Value <= br3D_Max Then
' Oppassen voor delen door 0 en kijken of we wel een Owner hebben
If ((br3D_Max - br3D_Min) > 0) And OwnerSet Then
DrawBar CByte((100 / (br3D_Max - br3D_Min)) * Value)
Else
If Not OwnerSet Then Err.Raise 1, "3D ProgressBar", "Owner niet gezet! Gebruik het Owner property om dit in te stellen (b.v. 'pb.owner=me')"
End If
br3D_Value = Value
End If
End Property
Public Property Get Value() As Long
Value = br3D_Value
End Property
Public Property Let Max(ByVal Value As Long)
br3D_Max = Value
End Property
Public Property Get Max() As Long
Max = br3D_Max
End Property
Public Property Get Min() As Long
Min = br3D_Min
End Property
Public Property Let Min(ByVal Value As Long)
br3D_Min = Value
End Property
Public Property Let Angle(ByVal Value As Byte)
If (Value > 0) And (Value < 30) Then br3D_Angle = Value
End Property
Public Property Get Angle() As Byte
Angle = br3D_Angle
End Property
Public Property Get ShowText() As Boolean
ShowText = br3D_ShowText
End Property
Public Property Let ShowText(ByVal Value As Boolean)
br3D_ShowText = Value
End Property
Public Property Get Top() As Long
Top = br3D_Top
End Property
Public Property Let Top(ByVal Value As Long)
If Value >= 0 Then br3D_Top = Value
End Property
Public Property Get Left() As Long
Left = br3D_Left
End Property
Public Property Let Left(ByVal Value As Long)
If Value >= 0 Then br3D_Left = Value
End Property
Public Property Get Width() As Long
Width = br3D_Width
End Property
Public Property Let Width(ByVal Value As Long)
If Value >= Def_MinWidth Then br3D_Width = Value Else br3D_Width = Def_MinWidth
End Property
Public Property Get Height() As Long
Height = br3D_Height
End Property
Public Property Let Height(ByVal Value As Long)
If Value >= Def_MinHeight Then br3D_Height = Value Else br3D_Height = Def_MinHeight
End Property
This code should be pasted in a form with a (vertical)scollbar on it:
Code:
Option Explicit
Dim pb As New cls3D_Bar
Private Sub Form_Load()
With pb
.Owner = Me
.Min = VScroll1.Min
.Max = VScroll1.Max
End With
pb.Value = 0
End Sub
Private Sub VScroll1_Change()
pb.Value = VScroll1.Value
End Sub
Private Sub VScroll1_Scroll()
pb.Value = VScroll1.Value
End Sub
[Edited by RobIII on 10-22-2000 at 07:33 PM]
-
Oct 22nd, 2000, 09:38 PM
#5
Fanatic Member
You need to Create A brush, use CreateSolidBrush. Then Select it with SelectObject. and Delete it with DeleteObject.
See www.vbapi.com, they have a good example on extFloodFill
GWDASH
[b]VB6, Perl, ASP, HTML, JavaScript, VBScript, SQL, C, C++, Linux , Java, PHP, MySQL, XML[b]
-
Oct 23rd, 2000, 02:19 AM
#6
I have seen in the examples I have to use a brush, but I'm wondering if my method wouldn't work. I.e. is it really necessary to create a brush?
-
Oct 23rd, 2000, 02:32 PM
#7
Frenzied Member
Ages ago i created a simple paint program that uses flood fill. I can send that to uif ur kind enough to give me ur email address. The picture box etc that ur drawing in needs to have specific parameters set for this to work , i can send u my demo.
-
Oct 23rd, 2000, 03:17 PM
#8
Fanatic Member
i don't think your way will work, because the function fills the area you tell it to start in until it hits a line of the color you specify. Thats not the color it paints with!!!
So Add This and the Declares for it
Code:
Dim hbrush As Long ' receives handle to the solid yellow brush
Dim holdbrush As Long ' receives handle to default brush
Dim retval As Long ' return value
hbrush = CreateSolidBrush(RGB(255, 255, 0)) ' create a solid yellow brush
' Save Form1's default brush so we can restore it after the program is finished
holdbrush = SelectObject(.hDC, hbrush) ' select the brush
retval = SelectObject(.hDC, holdbrush) ' select old brush
retval = DeleteObject(hbrush) ' destroy the brush
GWDASH
[b]VB6, Perl, ASP, HTML, JavaScript, VBScript, SQL, C, C++, Linux , Java, PHP, MySQL, XML[b]
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|