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: :wink:

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? :o

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?!?! 8)

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?!?! 8)
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).