Seite 1 von 1
Auf einem MDI Window Zeichnen
Verfasst: 01.06.2005 17:25
von Neptunar
Hallo,
hab gerade versucht per StartDrawing() etc. auf ein MDIGadget bzw. auf ein Fester in diesem Gadget zu zeichnen, allerdings funktioniert das nicht, da ich unbedingt mit WindowOutput() zeichnen will und dann immer das Hauptfenster für die Zeichenoperation genommen wird.
Hat jemand eine Idee wie man das Problem umgehen kann?
Gruß Neptunar

Verfasst: 01.06.2005 20:10
von Stefan
Hallo Neptunar
Hab dir ein kleines Beispiel geschrieben, das zeigt wie man auf child windows zeichnen kann:
Code: Alles auswählen
Structure DrawingInfoStruct
Type.l
Window.l
DC.l
ReleaseProcedure.l
PixelBuffer.l
Pitch.l
Width.l
Height.l
Depth.l
EndStructure
Global DS.DrawingInfoStruct
Procedure ReleaseOutput()
ReleaseDC_(DS\Window,DS\DC)
EndProcedure
Procedure WindowIDOutput(hWnd) ; returns the outputID for the declared window handle
DS\Type=2
DS\Window=hWnd
DS\DC=GetDC_(hWnd) ;GetWindowDC_(hWnd)
DS\ReleaseProcedure=@ReleaseOutput()
ProcedureReturn DS
EndProcedure
Flags=#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered
OpenWindow(0,0,0,400,300,Flags,"Draw on child window")
CreateGadgetList(WindowID())
CreateMenu(0,WindowID())
MenuTitle("Children")
MDIGadget(0,0,0,0,0,0,1,#PB_MDI_AutoSize|#PB_MDI_NoScrollBars)
ChildWindow1=AddGadgetItem(0,-1,"child1"); returns the window handle of the child window
ChildWindow2=AddGadgetItem(0,-1,"child2")
Repeat
Event=WaitWindowEvent()
If Event=#PB_Event_Repaint
StartDrawing(WindowOutputID(ChildWindow2)); draw on the child window
RandomSeed(1)
For c=0 To 5
Circle(Random(200),Random(200),32,Random($FFFFFF))
Next
StopDrawing()
EndIf
Until Event=#PB_Event_CloseWindow
Gruß
Stefan
Verfasst: 01.06.2005 20:17
von Neptunar
wow, das hilft mir sehr
danke das du dir die arbeite gemacht hast! TOP!!!
dann hätte ich noch ne frage, wie könnte man eigentlich das flimmern wegbekommen, wenn die grafiken neu gezeichnet werden?

Verfasst: 01.06.2005 22:18
von Life-for-fun
Gibt halt verschiedene Möglichkeiten das Flimmern wegzubekommen. Einmal kann man Delay(10) benutzen, aber da bin ich mir nicht sicher, ob das immer klappt. Zweite Möglichkeit: Man lässt vorher erst alles auf ein Bild zeichnen und dann das Bild aufs Fenster ausgeben. So mache ich es meistens.

Verfasst: 01.06.2005 22:49
von Neptunar
jo,
imagegadget wäre nett, aber ich möchte gern direkt auf dem fenster rendern und weil eventuell andere gadgets darauf sollen und ist net sehr schön wenn man gadgets auf gadgets hat oder?!?!

Verfasst: 01.06.2005 22:54
von Life-for-fun
Ich meine auch gar nicht, dass du ein ImageGadget erstellen sollst
Einfach Startdrawing(...) dann DrawImage(Image auf dem alles gezeichnet wurde,x,y) und Stopdrawing(). Brauchst also keine Gadgets

Nur das halt schonmal alles aufs Bild gezeichnet wurde

So kommt manchmal nämlich das Flimmern zustande, dass manche Objekte noch nicht gezeichnet wurden, wenn das Fenster angezeigt wird und so wird zuerst auf das Bild gezeichnet, was man eh nicht sieht und das fertige Bild wird dann ausgegeben, bzw. angezeigt

Verfasst: 01.06.2005 23:04
von Kekskiller
Wollte gerade sagen, dass mit dem Image ist wohl die einzige Alternative. Bin ich auch gerade mit konfrontiert worden, nur Schade halt, dass man dafür immer etwas viel Speicher verbraten muss...
Verfasst: 02.06.2005 07:32
von Danilo
Neptunar hat geschrieben:imagegadget wäre nett, aber ich möchte gern direkt auf dem fenster rendern und weil eventuell andere gadgets darauf sollen und ist net sehr schön wenn man gadgets auf gadgets hat oder?!?!

Soll das Bild hinter den Gadgets sein, also sozusagen als
Hintergrundbild für das Fenster? Dann einfach auf ein Image
zeichnen und mit SetWinBackgroundImage() setzen (PureTools).