Seite 1 von 2

Clickable Area im Hintergrundbild des Hauptfensters ?

Verfasst: 23.11.2009 15:00
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

Re: Clickable Area im Hintergrundbild des Hauptfensters ?

Verfasst: 23.11.2009 15:39
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.

Re: Clickable Area im Hintergrundbild des Hauptfensters ?

Verfasst: 24.11.2009 04:54
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. /:->

Re: Clickable Area im Hintergrundbild des Hauptfensters ?

Verfasst: 24.11.2009 05:15
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.

Re: Clickable Area im Hintergrundbild des Hauptfensters ?

Verfasst: 24.11.2009 06:36
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

Re: Clickable Area im Hintergrundbild des Hauptfensters ?

Verfasst: 24.11.2009 08:55
von six1
wie wäre es mit einem einfachen Label?

Re: Clickable Area im Hintergrundbild des Hauptfensters ?

Verfasst: 24.11.2009 13:09
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.

Re: Clickable Area im Hintergrundbild des Hauptfensters ?

Verfasst: 24.11.2009 16:15
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.

Re: Clickable Area im Hintergrundbild des Hauptfensters ?

Verfasst: 24.11.2009 17:40
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: )

Re: Clickable Area im Hintergrundbild des Hauptfensters ?

Verfasst: 24.11.2009 18:24
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?