Seite 1 von 2

Re: Fensterhintergrund ein Bild (Image)

Verfasst: 22.10.2014 19:55
von Shardik
Ich habe ts-softs Beispiel um den Mac-spezifischen Teil ergänzt:

Code: Alles auswählen

EnableExplicit

InitNetwork()
UseJPEGImageDecoder()

Procedure SetWindowBackgroundImage(hWnd.i, hImage.i)
  CompilerSelect #PB_Compiler_OS
    CompilerCase #PB_OS_Linux
      Protected *Background
      Protected FixedBox.i
      Protected *Style.GtkStyle
      gdk_pixbuf_render_pixmap_and_mask_(hImage, @*Background, 0, 0)
      *Style = gtk_style_new_()
      *Style\bg_pixmap[0] = *Background
      FixedBox = g_list_nth_data_(gtk_container_get_children_(gtk_bin_get_child_(hWnd)), 0)
      gtk_widget_set_style_(FixedBox, *Style)
   
    CompilerCase #PB_OS_Windows
      Protected hBrush = CreatePatternBrush_(hImage)
      If hBrush
        SetClassLongPtr_(hWnd, #GCL_HBRBACKGROUND, hBrush)
        InvalidateRect_(hWnd, 0, #True)
        UpdateWindow_(hWnd)
      EndIf
     
    CompilerCase #PB_OS_MacOS
      CocoaMessage(0, hWnd, "setBackgroundColor:",
        CocoaMessage(0, 0, "NSColor colorWithPatternImage:", hImage))
  CompilerEndSelect
EndProcedure

If ReceiveHTTPFile("http://realsource.de/images/stargate_atlantis.jpg", GetTemporaryDirectory() + "stargate_atlantis.jpg")
  LoadImage(0, GetTemporaryDirectory() + "stargate_atlantis.jpg")
  OpenWindow(0, #PB_Ignore, #PB_Ignore, 800, 450, "")
  SetWindowBackgroundImage(WindowID(0), ImageID(0))
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Bild

Ich möchte übrigens noch eine fehlende Quellenangabe von ts-softs Linux-Teil nachreichen, denn es stammt von mir... :mrgreen:
http://www.purebasic.fr/english/viewtop ... 38&start=1

Zu Plattform-unabhängigen Beispielen mit jeweils betriebssystemspezifischen Funktionsaufrufen, die in PureBasic (noch) nicht implementiert sind, habe ich übrigens im englischen Forum eine Sammlung von Lösungen zusammengestellt:
http://www.purebasic.fr/english/viewtop ... 3&start=11

Für MacOS X hat wilbert im englischen Forum eine Lösungssammlung zusammengestellt:
http://www.purebasic.fr/english/viewtop ... 19&t=50795

Und für Linux kann ich nur einen Blick in Charly "Omi" Bauers Sammlung empfehlen:
http://www.chabba.de/ (unter Linux-PureBasic-API)

RSBasic hat in seinem Posting ja schon auf seine riesige WinAPI-Bibliothek für Windows hingewiesen:
http://www.rsbasic.de/winapi-library

Re: Fensterhintergrund ein Bild (Image)

Verfasst: 22.10.2014 21:39
von stevie1401
Tolles Forum, danke für eure Hilfe!

Re: Fensterhintergrund ein Bild (Image)

Verfasst: 22.10.2014 21:45
von ts-soft
Naja, wenn Du mir dafür Doppelkopf beibringst 8)

Re: Fensterhintergrund ein Bild (Image)

Verfasst: 28.10.2014 13:43
von stevie1401
Schaue einfach mal auf unserer kleinen Plattform rein. Anfänger (und solche, die es werden wollen) sind immer herzlich willkommen.

Nun habe ich endlich die Vollversionen und konnte eure Hintergrundbeispiele unter Windows und Linux testen.
Prima!!

Re: Fensterhintergrund ein Bild (Image)

Verfasst: 24.10.2015 13:44
von Shardik
Ich habe den Linux-spezifischen Teil so angepaßt, dass er sowohl mit Gtk2 und Gtk3 funktioniert und in PB 5.31 und 5.40 im ASCII- und Unicode-Modus problemlos läuft (getestet unter Ubuntu 14.04 x64 mit KDE):

Code: Alles auswählen

EnableExplicit

InitNetwork()
UseJPEGImageDecoder()

Procedure SetWindowBackgroundImage(hWnd.i, hImage.i)
  CompilerSelect #PB_Compiler_OS
    CompilerCase #PB_OS_Linux
      Protected Child.I
      Protected ChildrenList.I
      Protected *Name
      Protected Widget.I = gtk_bin_get_child_(hWnd)
     
      Repeat
        ChildrenList = gtk_container_get_children_(Widget)
        Child = g_list_nth_data_(ChildrenList, 0)
       
        If Child = 0
          Break
        Else
          *Name = gtk_widget_get_name_(Child)
          Widget = Child
        EndIf
      Until PeekS(*Name, -1, #PB_UTF8) = "GtkFixed"
     
      If Child
        gtk_fixed_put_(Child, gtk_image_new_from_pixbuf_(hImage), 0, 0)
        gtk_widget_show_all_(hWnd)
      EndIf
   
    CompilerCase #PB_OS_Windows
      Protected hBrush = CreatePatternBrush_(hImage)
      If hBrush
        SetClassLongPtr_(hWnd, #GCL_HBRBACKGROUND, hBrush)
        InvalidateRect_(hWnd, 0, #True)
        UpdateWindow_(hWnd)
      EndIf
     
    CompilerCase #PB_OS_MacOS
      CocoaMessage(0, hWnd, "setBackgroundColor:",
        CocoaMessage(0, 0, "NSColor colorWithPatternImage:", hImage))
  CompilerEndSelect
EndProcedure

If ReceiveHTTPFile("http://realsource.de/images/stargate_atlantis.jpg", GetTemporaryDirectory() + "stargate_atlantis.jpg")
  LoadImage(0, GetTemporaryDirectory() + "stargate_atlantis.jpg")
  OpenWindow(0, 100, 100, 800, 450, "Window with background image")
  SetWindowBackgroundImage(WindowID(0), ImageID(0))
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf

Re: Fensterhintergrund ein Bild (Image)

Verfasst: 24.10.2015 14:36
von ts-soft
:allright:

Kannst Du das in dem Tipps & Tricks Forum posten, danke!

Re: Fensterhintergrund ein Bild (Image)

Verfasst: 24.10.2015 14:40
von mk-soft
Vielen Dank :allright:

Re: Fensterhintergrund ein Bild (Image)

Verfasst: 24.10.2015 14:42
von Omi
Hallo Shardik,

ich hab mich heut Früh rangemacht rauszufinden, was denn das PB unter Linux gtk2 und gtk3 denn nun wirklich einfärbt bei den Fensterfarben und Bildern, da API-Funktionen ja nicht durchkommen.
Ich hab mich vom einem Gadget zum 1. GtkFixed runtergehangelt und gemerkt dass man dies umfärben und auch durchsichtig machen kann. Darunter kam die alte original API-Fensterfarbe zum Vorschein die dann auch unter gtk3 sichtbar zu manipulieren ist. :lol:

Morgen wollte ich mich mal von der Fensterseite zum 1. GtkFixed durchhangeln und für die ganzen PB- u. API-Färbereien und Image-Einpflanzung exemplarische gtk2- und gtk3-Codes zu erstellen.

Danke, dass Du immer schneller bist und schon vorgehangelt hast! :roll:

Charly

Re: Fensterhintergrund ein Bild (Image)

Verfasst: 03.01.2017 15:32
von schleicher
Das mit dem Windowshintergrund geht ja gut, doch wie bekomme ich den texthintergrund(textgadget) transparent ? Habe mal beide winapi kombiniert, aber das geht nicht.

Eine Idee warum und wie könnte man das richtig machen ? Fordergrundfarbe textgadget wählbar/ Hintergrundfarbe transparent. (windos, linux, mac)

Code: Alles auswählen

EnableExplicit

UseJPEGImageDecoder()

Procedure SetWindowBackgroundImage(hWnd.i, hImage.i)
  CompilerSelect #PB_Compiler_OS
    CompilerCase #PB_OS_Linux
      Protected Child.I
      Protected ChildrenList.I
      Protected *Name
      Protected Widget.I = gtk_bin_get_child_(hWnd)
     
      Repeat
        ChildrenList = gtk_container_get_children_(Widget)
        Child = g_list_nth_data_(ChildrenList, 0)
       
        If Child = 0
          Break
        Else
          *Name = gtk_widget_get_name_(Child)
          Widget = Child
        EndIf
      Until PeekS(*Name, -1, #PB_UTF8) = "GtkFixed"
     
      If Child
        gtk_fixed_put_(Child, gtk_image_new_from_pixbuf_(hImage), 0, 0)
        gtk_widget_show_all_(hWnd)
      EndIf
   
    CompilerCase #PB_OS_Windows
      Protected hBrush = CreatePatternBrush_(hImage)
      If hBrush
        SetClassLongPtr_(hWnd, #GCL_HBRBACKGROUND, hBrush)
        InvalidateRect_(hWnd, 0, #True)
        UpdateWindow_(hWnd)
      EndIf
     
    CompilerCase #PB_OS_MacOS
      CocoaMessage(0, hWnd, "setBackgroundColor:",
        CocoaMessage(0, 0, "NSColor colorWithPatternImage:", hImage))
  CompilerEndSelect
EndProcedure

Procedure WCB(WindowID,  Message, wParam, lParam)
  Protected Result
  Result = #PB_ProcessPureBasicEvents
  Select Message
   Case #WM_CTLCOLORSTATIC
      Select lparam
      Case GadgetID(1)
         SetBkMode_(wparam,#TRANSPARENT)
         ProcedureReturn GetStockObject_(#HOLLOW_BRUSH)
      EndSelect
  EndSelect
  ProcedureReturn Result
EndProcedure

  LoadImage(0, GetCurrentDirectory()+"Image\black-background.jpg");-Pfad anpassen
  OpenWindow(0, 100, 100, 800, 450, "Window with background image")
  TextGadget(1, 20, 20, 100, 20, "Text transparent")
  SetWindowBackgroundImage(WindowID(0), ImageID(0))
  SetWindowCallback(@WCB(), 0)
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow

Re: Fensterhintergrund ein Bild (Image)

Verfasst: 03.01.2017 15:39
von RSBasic

Code: Alles auswählen

SetWindowBackgroundImage(WindowID(0), ImageID(0))
SetWindowCallback(@WCB(), 0)
Bild

Code: Alles auswählen

SetWindowCallback(@WCB(), 0)
SetWindowBackgroundImage(WindowID(0), ImageID(0))