Gå til innhold

Visual Basic Roundup!


Anbefalte innlegg

nei, gjennomsnittlig avstand fra kamera er ikke hvordan man lager et z-buffer. det ville suge ganske kraftig. bildet hadde blitt helt fucka hvis du gjemmer hele trekanter istedetfor bare de pixelene som er gjemt.

det du må gjøre er å gjøre om 3d-scenen din til et 2d-bilde som du kan skrive til skjermen. da må du implementere en eller annen form for frustum og så gjøre om frustumet til 2d. når du da tegner en pixel, sjekker du z-verdien som du finner når du gjør om fra 3d til 2d, hvis z-verdien er mindre enn den som er der, tegn pixelen, hvis ikke, ikke tegn.

 

frustum er vanskelig å implementere fordi det er så mye matte, men hvis du vil lage det må du forstå matriser og søke på google.

 

derfor er det lettere å begynne med et api som f.eks directx som har implementert disse funksjonene for deg. så kan du evt lage software ting etter du forstår hvordan det funker

Lenke til kommentar
Videoannonse
Annonse

Ser at mange lager kalkulator med to felt. Det ville blitt mere brukervenlig med et felt, som calc.exe (I windows). Burde ikke være så altfor vannskelig å få til :)

 

Forresten, er det noen fra denne delen av forumet som skal på TG? Sett deg med hw.no-rekka da vel!

Lenke til kommentar

Litt off topic, men hadde ikke så lyst å starte ny tråd:

 

Siden den innebyde "MouseMove" metoden ikke duger så bra, hvilke andre alternativer er det? Søker jeg, ender jeg alltid opp med å bruke Timer, noe som krever masse systemressurser.

 

Er det en annen metode å bruke?

Tenker på effekter til knapper.

Lenke til kommentar

Joda, det har jeg oppdaget.

 

Jeg tror ikke det finnes noe "ordentlig" MouseOut-event, så enten må du bruke en timer, eller bare leve med at man kan dra musa fort over.

 

Uansett, å dra musa fort over diverse effekter er jo som å be om effekt-feil. Hvis brukeren absolutt har lyst så gjør vel ikke det så mye?

Lenke til kommentar

Vel, jeg har selv irritert meg over det. Altså, selv om jeg ikke drar musen fort med vilje. Og synes ikke "MouseMove" duger så bra som en knapp-effekt, da.

 

Windows XP-stilen har jo effekter på knapper, og masse annet. Opera (nettleseren) har jo en egen stil, så har "MouseOver" også. Jeg har ikke sett at disse har feilet, hva slags metode brukes her? Det virker ikke som dette krever masse systemressurser, så jeg kan ikke tenke meg at en Timer brukes.

Lenke til kommentar
Jeg tror ikke det finnes noe "ordentlig" MouseOut-event, så enten må du bruke en timer, eller bare leve med at man kan dra musa fort over.

Muligens ikke, men det finnes langt sofistikerte metoder enn å bruke den omliggende formen for å finne ut om musepekeren har forlatt vinduet. Man kan f.eks bruke TrackMouseEvent-funksjonen, men det krever uheldigvis subclassing og endel forståelse på API.

Lenke til kommentar
  • 1 måned senere...

Kom over denne nettopp:

 

Option Explicit

Private Declare Function SetCapture Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function ReleaseCapture Lib "user32" () As Long
Private Declare Function GetCapture Lib "user32" () As Long

Private Sub Command1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
   
   With Command1
       If (X < 0) Or (Y < 0) Or (X > .Width) Or (Y > .Height) Then 'MouseLeave
           Call ReleaseCapture
           .BackColor = &H8000000F
       ElseIf GetCapture() <> .hwnd Then 'MouseEnter
           Call SetCapture(.hwnd)
           .BackColor = &HFF&
       Else
           'Normal MouseMove
           .BackColor = &HFF&
       End If
   End With

End Sub

 

Noe negativt å si om den?

Så ut til å fungere helt utmerket.

Lenke til kommentar

Forleden kom jeg over noe temmelig forunderlig - en ny måte å påvise om en array er initialisert eller ikke:

 

   Dim aArray() As Long
   
   If (Not Not aArray) Then
       MsgBox "Arrayen er initialisert", vbInformation, "Array"
   Else
       MsgBox "Arrayen er ikke initialisert", vbInformation, "Array"
   End If

 

