Auf einem MDI Window Zeichnen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Neptunar
Beiträge: 24
Registriert: 10.05.2005 16:46
Wohnort: Hmmm.... wenn ich das wüsste

Auf einem MDI Window Zeichnen

Beitrag 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 :)
Stefan
Beiträge: 125
Registriert: 29.08.2004 10:51
Kontaktdaten:

Beitrag 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
Benutzeravatar
Neptunar
Beiträge: 24
Registriert: 10.05.2005 16:46
Wohnort: Hmmm.... wenn ich das wüsste

Beitrag 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
Benutzeravatar
Life-for-fun
Beiträge: 21
Registriert: 30.05.2005 20:28
Wohnort: Offenbach
Kontaktdaten:

Beitrag 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. :)
Benutzeravatar
Neptunar
Beiträge: 24
Registriert: 10.05.2005 16:46
Wohnort: Hmmm.... wenn ich das wüsste

Beitrag 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)
Benutzeravatar
Life-for-fun
Beiträge: 21
Registriert: 30.05.2005 20:28
Wohnort: Offenbach
Kontaktdaten:

Beitrag 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 ;)
Kekskiller
Beiträge: 752
Registriert: 14.09.2004 21:39
Kontaktdaten:

Beitrag 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...
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag 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).
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Antworten