Clickable Area im Hintergrundbild des Hauptfensters ?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
alen
Beiträge: 107
Registriert: 09.04.2007 17:38
Computerausstattung: Main Hardware: AMD Ryzen 5 1600 - 6 Core / Gigabyte B450 Aorus Pro / Sapphire RX580 8GB
PB 5.61 and earlier @ Manjaro Linux XFCE x64/ Fedora Linux Cinnamon x64 / Windows 10 x64 on various Hardware Platforms
Wohnort: Duisburg
Kontaktdaten:

Clickable Area im Hintergrundbild des Hauptfensters ?

Beitrag von alen »

Hallo Zusammen,

ich habe in einem Win32 Programm per API Call dem Hauptfenster ein Hintergrundbild spendiert.

Nun würde ich gerne einen Teil des Bildes auch für den Anwender klickbar machen wollen.
Wenn der User auf diesen Bereich klickt möchte ich darauf reagieren.

Welches Gadget kann man dafür verwenden ? Oder funktioniert sowas nur über Umwege auch nur per API ?

Für Anregungen wäre ich sehr dankbar.
Besten Dank im Voraus.

Grüße
alen
---
Main Hardware: AMD Ryzen 5 1600 - 6 Core / Asus B350M-A / Nvidia GTX650
PB 5.61 and earlier @ Manjaro Linux XFCE x64/ Fedora Linux Cinnamon x64 / Windows 10 x64
on various Hardware Platforms (Notebook and Desktop)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Clickable Area im Hintergrundbild des Hauptfensters ?

Beitrag von Kaeru Gaman »

du kannst auf ein click-event reagieren, und dann WindowMouseX() und WindowMouseY() ermitteln und mit einer tabelle vergleichen, wo deine klickbaren Bereiche sein sollen.
das wäre jetzt das einfachste was mir dazu in den sinn kommt.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Re: Clickable Area im Hintergrundbild des Hauptfensters ?

Beitrag von PureLust »

alen hat geschrieben:... Nun würde ich gerne einen Teil des Bildes auch für den Anwender klickbar machen wollen.
... Welches Gadget kann man dafür verwenden ?
Sollte für sowas nicht eigentlich seit PB 4.40 B1 auch jedes PB-(Image)Gadget mit einem komplett transparenten Image gehen (also z.B. ImageGadget oder rahmenloses ButtonImageGadget)?

Auszug aus PB 4.40 B1-Infos:
freak hat geschrieben:- Added: Full alphachannel support for all GUI elements that display images
Hab's mal probiert hin zu bekommen - jedoch leider ohne Erfolg. /:->
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Clickable Area im Hintergrundbild des Hauptfensters ?

Beitrag von Kaeru Gaman »

hm... funzt doch einwandfrei?
kein Image geht auch.

Code: Alles auswählen