Og det fungerer merkelig nok fullstendig utmerket; i hvert fall i de versjonene jeg har testet koden til nå. Tydeligvis har kompilatoren en liten glipp hva NOT-operatøren angår. Til forskjell fra alle de andre operatørene, gir ikke VB en feilmelding når man benytter den sammen med en uinitialisert array - tvertom behandler den arrayen lik hvilken som helst variabel.

 

Ettersom en array egentlig er en peker til en safearray-struktur, returnerer NOT-operatøren den omvendte verdien av denne, hvilket er 0 når arrayen ikke er initialisert. Idet alle verdier utenom 0 blir oppfattet som True, kan man faktisk benytte denne pekeren i en IF-setning, derav årsaken til at dette faktisk fungerer.

Lenke til kommentar

Hmm, nå begynner jeg å lure litt på hva Val() skal gjøre :S

 

Lim inn denne koden:

Option Explicit

Private Declare Function SetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal crColor As Long) As Long
Private Declare Function TextOut Lib "gdi32" Alias "TextOutA" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal lpString As String, ByVal nCount As Long) As Long

Dim Tall() As Long
Dim sEnd As Boolean

Private Sub Form_Load()
   Me.Show
   ReDim Tall(0 To 20)
   Dim sTall As Long
   Do Until sEnd = True
       DoEvents
       sTall = Rnd * 4
       'sTall = Val(Rnd * 4)
       Randomize Timer
       Tall(sTall) = Tall(sTall) + 1
       Paint
   Loop
   End
End Sub

Private Sub form_Click()
   sEnd = True
End Sub

Private Sub Paint()
   Me.Cls
   Dim i
   For i = 0 To UBound(Tall)
       TextOut Me.hdc, i * 20, 0, Str(i), Len(Str(i))
       If Not Tall(i) = 0 Then
           Dim o
           For o = 0 To Tall(i)
               SetPixel Me.hdc, (i * 20) + 15, o, 0
           Next o
       End If
   Next i
End Sub

Alt ser ganske bra ut, og man får bare tall fra 0 til 4, men prøv å ta bort kommentar-tegnet forann Val()-linjen. Da blir resultatet annerledes. Litt av 5 til 9 også!

 

Hva kommer det av?

Lenke til kommentar

Problemet ligger formodentlig ved det faktum at Val(), likegyldig av konfigurasjonen i Regional and Language Options, vil oppfatte punktum som desimalsymbolet. Det er dette som er årsaken til av vi i norsktalende land kan benytte denne funksjonen for å fjerne brøken av et tall uten avrunding, idet tall som konverteres til datatypen String vil ha desimalsymbolet komma.

 

Imidlertid fungerer ikke funksjonen identisk dersom desimalsymbolet er stilt inn til punktum - da vil den ikke fjerne brøken og returnere heltall i det hele tatt, men kun gi tallet i paramenteren. Derfor er det feilaktig å anvende denne funksjonen på denne måten. Den vil rett og slett gi ulike resulater avhengig av innstilningene. I tillegg ser vi, av blant annet denne testen, at den i bunn og grunn nesten gir tilfeldige tall ved en slik feilbruk.

 

De funksjonene man skal benytte til sådant, er Int eller Fix.

 

Edit: Leif var på besøk.

Endret av aadnk
Lenke til kommentar

Nå er kanskje ikke denne tråden (sågar forumkategorien :() den mest aktive her på forumet, men jeg kan vel like gjerne proklamere litt om denne siden:

 

http://no.wikibooks.org/wiki/Visual_Basic

 

Som mange allerede vet, er wikipedia og dens søstersider en gigantisk kilde til allverdens informasjon - samlet av frivilige bidragere over hele verden. Den overnevnte linken er mitt forsøk på å legge ut VB-guiden min til dette storslotte prosjektet, men sørgelig nok kan det langt ifra kalles fullført. Eksempelvis gjør artikkelen er stort hopp fra et nokså enkelt stadium til å drøfte inngående hvorledes overstyring (subclassing) fungerer i teori og praksis, uten engang å ha vært innom Application Program Interface. Da blir det ikke særlig lett for nybegynnere å følge med, er jeg redd.

 

Så, dersom du synes artikkelen har mangler eller er feilaktig på enkelte punkter, må du gjerne redigere den. Jo flere som bidrar, desto bedre blir den.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...