Ein paar Probleme mit MaxGui

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

M0rgenstern

Betreff: Ein paar Probleme mit MaxGui

BeitragSo, Apr 08, 2012 18:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Community.
Ich versuche gerade mit MaxGui einen Editor für Tilesets zu schreiben.
Das ganze ist so ziemlich mein erster Versuch mit MaxGui (außer einem kleinen vor ein paar Jahren, aber ich erinnere mich an kaum was).
Ich habe auch schon einen Teil davon gelesen: http://maxgui.simongeisseler.ch/
Aber zwei Sachen verstehe ich nicht:

In der Fenstermitte habe ich ein Canvas, indem das komplette Tileset gezeichnet werden soll.
Der Code dazu sieht so aus:
BlitzMax: [AUSKLAPPEN]
Case EVENT_GADGETPAINT
SetGraphics(CanvasGraphics(tgTilesetCanvas))
Local x:Int = 0
For Local img:TImage = EachIn tlImgList
DrawImage(img, x, 0)
x = x + img.width
Next
Flip


Aber irgendwie funktioniert das nicht richtig. Undzwar wird nur von dem ersten Bild ein Teil gezeichnet. Oben links im Canvas. Und es ist nur ein Teil des Bildes. Nichtmal irgendeine Ecke, sondern irgendein Teil aus der Mitte.
Dazu muss ich sagen: Das Canvas ist zu Beginn viel kleiner und wird dann erst größer, undzwar hier:
BlitzMax: [AUSKLAPPEN]
Local ix:Int = 0
Local iyMax:Int = 0
For Local img:TImage = EachIn tlImgList
ix = img.width + ix
iyMax = Max(iyMax, img.height)
Next
SetGadgetShape(tgTilesetCanvas, tgTilesetCanvas.xpos, tgTilesetCanvas.ypos, ix, iyMax)
RedrawGadget(tgTilesetCanvas)

Der Code wird ausgeführt, wenn der Benutzer ein Bild in das Programm lädt.
Der Teil von dem Bild, der gezeichnet wird, ist genauso groß, wie das Canvas zu Beginn, bevor es vergrößert wird.
Das SetGadgetShape habe ich in der Forensuche gefunden.

Das zweite ist:
Ich möchte, dass der Benutzer aus allen Tiles eines auswählen kann (und dann berarbeiten kann).
Also, an der Seite sollen alle geladenen Tiles angezeigt werden und anklickbar sein. Wenn aber eine Anzahl an Tiles überschritten wird, dann soll man in der Liste scrollen können.
Ich mein das im Prinzip so wie hier: user posted image (oben links)
So wie ich das bis jetzt gesehen habe, kann man aber nur in Verbindung mit Gabpixmap in einem Canvas scrollen. Demnach müsste ich alle Tiles auf eine Pixmap schreiben. Aber dann wäre das mit dem Anklicken nicht mehr so einfach möglich.

Kann mir bitte jemand weiterhelfen?
(Ich hoffe, ich habe mich einigermaßen verständlich ausgedrückt.)

Lg, M0rgenstern

ZaP

BeitragSo, Apr 08, 2012 19:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Wegen dem Scrollen: Verpass jedem Tile ein offset und subtrahier das dann von der vertikalen Position der Tiles in der Liste, oder nimm gleich den Wert der Scrollbar dazu.
Starfare: Worklog, Website (download)

Midimaster

BeitragSo, Apr 08, 2012 19:08
Antworten mit Zitat
Benutzer-Profile anzeigen
1.

Die Canvas darf von Anfang an größer sein als ihr Container. Lege sie zu Beginn gleich auf 1000x1000 fest.

hier mal ein Beispiel, das auch schon scrollt:

BlitzMax: [AUSKLAPPEN]
Import MaxGUI.Drivers 
Global Window:TGadget, Canvas:TGadget, ScrollBox:TGadget


Type FarbeTyp
Field R%,G%,B%
End Type

Global Farbe:FarbeTyp[50,50]
FarbenFestlegen
FensterErstellen()


