[VB6] RGB Probleempje...

Pagina: 1
Acties:

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Topicstarter
(overleden)
OK, ik kijk er vast over heen of redeneer ergens verkeerd, maar kan iemand me even erop wijzen dan?

Ik zal beginnen met de code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Option Explicit

Private Sub Form_Load()
    FillBar pRed, "0000xx"
    FillBar pGreen, "00xx00"
    FillBar pBlue, "xx0000"
End Sub

Private Sub FillBar(pBox As PictureBox, sWich As String)
    Dim tppx As Single
    Dim tppy As Single
    Dim X As Long
    Dim Y As Long
    Dim fc As Long
    Dim pbH As Long
    Dim pbW As Long
    
    tppx = Screen.TwipsPerPixelX
    tppy = Screen.TwipsPerPixelY
    
    pBox.Visible = False
    pBox.AutoRedraw = True
    pbW = 256 * tppx
    pbH = 15 * tppy
    pBox.Width = pbW
    pBox.Height = pbH
    X = 0
    
    For Y = 0 To pbH Step tppy
        fc = 0
        For X = 0 To pbW Step tppx
            pBox.PSet (X, Y), Val("&H" & Replace(sWich, "xx", Hex(fc)))
            fc = fc + 1
        Next
    Next
    pBox.Visible = True
End Sub


Copy & Paste deze code in een form, en gooi 3 picture boxes op dat form. Noem die picturoboxes pRed, pGreen en pBlue.

Run de code. Zie je het resultaat? Waarom gaat de code WEL goed met Rood en Blauw, maar NIET met groen?

De methode an sich staat hier niet ter discussie, dit is een snelle test die ik in elkaar heb geflanst om wat te klooien met kleuren. Ik weet dat het sneller, mooier en optimaler kan (desnoods door er een plaatje in te gooien), maar daar gaat het dus niet om. Ik vraag me af waarom Rood en Blauw goed gaan en groen niet? Mis ik een eigenaardigheidje van VB of wat? MSDN was niet erg behulpzaam, net als Google...

Voor de duidelijkheid: Dit is wat er bij mij uit komt:

Afbeeldingslocatie: http://www.theforumisdown.com/uploadfiles/0103/rgbvaag.jpg

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Korben
  • Registratie: Januari 2001
  • Laatst online: 14-11-2025

Korben

() => {};

Het is een beetje een wazig probleem. Om de één of andere reden komt er halverwege groen een dot blauw bij, terwijl je dat niet terugziet als je alle kleurwaardes afdrukt. Maar waarom doe je zo moelijk en gebruik je niet gewoon de functie RGB? Stuk simpeler, sneller, en dát werkt wel.

.oisyn: Échte programmeurs haten PHP met een passie. Ben jij soms geen echte programmeur?


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Topicstarter
(overleden)
Klopt, maar het gaat effe om het Hex gebeuren. Waarom gaat het fout?
De methode an sich staat hier niet ter discussie

[ Voor 36% gewijzigd door RobIII op 18-03-2003 01:53 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Roep 'm eens alleen voor groen aan en ipv pixels te zetten print de resulterende kleurwaarden uit, je krijgt dan als het goed is een lijstje als volgt:
code:
1
2
3
4
5
6
7
0x000000
0x000100
0x000200
...
0x00FD00
0x00FE00
0x00FF00

Als dat eruit komt heb je een bug in VB gevonden :)

[edit]
Eeps bedenk me net wat er fout gaat.

Dit heeft van doen met sign propagation. Jij bouwt daar bij stap 128 de string 0x0080000, dat wordt intern door de Hex-functie getrunced naar de kleinst passende eenheid: een Word met als waarde 0x8000. Omdat de hoogste bit gezet is dit technisch een negatief getal! Je assigned 'm vervolgens echter aan een 32-bits waarde. De signed 16-bit waarde (-32768) wordt daarvoor impliciet gecast naar een signed 32-bit waarde die dezelfde waarde -32768 bevat, oftewel 0xFFFF8000.

En dat is inderdaad blauw vol open met een beetje groen, en zal doorlopen tot helder zeeblauw :)

* curry684 hoopt dat ie het zo duidelijk heeft getypt.

[ Voor 56% gewijzigd door curry684 op 18-03-2003 01:58 ]

Professionele website nodig?


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Topicstarter
(overleden)
curry684 heeft gelijk denk ik :)
Ik zag overigens ook dat ik een nul voor de eerste paar waarden (<16) moet plakken:

code:
1
pBox.PSet (X, Y), Val("&H" & Replace(sWich, "xx", Right("0" & Hex(fc), 2)))


in plaats van:

code:
1
pBox.PSet (X, Y), Val("&H" & Replace(sWich, "xx", Hex(fc)))


Anders krijg je &H00100 i.p.v. &H000100; Dus RRGBB i.p.v. RRGGBB...
En als we vervolgens CLng i.p.v. Val gebruiken is het opgelost. Thanx dude...(Tis laat ;))

* Oplossing is dus:
code:
1
pBox.PSet (X, Y), Clng("&H" & Replace(sWich, "xx", Right("0" & Hex(fc), 2)))

[ Voor 15% gewijzigd door RobIII op 18-03-2003 02:06 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij