|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
braesident
Anmeldungsdatum: 15.04.2008 Beiträge: 189 Wohnort: Berlin
|
Verfasst am: 16.11.2015, 00:57 Titel: wozu CLS bei Image-Puffer |
|
|
Hallo Leute,
mittels LINE zeichne ich Rechtecke in ein mit IMAGECREATE erstellten Puffer. Doch leider entsteht bei der Ausgabe auf dem Monitor immer ein Linien-Chaos. Es sei denn ich füge ein CLS in der Sub 'objectListView.createListMap' mit ein dann werden die Rechtecke richtig angezeigt
Code: | screenRes 600, 700, 32
Type olvStyle
As Integer high(1)={ 30 , 30 }
As Integer color(1)={ &heeeeee , &heeeeee }
As Any Ptr pic(1)
End Type
Type olvMap
As Integer wide, high
End Type
Type objectListView
As Integer posx, posy, wide=150, high=200
As Integer bg_color=&hffffff, no_bg=0, no_el_bg=0
As Any Ptr bg_pic
As Byte hide=0, active=-1
As Integer entrys=0
As Integer entryAlpha=127
As olvStyle style
As Byte styleMode=0 ''0=style_0 1=style_1 2=abwechselnd 3=eigenereihenfolge
As String styleString ''zB "00011000010"
Declare Sub setNoBg
Declare Sub showBg
Declare Sub setNoElBg
Declare Sub showElBg
Declare Sub setBgPicByPtr( picPtr As Any Ptr )
Declare Sub setBgPicByStr( picStr As String )
As Any Ptr map
As olvMap mapSize
Declare Sub createListMap
Declare Sub destroyList
Declare Sub drawList
End Type
Dim As objectListView objectList()
Dim As Any Ptr imgTmp
ReDim objectList(1)
With objectList(1)
.style.high(1) = 10
.style.color(0) = &Hff0000
.style.color(1) = &Hffff00
.styleMode = 2
''.styleString = "011101"
.entrys = 5
.posX = 10
.posY = 10
''.setNoElBg
''.setNoBg
imgTmp = ImageCreate( 100 , .high , &H0000ff )
.setBgPicByPtr( imgTmp )
End With
imageDestroy imgTmp
objectList(1).createListMap
ScreenLock
cls
objectList(1).drawList
ScreenUnLock
objectList(1).destroyList
sleep
end
Sub objectListView.setNoBg: no_bg = -1: End Sub
Sub objectListView.showBg: no_bg = 0: End Sub
Sub objectListView.setNoElBg: no_el_bg = -1: End Sub
Sub objectListView.showElBg: no_el_bg = 0: End Sub
Sub objectListView.setBgPicByPtr( picPtr As Any Ptr )
Dim As Integer picPtrW, picPtrH
ImageInfo picPtr, picPtrW, picPtrH
bg_pic = imageCreate( picPtrW , picPtrH )
Get picPtr, ( 0, 0 ) - Step( picPtrW-1, picPtrH-1 ), bg_pic
End Sub
Sub objectListView.setBgPicByStr( picStr As String )
End Sub
Sub objectListView.createListMap
If Not map AndAlso entrys > 0 Then
Dim As Integer thisHigh = 0, nextMode=0, lastMode=1
Dim As Byte styleNr
If styleMode = 3 AndAlso Len(styleString) < entrys Then styleString += String( entrys-Len(styleString), "0" )
For i As Integer = 1 To entrys
styleNr = IIF( styleMode < 3 , IIF( styleMode < 2 , styleMode , nextMode ) , Val(Chr(styleString[i-1])) )
styleNr = IIF( styleNr > 1 , 0 , styleNr )
thisHigh += style.high(styleNr)
Swap nextMode, lastMode
Next i
mapSize.wide = wide: mapSize.high = thisHigh
map = ImageCreate(mapSize.wide, mapSize.high)
thisHigh = 0: nextMode=0: lastMode=1
For i As Integer = 1 To entrys
styleNr = IIF( styleMode < 3 , IIF( styleMode < 2 , styleMode , nextMode ) , Val(Chr(styleString[i-1])) )
styleNr = IIF( styleNr > 1 , 0 , styleNr )
cls
''line( posX,posY ) - step(mapSize.wide-1, mapSize.high-1), &h00ff00, b
If Not style.pic(styleNr) AndAlso Not no_el_bg Then
Line map, ( 0 , thisHigh ) - Step( wide-1, style.high(styleNr)-2 ), style.color(styleNr), bf
''
End If
''put( posX+100 , posY ), map,( 0 , 0 ) - Step( IIF( mapSize.wide < wide , mapSize.wide , wide ) , IIF( mapSize.high < high , mapSize.high , high )-1 ), trans'Alpha, 127
thisHigh += style.high(styleNr)
Swap nextMode, lastMode
Next i
End If
End Sub
Sub objectListView.destroyList
If map <> 0 Then
imageDestroy map
map = 0
End If
If bg_pic <> 0 Then
imageDestroy bg_pic
bg_pic = 0
End If
If style.pic(0) <> 0 Then
imageDestroy style.pic(0)
style.pic(0) = 0
End If
If style.pic(1) <> 0 Then
imageDestroy style.pic(1)
style.pic(1) = 0
End If
End Sub
Sub objectListView.drawList
If Not hide AndAlso active AndAlso entrys > 0 Then
If bg_pic = 0 AndAlso Not no_bg Then
Line( posX, posY ) - Step( wide, high ), bg_color, bf
ElseIf bg_pic AndAlso Not no_bg Then
put( posX , posY ), bg_pic, pSet
End If
put( posX , posY ), map,( 0 , 0 ) - Step( IIF( mapSize.wide < wide , mapSize.wide , wide )-1 , IIF( mapSize.high < high , mapSize.high , high )-1 ), Alpha, 127
''put( posX , posY ), map( 1 , 1 ) - Step( 5 , 5 ), Alpha, 127
''
End If
End Sub
|
_________________ FBIde: 0.4.6
fbc: FreeBASIC Compiler - Version 1.05.0 (01-31-2016), built for win64 (64bit)
OS: Windows NT 6.2 (build 9200) |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 16.11.2015, 14:37 Titel: |
|
|
Ohne das Programm jetzt genauer analysiert zu haben: Cls setzt auch den Grafikcursor nach links oben. Möglicherweise hängt das damit zusammen.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 16.11.2015, 15:45 Titel: |
|
|
nicht ganz - CLS setzt den Grafikcusor in die Mitte des Bildschirms.
CLS innerhalb der Member-Mitglieder aufzurufen ist vielleicht nicht ganz so geschickt, da es Auswirkung auf den Bildschirm hat, nicht auf den Bildpuffer. Es reicht, CLS irgendwo zwischen .setBgPicByPtr( imgTmp ) und .createListMap aufzurufen.
Was genau du in .setBgPicByPtr( imgTmp ) machst, ist mir noch nicht klar (komme auch gerade nicht dazu das auszutüfteln); jedenfalls ist es mir nicht geheuer. Muss ich mir noch gründlicher ansehen. Aber vielleicht bringt dich das ja schon einmal weiter.
Nachtrag:
Wenn du IMAGEDESTOY imgTmp erst an das Programm-Ende legst, sieht es (auch ohne CLS) wieder gut aus. Viel weiter komme ich jetzt auf die Schnelle gerade nicht.
Noch ein Nachtrag:
was übrigens auch funktioniert, ist eine Änderung in
Code: | Sub objectListView.setBgPicByPtr( picPtr As Any Ptr )
Dim As Integer picPtrW, picPtrH
ImageInfo picPtr, picPtrW, picPtrH
bg_pic = imageCreate( picPtrW , picPtrH )
put bg_pic, ( 0, 0 ), picPtr, pset
End Sub |
_________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
braesident
Anmeldungsdatum: 15.04.2008 Beiträge: 189 Wohnort: Berlin
|
Verfasst am: 16.11.2015, 22:01 Titel: |
|
|
erstmal vielen Dank euch.
Mir war bisher nicht bewusst das CLS sich auch auf ImagePointer auswirkt.
Ja also in .setBgPicByPtr( imgTmp ) soll eine Grafik an den Type übergeben werden. Später soll noch die Größe in dieser Sub an das Objekt angepasst werden. _________________ FBIde: 0.4.6
fbc: FreeBASIC Compiler - Version 1.05.0 (01-31-2016), built for win64 (64bit)
OS: Windows NT 6.2 (build 9200) |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 17.11.2015, 02:28 Titel: |
|
|
nemored hat Folgendes geschrieben: | nicht ganz - CLS setzt den Grafikcusor in die Mitte des Bildschirms. | Schon wieder was dazugelernt.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|