CreateTimer 10
While WaitEvent()
Local tmpGadget:TGadget
'Print EventID()
Select EventID()
Case EVENT_TIMERTICK
HauptSchleife
Scroll=Scroll-1
SetGadgetShape Scrollbox,0,Scroll,200,1000
Case EVENT_GADGETPAINT
Local Fenster:TGraphics=CanvasGraphics(canvas)
SetGraphics Fenster
SetClsColor 255,255,255
Cls
For i=0 To 30
For j=0 To 30
SetColor Farbe[i,j].R,Farbe[i,j].G,Farbe[i,j].B
DrawRect i*30,j*30,30,30
Next
Next
Flip
Case EVENT_WINDOWCLOSE
ProgrammEnde

Case EVENT_APPTERMINATE
ProgrammEnde

Case EVENT_MENUACTION

Case EVENT_MOUSEDOWN
tmpGadget = TGadget(EventSource())
If tmpGadget=Canvas
Print "maus " + mausx + " " + mausy
EndIf
Case EVENT_MOUSEMOVE
tmpGadget= TGadget(EventSource())
If tmpGadget=Canvas
MausX=EventX()
MausY=EventY()
EndIf
Case EVENT_GADGETACTION
End Select
Wend
ProgrammEnde


Function ProgrammEnde()
End
End Function

Function Hauptschleife()

End Function


Function FensterErstellen()
Local flags%=WINDOW_TITLEBAR | WINDOW_CLIENTCOORDS|WINDOW_CENTER
Window= CreateWindow("Leeres Test Window" , 0 , 0 , 600 , 400 , Null , Flags%)
ScrollBox=CreatePanel(5 , 5 , 200, 1000 , Window)
Canvas=CreateCanvas(5 , 5 , 1000, 1000 , ScrollBox)

End Function



Function FarbenFestlegen()
For i=0 To 30
For j=0 To 30
Farbe[i,j]=New FarbeTyp
Farbe[i,j].R=Rand(255)
Farbe[i,j].G=Rand(255)
Farbe[i,j].B=Rand(255)
Next
Next
End Function


Die Canvas wird dabei nur einmal in einen Container ScrollBox gezeichnet. Nun wird dieser Container ScrollBox gegen seinen Parent Window verschoben. Es sieht aus wie Scrollen. Gezeichnet muss dabei nix mehr werden!

Bei mehreren Mausklicks auf die "gleiche" Stelle (Maus nicht mitbewegen) zeigt sich, dass die Canvas-Koordinaten stets korrekt (also verschoben) erfasst werden.
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

M0rgenstern

BeitragSo, Apr 08, 2012 19:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey.
Vielen Dank ihr beiden.
Genau das habe ich gesucht. Das Canvas-Problem habe ich gelöst. Ich setze die Größe am Anfang einfach sehr hoch und verkleinere es danach auf 0,0. Und dann benutze ich halt das vergrößern wie oben bei mir gezeigt.
Aber mal ne Frage: Warum funktioniert das nicht? Also dieses nachträgliche Vergößern. Warum bleibt die Größe, in der gezeichnet wird, auf der Anfangsgröße stehen?
Das Beispiel von Midimaster bin ich mir gerade nochmal genau am ansehen. Das werde ich dann entsprechend bei mir einbauen, sobald ichs komplett durchblickt habe.

Lg, M0rgenstern
 

jsp

BeitragSo, Apr 08, 2012 23:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Du solltest auch den Viewport setzen:
SetGraphics CanvasGraphics ( Canvas )
SetViewport 0,0,GadgetWidth( Canvas ),GadgetHeight( Canvas )

dann kannst du das Canvas immer dynamisch anpassen.

Das Canvas beliebig gross in das ScrollPanel reinzulegen könnte auch schiefgehen, laut Mark Sibly darf das Canvas nicht größer sein als der Desktop.
Logic Gui Professional a Gui Designer for MaxGui

M0rgenstern

BeitragMo, Apr 09, 2012 10:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey jsp.
Vielen Dank.
Das hat geholfen. Hatte zwar wie gesagt schon vorher funktioniert, aber ich muss sagen, dass ich es so schöner finde.

Lg, M0rgenstern

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group