Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

wozu CLS bei Image-Puffer

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
braesident



Anmeldungsdatum: 15.04.2008
Beiträge: 189
Wohnort: Berlin

BeitragVerfasst am: 16.11.2015, 00:57    Titel: wozu CLS bei Image-Puffer Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1211
Wohnort: Ruhrpott

BeitragVerfasst am: 16.11.2015, 14:37    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4597
Wohnort: ~/

BeitragVerfasst am: 16.11.2015, 15:45    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
braesident



Anmeldungsdatum: 15.04.2008
Beiträge: 189
Wohnort: Berlin

BeitragVerfasst am: 16.11.2015, 22:01    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1211
Wohnort: Ruhrpott

BeitragVerfasst am: 17.11.2015, 02:28    Titel: Antworten mit Zitat

nemored hat Folgendes geschrieben:
nicht ganz - CLS setzt den Grafikcusor in die Mitte des Bildschirms.
Schon wieder was dazugelernt. lächeln

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz