Fensterinhalt als Bild

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Fensterinhalt als Bild

Beitrag 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
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Fensterinhalt als Bild

Beitrag 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:
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: Fensterinhalt als Bild

Beitrag 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.)
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
Benutzeravatar
thminz
Beiträge: 84
Registriert: 25.05.2011 16:01
Computerausstattung: Windows XP, Intel Pentium 4 mit 3,2 Ghz, 2 GB RAM, 500 GB, ATI Radeon HD 4200
Wohnort: Köln

Re: Fensterinhalt als Bild

Beitrag 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. :)
Immer Aktuelle Purebasic Version!!
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Fensterinhalt als Bild

Beitrag von bobobo »

eingebaute system-api-funktionen
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Fensterinhalt als Bild

Beitrag 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
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Fensterinhalt als Bild

Beitrag 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)
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Fensterinhalt als Bild

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Fensterinhalt als Bild

Beitrag 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
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
thminz
Beiträge: 84
Registriert: 25.05.2011 16:01
Computerausstattung: Windows XP, Intel Pentium 4 mit 3,2 Ghz, 2 GB RAM, 500 GB, ATI Radeon HD 4200
Wohnort: Köln

Re: Fensterinhalt als Bild

Beitrag von thminz »

Rsbasic: Wow so viele? Aber wenn du sie nicht löschst dann ist gut :allright:
Immer Aktuelle Purebasic Version!!
Antworten