Seite 1 von 1

Fensterinhalt als Bild

Verfasst: 26.05.2011 14:27
von bobobo
Bild inhalt als Image sichern etwas tunen und wieder auf dem Fenster darstellen


Das zugehörige Schimmel1.png gibt es hier ("Ziel speichern unter..")
(oder als Alternative das hier )

der Code wurde nun etwas getunt
und nochmal

Code: Alles auswählen

; Schimmelfenster
; tlw. Droopy-code
; in WinXp geht's
Enumeration
  #Window_0
EndEnumeration

Enumeration
  #Button_0
  #Button_1
  #Button_2
  #String_0
  #Web_0
  #Combo_0
  #String_1
  #Button_3
  #Image_back
EndEnumeration

Enumeration
  #image_win
  #image_schimmel1
EndEnumeration

Procedure Open_Window_0()
  hwnd= OpenWindow(#Window_0, 0, 0, 800, 600, "Schwachsinn",  #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered )
  If CreateGadgetList(WindowID(#Window_0))
    ImageGadget(#image_back,0,0,800,600,0)
    HideGadget(#Image_back,1)
    ButtonGadget(#Button_0, 40, 20, 80, 20, "Wartmal")
    ButtonGadget(#Button_1, 40, 50, 80, 20, "Aufrufen")
    ButtonGadget(#Button_2, 40, 80, 80, 20, "Tu Nix")
    WebGadget(#Web_0, 10, 210, 780, 370, "about:blank")
    ComboBoxGadget(#Combo_0, 390, 20, 360, 20)
    StringGadget(#String_1, 10, 190, 780, 20, "")
    ButtonGadget(#Button_3, 40, 110, 80, 20, "Ende")
  EndIf
  ProcedureReturn hwnd
EndProcedure

Procedure CaptureScreenPart(Left.l, Top.l, Width.l, Height.l) 
  border= GetSystemMetrics_(#SM_CXBORDER) ;ermittlung der Breite der Rahmen
  tlh=GetSystemMetrics_(#SM_CYCAPTION)    ; und titelleiste
  dm.DEVMODE 
  BMPHandle.l 
  srcDC = CreateDC_("DISPLAY", "", "", dm) 
  trgDC = CreateCompatibleDC_(srcDC) 
  BMPHandle = CreateCompatibleBitmap_(srcDC, Width, Height) 
  SelectObject_( trgDC, BMPHandle) 
  BitBlt_( trgDC, 0, 0, Width, Height, srcDC, Left+border*3, Top+tlh+border*3, #SRCCOPY) 
  DeleteDC_( trgDC) 
  ReleaseDC_( BMPHandle, srcDC)
  CaptureScreenHeight=Height
  CaptureScreenWidth=Width
  CaptureScreenBMPHandle=BMPHandle
  ProcedureReturn BMPHandle 
EndProcedure

Procedure CaptureWindow(Handle.l) ; ### The Window must be visible !
  If Handle 
    WindowSize.RECT 
    GetWindowRect_(Handle, @WindowSize) 
    ProcedureReturn CaptureScreenPart(WindowSize\Left, WindowSize\Top, WindowSize\Right - WindowSize\Left, WindowSize\Bottom - WindowSize\Top) 
  EndIf
EndProcedure

hwnd = Open_Window_0()
AddGadgetItem(#Combo_0,-1,"http://www.purebasic.com/")
AddGadgetItem(#Combo_0,-1,"http://www.google.com/")
AddGadgetItem(#Combo_0,-1,"http://www.dasendedesinternet.de/")
UsePNGImageDecoder()
LoadImage(#image_schimmel1,"schimmel1.png") ;Bild mit Transparenz

Repeat
  Event = WaitWindowEvent(12)
  WindowID = EventWindow()
  GadgetID = EventGadget()
  EventType = EventType()
  
  If Event = #PB_Event_Gadget
    
    If GadgetID = #Button_0 And GetGadgetText(#Button_0)="Wartmal"
      winbild=CaptureWindow(WindowID(#Window_0))
      
      HideGadget(#Combo_0,1)
      HideGadget(#String_1,1)
      HideGadget(#Button_1,1)
      HideGadget(#Button_2,1)
      HideGadget(#Button_3,1)
      HideGadget(#String_1,1)
      HideGadget(#Combo_0,1)
      HideGadget(#Web_0,1)
      CreateImage(#image_win,WindowWidth(#window_0),WindowHeight(#window_0))
      
      StartDrawing(ImageOutput(#image_win))
        DrawImage(winbild,0,0)
        DrawingMode(#PB_2DDrawing_AlphaBlend)
        DrawImage(ImageID(#image_schimmel1),0,0,ImageWidth(0),ImageHeight(0))
      StopDrawing()
      SetGadgetState(#Image_back,ImageID(#image_win))
      HideGadget(#image_back,0)
      DisableGadget(#image_back,1)
      SetGadgetText(#Button_0,"Weiter geht's"  )
      
    ElseIf GadgetID = #Button_0 And GetGadgetText(#Button_0)="Weiter geht's"
      HideGadget(#image_back,1)
      
      SetGadgetText(#Button_0,"Wartmal")
      HideGadget(#String_1,0)
      HideGadget(#Combo_0,0)
      HideGadget(#Button_1,0)
      HideGadget(#Button_2,0)
      HideGadget(#Button_3,0)
      HideGadget(#Web_0,0)
      HideWindow(#Window_0,1)
      HideWindow(#Window_0,0)

    ElseIf GadgetID = #Button_1 
      SetGadgetText(#Web_0,GetGadgetText(#Combo_0))
      SetGadgetText(#String_1,GetGadgetText(#Combo_0))
      
    ElseIf GadgetID = #Button_3
      quit+1  
    EndIf
    
  EndIf
  
Until Event = #PB_Event_CloseWindow Or quit

End

Re: Fensterinhalt als Bild

Verfasst: 26.05.2011 15:36
von RSBasic
:roll: Hm, ich find dein Code nicht so besonders. Wenn ich dein Fenster mit dem Hintergrundbild außerhalb des Bildschirms verschiebe, dann muss das Bild neu gezeichnet werden, da sonst das gezeichnete Bild zerstört wird:
Bild

Ich würds eher so machen:

Code: Alles auswählen

EnableExplicit

Define bgimage
Define hBrush

bgimage = LoadImage(#PB_Any,"C:\...\Dein_Fensterhintergrundbild.bmp")

If OpenWindow(0,0,0,500,250,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  
  hBrush = CreatePatternBrush_(ImageID(bgimage))
  SetClassLongPtr_(WindowID(0), #GCL_HBRBACKGROUND, hBrush)
  InvalidateRect_(WindowID(0), #Null, #True)
  
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Dann bleibt das Hintergrundbild auch weiterhin bestehen, egal ob ein Repaint-Event stattfindet.
bo³ hat geschrieben:Statt weißem Überzug
Du hast nicht verstanden, worum es geht oder? Es geht nicht darum, das Fenster hübscher zu machen, so dass der weiße Hintergrund nicht so auffällt, sondern allgemein, dass das Fenster während der Auslastung nicht mehr reagiert, so dass man dieses einfach abschießen könnte.
Wie ich im anderen Thread bereits sagte, ist, dass diese WinAPI für die Cursoränderung während der Auslastung nur für kurze Vorgänge sinnvoll ist, da das Fenster ja die ganze Zeit nicht mehr reagiert. Da sollte man schon drauf achten, nicht dass ein Anwender denkt, dass das Programm sich eventuell aufgehängt hat.

Aber trotzdem vielen Dank für die Mühe. :allright:

Re: Fensterinhalt als Bild

Verfasst: 26.05.2011 16:58
von c4s
Um ein richtiges Bild vom Fenster macht - auch wenn versteckt, verdeckt, z.T. außerhalb des Desktops - fällt mir der "PrintWindow" API-Befehl ein. Per OpenLibrary kannm man sich den aus user32.dll (ab XP?!) holen. Auf die schnelle so ungefähr:

Code: Alles auswählen

Procedure ScreenshotWindow(WindowID)
	Protected WindowRect.RECT, LibraryNr, ImageNr, hDC

	If GetWindowRect_(WindowID, @WindowRect)
		ImageNr = CreateImage(#PB_Any, WindowRect\right - WindowRect\left, WindowRect\bottom - WindowRect\top)
		If ImageNr
			hDC = StartDrawing(ImageOutput(ImageNr))
			If hDC
				LibraryNr = OpenLibrary(#PB_Any, "user32.dll")
				If LibraryNr
					CallFunction(LibraryNr, "PrintWindow", WindowID, hDC, 0)
					CloseLibrary(LibraryNr)
				EndIf
				StopDrawing()
			EndIf
		EndIf
	Else
		ImageNr = -1
	EndIf

	ProcedureReturn ImageNr
EndProcedure



MessageRequester("", "Ein Fenster aktivieren..." + #CRLF$ + #CRLF$ + "Screenshot in 5 Sekunden!", #MB_ICONINFORMATION)
Delay(5000)


ImageNr = ScreenshotWindow(GetForegroundWindow_())

ShowLibraryViewer("Image", ImageNr)
CallDebugger
(Für den Fensterinhalt GetClientRect_() verwenden.)

Re: Fensterinhalt als Bild

Verfasst: 26.05.2011 18:00
von thminz
Beide Codes sind für mich super hilfreich. Hab es bei mir abgespeichert. Danke :)

Was sind den das für Befehle die am ende einen _ haben ?

Rsbasic, wie viele Bilder hast du den jetzt schon hoch geladen ? Löschst du sie auch wieder ? Wenn ja das wär das doof dann könntest du doch lieber auf einen Hoster deine Bilder hoch laden. :)

Re: Fensterinhalt als Bild

Verfasst: 26.05.2011 18:30
von bobobo
eingebaute system-api-funktionen

Re: Fensterinhalt als Bild

Verfasst: 26.05.2011 18:33
von bobobo
c4s hat geschrieben:Um ein richtiges Bild vom Fenster macht - auch wenn versteckt, verdeckt, z.T. außerhalb des Desktops - fällt mir der "PrintWindow" API-Befehl ein.
der liefert mit dem OperaBrowser ein schwarzes Bild . Mit der Purebasic-IDE geht das allerdings

Re: Fensterinhalt als Bild

Verfasst: 26.05.2011 18:37
von bobobo
RSBasic hat geschrieben:Du hast nicht verstanden, worum es geht oder? Es geht nicht darum, das Fenster hübscher zu machen, so dass der weiße Hintergrund nicht so auffällt, sondern allgemein, dass das Fenster während der Auslastung nicht mehr reagiert, so dass man dieses einfach abschießen könnte.
Wie ich im anderen Thread bereits sagte, ist, dass diese WinAPI für die Cursoränderung während der Auslastung nur für kurze Vorgänge sinnvoll ist, da das Fenster ja die ganze Zeit nicht mehr reagiert. Da sollte man schon drauf achten, nicht dass ein Anwender denkt, dass das Programm sich eventuell aufgehängt hat.
Das habe ich wohl verstanden .. und daraufhin kam mir die Idee , das ein "weißer Belag" aussieht wie Schimmel
und das man sowas auch anschaulicher darstellen kann.
Sollte eher ein Joke sein.
Den Code habe ich übrigens mit dem VisualDesigner und geklauten Sachen aus dem Forum flott zusammengekloppt.
Logisch ist dadurch der Code zumindest "komisch".

und "Dein" Code (hbrush..) lässt das Bild nicht permanent über dem Webgadget liegen. Wenn da mit nem
anderen Fenster drüberwischt ist das Bild auch kaputt

Was man macht ist falsch 8)

Re: Fensterinhalt als Bild

Verfasst: 26.05.2011 18:47
von RSBasic
@bobobo
Ah okay, alles klar.
thminz hat geschrieben:Rsbasic, wie viele Bilder hast du den jetzt schon hoch geladen ? Löschst du sie auch wieder ? Wenn ja das wär das doof dann könntest du doch lieber auf einen Hoster deine Bilder hoch laden. :)
Meinst du die Screenshots, die ich ab und zu erstelle, wenn ich was grafisch zeigen möchte? Warum möchtest du das denn wissen?^^ Muss ich erst nachschauen... 513 Screenshots sind bis jetzt bei mir drauf. (~47 MB)
Aber keine Angst, ich heb sie schon alle auf und lösch auch keinen einzigen, so dass alle Grafiken von mir auch hier problemlos angezeigt werden können. Ist außerdem auch für mich etwas interessant, wenn ich nach Jahren meine ganzen alten Screens anschaue, dann bekomme ich bei jeder Grafik eine Assoziation zu einer bestimmten Situation. Das ist wie das Anschauen von alten Urlaubsbildern.

Re: Fensterinhalt als Bild

Verfasst: 26.05.2011 19:13
von bobobo
obiger code wurde nochmal etwas angepasst
da nun letztlich auf ein imagegadget gemalt wird
und das disablet wird braucht man sich um refreshing
keine Gedanken mehr zu machen. :D

Re: Fensterinhalt als Bild

Verfasst: 27.05.2011 20:58
von thminz
Rsbasic: Wow so viele? Aber wenn du sie nicht löschst dann ist gut :allright: