BitBlt-Analogon mit GTK
Verfasst: 28.07.2011 16:59
Hallo zusammen,
ich hab seit langem mal wieder angefangen zu programmieren und bin mittlerweile von WinXP auf Ubuntu umgestiegen.
Nun arbeite ich gerade an einen Projekt mit einer "Zeichenfunktion" (einfaches zeichnen von zwei Linien in ein vorhandenes Bild).
Dies wollte ich eigentlich über ein ImageGaget() machen (Bild laden mit StartDrawing() manipulieren und via SetGadgetState() anzeigen).
Das Problem:
Es ruckelt extrem.
Meine Vermutung ist, dass der Flaschenhals die interne Handhabung von SetGadgetState() ist, denn mein kleines Testprogramm:
läuft flüssig, solang die Maus nicht über dem Gadget ist (was bei einem Zeichenfeld etwas unpraktisch ist).
Ruckelfrei ginge es, wenn ich das Bild direkt auf das Fenster zeichne (siehe auskommentierten Teil), das finde ich jedoch unschön.
Unter Windows würde ich in diesem Fall einfach mittels BitBlt() direkt den Grafikspeicher des Gadgets manipulieren,
aber wie geht das unter Linux und GTK?
ich hab seit langem mal wieder angefangen zu programmieren und bin mittlerweile von WinXP auf Ubuntu umgestiegen.
Nun arbeite ich gerade an einen Projekt mit einer "Zeichenfunktion" (einfaches zeichnen von zwei Linien in ein vorhandenes Bild).
Dies wollte ich eigentlich über ein ImageGaget() machen (Bild laden mit StartDrawing() manipulieren und via SetGadgetState() anzeigen).
Das Problem:
Es ruckelt extrem.
Meine Vermutung ist, dass der Flaschenhals die interne Handhabung von SetGadgetState() ist, denn mein kleines Testprogramm:
Code: Alles auswählen
OpenWindow(1,400,500,400,700,"Test",#PB_Window_SystemMenu)
TreeGadget(2,10,335,380,200)
For a = 0 To 10
AddGadgetItem (2, -1, "Node "+Str(a), 0, 0) ; benutzen Sie ImageID(x) als 4. Parameter
AddGadgetItem(2, -1, "Sub-Item 1", 0, 1) ; diese sind auf dem ersten Sublevel
Next
test=CreateImage(#PB_Any ,300,200)
ImageGadget(1,50,125,300,200,ImageID(test))
dir.l=1
y=100
Repeat
StartDrawing(ImageOutput(test))
Box(0,0,300,200,0)
Circle(x,y,30,RGB(255,0,0))
StopDrawing()
;StartDrawing(WindowOutput(1))
; DrawImage(ImageID(test),50,125)
;StopDrawing()
SetGadgetState(1,ImageID(test))
x=x+10*dir
If x >= 300-30
dir = -1
ElseIf x - 30 <= 0
dir = 1
EndIf
Delay(10)
event=WaitWindowEvent()
If event = #PB_Event_Gadget
Select EventGadget()
Case 2
MessageRequester("Testbox","Eintrag: " + GetGadgetItemText(2,GetGadgetState(2)))
EndSelect
EndIf
Until event = #PB_Event_CloseWindow
Ruckelfrei ginge es, wenn ich das Bild direkt auf das Fenster zeichne (siehe auskommentierten Teil), das finde ich jedoch unschön.
Unter Windows würde ich in diesem Fall einfach mittels BitBlt() direkt den Grafikspeicher des Gadgets manipulieren,
aber wie geht das unter Linux und GTK?