OpenWindow(0, #PB_Ignore,0, 800,512, "clicktest" )
  ImageGadget(0, 24,24, 64,64, 0 )

StartDrawing( WindowOutput(0) )
  For n=0 To 255
    LineXY( 0,     n, 799,     n, RGB(   0,   0,   n ) )
    LineXY( 0, 256+n, 799, 256+n, RGB(   n,   n, 255 ) )
  Next
  DrawingMode( #PB_2DDrawing_Outlined )
  Box( 24, 24, 64, 64, $0FF0FF )
StopDrawing()

Repeat
  Event = WaitWindowEvent()
  EvGad = EventGadget()
  EvTyp = EventType()

  Select Event
    Case #PB_Event_Gadget
      Select EvGad
        Case 0
          Select EvTyp
            Case #PB_EventType_LeftClick
              Debug "left on image"
          EndSelect
      EndSelect
    Case #PB_Event_CloseWindow
      EXIT = 1
  EndSelect
Until EXIT
der bemalte Fensterhintergrund dient nur dazu um zu zeigen, dass das ImageGadget wirklich nicht sichbar ist,
der rahmen ist aufgemalt und zeigt nur an, wo das leere ImageGadget ist.

das geht natürlich nur, wenn jeder clickbare Bereich rechteckig sein soll und man für jeden ein extra ImageGadget einrichtet,
und sich diese Imagegadgets nicht mit anderen Gadgets überschneiden.
Deaktivieren - wie man das für Hintergrundbilder macht - kann man sie natürlich nicht, weil sie den Click empfangen müssen.

einen Fensterclick generell abzufragen und anhand einer Zuordnungstabelle (die auch ein unsichtbares Image sein kann) zu interpretieren, ist flexibler.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Re: Clickable Area im Hintergrundbild des Hauptfensters ?

Beitrag von PureLust »

@Kaeru:
Kaeru Gaman hat geschrieben:... der bemalte Fensterhintergrund dient nur dazu um zu zeigen, dass das ImageGadget wirklich nicht sichbar ist, ...
Du weisst aber schon, dass Du durch das Zeichnen auf WindowsOutput() NACH dem Erstellen eines Gadgets JEGLICHES ImageGadget überschreibst - egal ob es zuvor sichtbar war oder nicht?
Falls Du Deine AlphaBlend-Versuche zum ImageGadget also auf diesem Wege gemacht hast kannst Du nicht davon ausgehen dass das erstellte ImageGadget auch tatsächlich transparent war - denn Du hast es ja in jedem Falle übermalt.

Meine Versuche mit einem selbst erstellten Image ein unsichtbares (oder durchsichtiges) ImageGadget zu erzeugen schlugen zumindest allesamt fehl - vielleicht aber auch deswegen weil mein selbst erstellte Image nicht durchsichtig war.
Ich meine mich dran erinnern zu können dass der AlphaChannel eines mit PB erstellten Images nach CreateImage() komplett auf undurchsichtig steht und es Probleme gab diesen zu ändern (da gab es glaube ich mal im englischen Forum einen Thread zu).
Somit könnte es also doch sein dass das AlphaBlending mit ImageGadgets() funnzt - mir nur die Erstellung eines undurchsichtigen Images nicht gelungen ist.

Aber der "Trick" mit ImageID=0 ein "durchsichtiges" ImageGadget zu erstellen ist nicht übel. Bild
Ich wäre nie auf die Idee gekommen das zu versuchen, da ich erwartet hätte in einem solchen Fall eine Fehlermeldung zu bekommen.

[Nachtrag:]

Ahh ... hab's gefunden:

Code: Alles auswählen

; Leeren des Alpha-Channels
    DrawingMode(#PB_2DDrawing_AlphaChannel)
    Box(0, 0, ImageWidth(0), ImageHeight(0), $00000000)
Kleines Bspl. für transparentes ImageGadget (für den, den interessiert):

Code: Alles auswählen

If CreateImage(0,100,50,32)
  If StartDrawing(ImageOutput(0))
    DrawingMode(#PB_2DDrawing_AlphaChannel)
    Box(0, 0, 100, 50, $00000000)
    DrawingMode(#PB_2DDrawing_AlphaBlend)
    LineXY(0,0,100,50,$ffff0000)
    LineXY(0,50,100,0,$ff0000ff)
    StopDrawing()
  EndIf
EndIf
If CreateImage(1,320,200,#PB_Image_DisplayFormat)
  If StartDrawing(ImageOutput(1))
    DrawingMode(#PB_2DDrawing_Gradient)
    LinearGradient(0,0,320,200)
    GradientColor(0.0,RGB(243, 16, 0))
    GradientColor(0.25,RGB(19, 16, 236))
    GradientColor(0.50,RGB(123, 169, 56))
    GradientColor(0.75,RGB(252, 250, 52))
    GradientColor(1.0,RGB(243, 16, 0))
    Box(0,0,320,200)
    StopDrawing()
  EndIf
EndIf

If OpenWindow(0,   0,   0, 320, 200, "Transparent ImageGadget", #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_Invisible)
  hbrBackground = CreatePatternBrush_(ImageID(1))
  SetClassLong_(WindowID(0),#GCL_HBRBACKGROUND,hbrBackground)
  ImageGadget(0,  20,  20,   0,   0, ImageID(0),#PB_Image_Border )
  ImageGadget(1, 180, 100,   0,   0, ImageID(0))
  HideWindow(0,0)
  Repeat
    Event = WaitWindowEvent()
    EvTyp = EventType()
    If EvTyp = #PB_EventType_LeftClick Or EvTyp = #PB_EventType_RightClick
      Debug "Click on image"
    EndIf
  Until Event = #PB_Event_CloseWindow
EndIf
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
six1
Beiträge: 31
Registriert: 10.11.2009 14:51
Kontaktdaten:

Re: Clickable Area im Hintergrundbild des Hauptfensters ?

Beitrag von six1 »

wie wäre es mit einem einfachen Label?
Gruß, Michael

There are 10 types of people, those that understand binary and those that don't!
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Clickable Area im Hintergrundbild des Hauptfensters ?

Beitrag von Kaeru Gaman »

six1 hat geschrieben:wie wäre es mit einem einfachen Label?
wie wäre es, wenn du PureBasic-Begriffe benutzt?
ein "Label" ist eine Sprungmarke im Code, das ist in diesem Fall Offtopic.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
six1
Beiträge: 31
Registriert: 10.11.2009 14:51
Kontaktdaten:

Re: Clickable Area im Hintergrundbild des Hauptfensters ?

Beitrag von six1 »

:D

entschuldige bitte. Ich werde mich zukünftig bemühen.
Ich programmiere schon so lange in Delphi, dass die Komponenten eben "Components" heißen.

Ich meinte ein Text-Gadget. Ich denke, dass es hier eine vergleichbare Funktion wie anderswo gibt, welche dieses Gadget durchsichtig schaltet.

btw:
Warum heißen die Components eigentlich Gadget? "Gadget" heißt sowas wie "...super toll mit bisher unbekannter Funktionalität..."

Wenn ich mal so vergleiche, welche Funktionalität "andere" Programmiersprachen mit graphischer Entwicklungsumgebung in den Object Inspektoren bieten...
Gut, nicht jeder in PB erstellt GUI Anwendungen... aber hier ist eine RAD Entwicklung praktisch, wegen fehlender Unterstützung des DevTool, nicht oder sehr schwerlich möglich.
Gruß, Michael

There are 10 types of people, those that understand binary and those that don't!
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Re: Clickable Area im Hintergrundbild des Hauptfensters ?

Beitrag von PureLust »

six1 hat geschrieben:Warum heißen die Components eigentlich Gadget?
Dies dürfte wohl noch aus der Entstehungsgeschichte von PureBasic auf dem guten alten Amiga her rühren:
Wikipadia hat geschrieben:Die Eingabefelder, Schaltflächen und Klickboxen in Intuition-Fenstern werden beim Amiga Gadgets (eingedeutscht „Symbole“) genannt.
LINK
(Funny ... scheinbar mag die Forensoftware keine URLs mit Umlauten. :roll: )
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Clickable Area im Hintergrundbild des Hauptfensters ?

Beitrag von Kaeru Gaman »

nein, sie mag das ä nicht, und auf jeden Fall keine Klammern.
das ist jetzt aber bestimmt das hundertste Mal...

escape die sonderzeichen...
http://de.wikipedia.org/wiki/Gadget_%28 ... %e4rung%29


six1 hat geschrieben:Wenn ich mal so vergleiche, welche Funktionalität "andere" Programmiersprachen mit graphischer Entwicklungsumgebung in den Object Inspektoren bieten...
bieten diese anderen Programmiersprachen sieben Compilerversionen in einem Paket?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten