Hejsan! Hej Färgsystemet är konstruerat på så sätt att du har ett visst antal grundfärger (3 stycken - Röd, Grön och Blå), varje grundfärg har 256 olika mängdvärden (från 0 till 255). Om du blandar alla färgerna (alla = 255) så får du vitt, om alla färgerna är 0 så får du svart. Kolla det här. Vill du ha fram hexkoden är väl inte det nåt större problem. Fan också... sju sekunder efter... ;-) Men jag är bäst i alla fall ;P Jag skulle gjort lite anorlunda:<br> Finns ett snabbare sätt att splita RGB färger i VB: Visst håller jag med dig, Andreas, men notera att grundfrågan är en helt annan, och att det inte är kontrollerna som är viktiga. Vad du är jobbig, du tvärmissar hela syftet med koden och visst hade den sett annorlunda ut om det varit ett annat syfte med den, men nu ville jag egentligen bara illustrera hur han skapade en färgskala på 20 färger samt hur den såg ut... Din gennerella funktion är bra då man vill ha ut ett specefikt värde. Men eftersom det är frågan om en färgscala är det ineffektivt att slå isär RGB värde och beräkna för varje loop. Desutom är det Overkill att använda labels som trash gör. Med Line-metoden kan man skapa ifyllda rektanglar. Jag kritisera all kod jag ser i forumet. Ser jag mycket som jag skulle gjort anorlunda så påpekar jag vad. Effterom medlemar läser tråden kan det snappa upp mina principer tillämpa det i sin egen kod. Andreas, det var inte meningen att mästra dig på något vis, jag ville bara inte dra igång en lång tråd utan ände... Jahapp då tar vi om frågan då... (och nu omgjord till en VÄLDIGT rak fråga). Hej om det är detta svar du vill ha "ski...." jag i, jag har fått skrivklåda. Det finns två sorters färger i Windows.Färg schema!
Jag skulle behöva hjälp med hur jag ska gå till väga för att ta fram färger mellan de redan existerade färgerna man kan välja i vb.
eftersom jag inte vet hur färgsystemet är uppbyggt är det svårt att gissa sig fram.
Detta är vad jag pratar om: jag skulle behöva 20 färger mellan
Vit &H00FFFFFF& och mörkgrön &H00004000&
Tack för alla svar // R-musSv: Färg schema!
Du kan ju testa detta ,har ingen aning hur det blir
En Listbox och en Command1
Option Explicit
Private Sub Command1_Click()
Dim i As Long
For i = 854425 To 16777215 Step 838041
List1.AddItem "&H00" & Hex$(i) & "&"
Next 'i
End Sub
SvenSv: Färg schema!
&H00FF0000& (Röd)
&H0000FF00& (Grön)
&H000000FF& (Blå)
&H00FFFFFF& (vitt)
&H00004000& (mörkt grön)
För att få fram 20 färger mellan din gröna och vita ton så kan du t.ex. göra så här i vb:
<code>
'Lägg denna kod i ett formulär
'Lägg en label på formuläret och sätt index = 0 på den
Option Explicit
Private Sub Form_Load()
On Error Resume Next
Dim färger(19) As Long
Dim r As Single
Dim g As Single
Dim b As Single
Dim i As Integer
r = 0
g = 64 '(&H40&)
b = 0
For i = 0 To 19
färger(i) = RGB(r, g, b)
r = r + (255 / 19)
g = g + ((255 - 64) / 19)
b = b + (255 / 19)
Next i
Me.BackColor = RGB(0, 0, 0)
For i = 0 To 19
Load Label1(i)
With Label1(i)
.Width = Me.ScaleWidth / 20
.Height = Me.ScaleHeight
.Caption = "&H00" & Hex(färger(i)) & "&"
.BackColor = färger(i)
.Top = 0
.Left = IIf(i = 0, 0, Label1(i - 1).Left + Label1(i - 1).Width)
.Visible = True
End With
Next i
End Sub
Private Sub Form_Resize()
On Error Resume Next
Label1(0).Left = 0
Dim i As Integer
For i = 0 To 19
With Label1(i)
.Width = Me.ScaleWidth / 20
.Height = Me.ScaleHeight
.Left = IIf(i = 0, Me.ScaleLeft, Label1(i - 1).Left + Label1(i - 1).Width)
End With
Next i
End Sub
</code>Sv: Färg schema!
<code>
Option Explicit
Public Type ColorType
Red As Long
Green As Long
Blue As Long
End Type
Public Sub TestColors()
Dim c1 As Long, c2 As Long
c1 = RGB(255, 0, 0)
c2 = RGB(0, 0, 255)
Dim i As Long, c As Long, ct As ColorType
For i = 0 To 20
c = ColorBetween(c1, c2, i / 20)
ct = SplitColor(c)
Debug.Print ct.Red & ", " & ct.Green & ", " & ct.Blue & vbCrLf
Next
End Sub
Public Function ColorBetween(ByVal BeginColor As Long, ByVal EndColor As Long, Where As Single) As Long
Dim ctBegin As ColorType, ctEnd As ColorType
ctBegin = SplitColor(BeginColor)
ctEnd = SplitColor(EndColor)
ColorBetween = RGB((ctEnd.Red - ctBegin.Red) * Where + ctBegin.Red, (ctEnd.Green - ctBegin.Green) * Where + ctBegin.Green, (ctEnd.Blue - ctBegin.Blue) * Where + ctBegin.Blue)
End Function
Public Function SplitColor(ByVal Color As Long) As ColorType
With SplitColor
.Red = Color Mod 256
Color = (Color - .Blue) \ 256
.Green = Color Mod 256
.Blue = (Color - .Green) \ 256
End With
End Function
</code>
/Niklas JanssonSv: Färg schema!
Men min är snyggare - mer generell :-P
hihi...
/Niklas JanssonSv: Färg schema!
Tack för era svar!
Kanske dax att lägga sig nu då... näää // R-musSv: Färg schema!
* Behöver ju inte loopa två gånger.<br>
* Arrayen blir då onödig. Använder istället en variabel.<br>
* Move-metoden är ju bättre. Flyttar inte kontrollen fyra gånger.<br>
* Eftersom Resize eventet inträffar efter formuläret laddats så behöver man inte ange position i load. Utan låter Resize eventet hantera det.<br>
* Man ska undvika IIF funktionen. If-satser är snabbare. <br>
* If-satsen behövs bara för första posten. Bättre att lösa det genom att koda första posten utanför loopen. För att slippa göra en onödig jämförelse innanför loopen.<br>
* För att göra det möjligt att läsa värdena är det mer lämpligt att göra fälten horisontela istället för vertikala.<br>
* Beräkna bredden/höjden för labeln en gång och lagrar den i en variabel, istället för i loopen.<br>
* Istället för att fråga tidigare kontroll vilket dess vänster/top position var. Är en variabel effektivare. Addera man sedan bredden/höjden. Får man den aktuella positionen.<br>
<br>
Anledningen till kritiken är för att ni skall programmera mer effektiv. Inte för att vara elak eller Besserwiser.<br>
<br>Ju mer kunskap ni har. Dessto bättre förutsättningar har ni för det.<br>
<br>
<code>
'Lägg till en label på formuläret
'Sätt egenskapen Index = 0 för labeln
'Sätt egenskapen UseMnemonic = False för labeln
'Infoga följande kod i formuläret:
Option Explicit
Private Sub Form_Load()
Dim i As Long
Dim r As Single
Dim g As Single
Dim b As Single
Dim Color As Long
Me.BackColor = RGB(0, 0, 0)
r = 0
g = 64 '(&H40&)
b = 0
Color = RGB(r, g, b)
With Label1(0)
.Caption = "&H00" & Hex(Color) & "&"
.BackColor = Color
.Visible = True
End With
For i = 1 To 19
r = r + (255 / 19)
g = g + ((255 - 64) / 19)
b = b + (255 / 19)
Color = RGB(r, g, b)
Load Label1(i)
With Label1(i)
.Caption = "&H00" & Hex(Color) & "&"
.BackColor = Color
.Visible = True
End With
Next
End Sub
Private Sub Form_Resize()
Dim Label As Label
Dim LabelTop As Single
Dim LabelHeight As Single
LabelTop = ScaleTop
LabelHeight = Me.ScaleHeight / 20
For Each Label In Label1
Label.Move Me.ScaleLeft, LabelTop, Me.ScaleWidth, LabelHeight
LabelTop = LabelTop + LabelHeight
Next
End Sub
</code>Sv: Färg schema!
<code>
Option Explicit
Public Type RGB
Blue As Byte
Green As Byte
Red As Byte
Reserved As Byte
End Type
Public Type TypeLong
Value As Long
End Type
Public Function SplitColor(ByVal Color As Long) As RGB
Dim Temp As TypeLong
Temp.Value = Color
LSet SplitColor = Temp
End Function
</code>Sv: Färg schema!
Det är i sådana här lägen jag är böjd att hålla med SvenPon (i hans tidigare klagomål), fast mycket mycket mildare. Du har vettiga synpunkter, och jag tror inte ett dugg att du vill skryta eller dylikt, men fokus från grundfrågan är flyttad.
I just detta fallet är det inte speciellt negativt, eftersom R-mus tydligen nöjde sig med svaren. Anledningen till att jag skriver detta är helt enkelt att jag försöker visa lite av det SvenPon tidigare sagt, fast kanske lite mer konstruktivt. Hoppas du inte tar illa upp!
F.ö. tycker jag du bör sätta ihop min generella metod med Trash's/din uppvisning av färgerna... :-D
EDIT: Detta var svar till ditt första inlägg, Andreas.
Det andra var ett smart sätt. Får jag komma ihåg.
/Niklas JanssonSv: Färg schema!
MEn du har rätt i mycket av det du säger (inte allt dock)...Sv: Färg schema!
Har gjort ett litet exempel som jag lagt upp i filarean:
Programarkivet:Blandar två färgerSv: Färg schema!
Oavsett hur "enkelt" ett exempel är. Är det aldrig fel att göra det bra. Tar inte mer eller mindre tid. Beror på vilka kunskaper du besitter.
Om du har synpunker på mina kommentarer säg då på vilka du har synpunkter och vad det är. Inte bara "inte alla". Finns inget jag kan ta till mig av det. Jag behöver din kritik lika mycket som du behöver min. Så jag uppskattar om du delar med dig.
Istället för att använda Beserwiser fasoner. Tycker jag det är när man säger att nåt är fel men inte vad. Finns då inget sätt att möta kritiken.
/Mvh, Andreas HillqvistSv: Färg schema!
Det jag inte håller med om är följande:
* Behöver ju inte loopa två gånger.
* Arrayen blir då onödig. Använder istället en variabel.
Koden blir tydligare för att förklara huvudfrågan, att göra en liten snygg kod är inte alltid bästa sättet att demonstrera något.
* Eftersom Resize eventet inträffar efter formuläret laddats så behöver man inte ange position i load. Utan låter Resize eventet hantera det.
Det är inte alltid man lägger sådan kod i load-eventet och därför bör man ta som vana att alltid flytta kontrollen i sin loop.
* Man ska undvika IIF funktionen. If-satser är snabbare.
Det är iofs sant, men iif ger enklare mer överskådlig kod i många fall.
För övrigt så tycker jag definitivt att man inte skall optimera all kod man kommer över, (min resize-kod förtjänade iofs en optimering) man tappar alldeles för lätt bort syftet med koden i de fallen och här var syftet att förklara hur färgerna funkar och hur man gör en färgskala... Sedan så kan man lösa all kod på många sätt och i optimeringssyfte så skulle man inte ens loada kontrollerna man skulle använda GDI-funktioner att fylla formuläret med färger, kanske även för att spotta ut texten...
Du är en mycket duktig programmerare imo, men glöm inte att optimering är överkurs för flera av dom som frågar efter det som du & jag anser vara lite enklare saker.Sv: Färg schema!
Hur FUNGERAR färgschemat i Visual Basic i HEXADECIMAL?
Försök att inte börja slås i sandlådan om vem som är bäst på vb... för det vet ni ju redan att det är jag :D // R-musSv: Färg schema!
Om Vi tar pelles vackra sandgula färg och använder
Private Declare Function GetPixel Lib "gdi32" _
(ByVal hDC As Long, ByVal x As Long, _
ByVal y As Long) As Long
xyColor = GetPixel(Picture1.hDC, 1,1)
Då kommer svaret att bli 14741744 ,tillsynes obegripligt, men !
Om Vi gör
Label1.Caption = Hex$(xyColor) blir svaret E0 F0 F0 mera begripligt
E0 = 224 F0 = 240 Alltså kan Vi stjäla pelles färg genom att skriva.
(För att ytterligare krångla till det så vänder VB på ordningsföljden.)
RGB(240,240,224). Eller kan Vi också skriva
Label1.BackColor = &H00E0F0F0&.
Det betyder också att om du tar in Hex värdet i Html kod får du
en helt annan färg. I Html skall du också vända på värdet så det blir
#F0F0E0.
Till sist om du använder API GetPixel kan du helt enkelt
skriva Form1.BackColor = 14741744
SvenSv: Färg schema!
De vanliga är RGB-färger, dvs. 256 grader av rött, grönt och blått. Det representeras av de sista 3 byten (i &H00FFFFFF& är det alla F:en). Den första är alltid noll, och det är denna metod jag och Trash föreslår.
Med den översta byten (00) kan man representera andra färger som bestäms av windows-standarden. Man kan alltså byta färg på ett 3D-objekt i windows, och då återspeglas ändringen i ditt program.
Om du gör en ny form och kollar vad det står i BackColor förstår du vad jag menar. Som du ser kan du också byta mellan olika färger där.
Hoppas det klarnade.
/Niklas Jansson