"Links" in Anwendung, wie im Windows Explorer

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

danielos

Betreff: "Links" in Anwendung, wie im Windows Explorer

BeitragMo, Sep 29, 2008 16:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Moin!

Wenn man unter Windows einen Ornder öffnet, sieht man an der linken Seite standardmäßig Verlinkungen, wie z.B unter "Andere Orte:" "Eigene Dateien", "Arbeitsplatz", usw....
Da ich das Prinzip ganz hübsch finde, wäre meine Frage, wie sich das in einer Anwendung am besten realisieren ließe... Ich will damit Routinen innerhalb meines Progs aufrufen, sozusagen als Button-Ersatz...
Hat jemand vorschläge, wie man das lösen könnte (Panels ? Canvas ? ...)
MfG
Daniel Smile
 

jsp

BeitragMo, Sep 29, 2008 17:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Eigentlich sind da der Kreativitaet kaum Grenzen gesetzt...

Ein Panel wuerde ich einem Canvas aber immer vorziehen, weil es vom System verwaltet wird, es sei denn du musst darin zeichnen, dann ist ein Canvas natuerlich einfacher.

Code: [AUSKLAPPEN]
CreatePanel:TGadget(10,10,80,80,Window:TGadget,PANEL_ACTIVE,"PlainPanel1")
Nur dran denken das man das Panel auf ACTIVE schaltet um die Events zu bekommen.

Ab MaxGuiEx kann man aber auch Pixmaps auf Buttons setzen und den Text abschalten, fuer einfache Sachen reicht das vielleicht schon aus.
Code: [AUSKLAPPEN]
   Local Button1:TGadget = CreateButton:TGadget("Button1",26,23,75,23,Window1:TGadget,BUTTON_PUSH)
      Local Pixmap_Button1:TPixmap = LoadPixmapPNG:TPixmap ( "MyPixmap.png" )
      SetGadgetPixmap( Button1:TGadget , Pixmap_Button1:TPixmap ,GADGETPIXMAP_ICON|GADGETPIXMAP_NOTEXT )


Ich habe fuer meinen Gui Editor mal ein Image Button modul geschrieben, das z.B. nur mit Panels arbeitet. Eine Demo kann man sich hier mal ansehen:
http://jsp.logiczone.de/downlo...emo1.2.zip

mfg
-jsp-
Logic Gui Professional a Gui Designer for MaxGui

kog

BeitragMo, Sep 29, 2008 17:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Mit der neuen Version von MaxGUI, sollte ein Modul mitgeliefert werden, namens: ProxyGadgets oder sowas.
Schau im Ordner MaxGUI.mod.
Aber ist glaube ich momentan nur für Windows verfügbar.
Vielleicht hilft dir das weiter...

FOODy

BeitragMo, Sep 29, 2008 17:48
Antworten mit Zitat
Benutzer-Profile anzeigen
@kog:
MaxGUI.ProxyGadgets nutzt nur die Standardgadgets, was es Plattformunabhängig macht.

@danielos:
Wie kog bereits gesagt hat, könntest du das Hyperlink Gadget vom MaxGUI.ProxyGadgets Module benutzen.
( CreateHyperlink( url$,x,y,w,h,group:TGadget,style=0,customtext$ = "" ) )


Grüße,
FOODy
BlitzMax + MaxGUI, 64-bit Arch Linux: Intel Core² E8500 | 8 GB Ram | GeForce GTX 460 · 1024 MB
 

danielos

BeitragMo, Sep 29, 2008 19:47
Antworten mit Zitat
Benutzer-Profile anzeigen
besten dank für die ganzen antworten, tolles forum hier Smile
werd mich mal drauf stürzen....

MfG
Danielos
 

danielos

BeitragMo, Sep 29, 2008 19:53
Antworten mit Zitat
Benutzer-Profile anzeigen
also, proxygadgets ist vom prinzip her genau das richtige, aber wie krieg ich es hin, dass keine webseite aufgerufen wird ?
wenn man für url$ = "" eingibt, öffnet sich der AppOrdner, in dem das programm ausgeführt wird... kann man iwie ein event beim klick auf den link erzeugen und das dann abgreifen ?

d-bug

BeitragMo, Sep 29, 2008 20:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Schau die mal das Proxygadget an! Die Aufrufe werden über einen EventHook verwaltet! Ich schlage vor, du machst dir ein neues Hyperlinkgadget und ersetzt den OpenUrl Aufruf durch den Aufruf einer Callback Function oder so! Das ist alles aber schon etwas fortgeschrittener. Wink Ach warte mal, ich friemel mal was zusammen!


So, getan... Aber bitte auch versuchen zu verstehen!

Code: [AUSKLAPPEN]
Strict

Import maxgui.drivers


Function MyFunction ()
   Print "Hallo, ich bin der Callback und du hast mich aktiviert"
End Function


Local Window:TGadget = CreateWindow ("Hyperlink-Callback-Test",100,100,200,200,Desktop())
Local HyperTest:TGadget = CreateMyHyperLink ("www.blitzforum.de",10,10,200,20,Window,0,"BlitzBasicPortal-Callback", MyFunction)
Local HyperTest2:TGadget = CreateMyHyperLink ("www.blitzforum.de",10,30,200,20,Window,0,"BlitzBasicPortal-RealLink",Null)

Repeat
   Select WaitEvent ()
      Case EVENT_WINDOWCLOSE
         End
   End Select
Forever
End


Rem
bbdoc: Creates a basic hyperlink gadget that opens the specified @url$ in the default browser when clicked.
about: The underlying gadget is a label, and so the @style parameter can take all the #CreateLabel flags apart from LABEL_SEPARATOR.

The normal and roll-over text color can be set individually using #SetGadgetTextColor and #SetGadgetColor respectively.

The optional @customtext$ parameter allows you to set user-friendly text that masks the URL in the label. If this is specified in #CreateHyperlink
then the label's tooltip is automatically set to the URL the link refers to. This masking text can be changed at any time by calling #SetGadgetText.
Finally, the @url$ that the hyperlink gadget opens can be modified/retrieved using #SetGadgetExtra and String( #GadgetExtra )
respectively (see code example).
End Rem
Function CreateMyHyperlink:TGadget( url$,x,y,w,h,group:TGadget,style=0,customtext$ = "", CallBack () = Null)
   Local Gadget:TMyHyperlinkGadget = New TMyHyperlinkGadget.Create(url,x,y,w,h,group,style,customtext)
   Gadget.CallBack = CallBack
   Return Gadget
EndFunction

Type TMyHyperlinkGadget Extends TProxyGadget
   
   Global lstHyperlinkGadgets:TList
   
   Global fntDefault:TGuiFont, fntHoverDefault:TGuiFont
   
   Field hyperlinkstyle%
   Field colors[][] = [[0,0,255],[255,0,0]]
   
   Field lastclick[] = [-1, -1]
   Field Callback()
   
   
   Method New()
      If Not lstHyperlinkGadgets Then Initialize()
   EndMethod
   
   Method Create:TMyHyperlinkGadget(pUrl$,x,y,w,h,group:TGadget,style,customtext$)
      
      If Not customtext Then customtext = pUrl$
      If (style&LABEL_SEPARATOR) = LABEL_SEPARATOR Then style:&~LABEL_SEPARATOR
      
      Local tmpLabel:TGadget = CreateLabel( customtext, x, y, w, h, group, style&31 )
      If Not tmpLabel Then Return Null Else SetGadgetSensitivity(tmpLabel, SENSITIZE_MOUSE)
      
      SetGadgetFont(tmpLabel,fntDefault)   
      
      If customtext <> pUrl Then SetGadgetToolTip( tmpLabel, pUrl )
      
      SetProxy( tmpLabel );Super.SetTextColor(colors[0][0], colors[0][1], colors[0][2])
      
      hyperlinkstyle = style;extra = pUrl
      lstHyperlinkGadgets.AddLast Self
      
      
      Self.Callback = Callback
      
      Return Self
      
   EndMethod
   
   Method EventHook:TEvent( pEvent:TEvent )
      
      Select pEvent.id
      
         Case EVENT_MOUSEENTER
            Super.SetTextColor(colors[1][0], colors[1][1], colors[1][2]);SetPointer(POINTER_HAND)
            Super.SetFont( fntHoverDefault )
         Case EVENT_MOUSELEAVE
            Super.SetTextColor(colors[0][0], colors[0][1], colors[0][2]);SetPointer(POINTER_DEFAULT)
            Super.SetFont( fntDefault )
            
         Case EVENT_MOUSEDOWN
            If lastclick[0] <> pEvent.x Or lastclick[1] <> pEvent.y
               lastclick = [pEvent.x,pEvent.y]

               '-----------------------------------------------------
               ' Callback aufrufen wenn vorhanden sonst Hyperlink
               '-----------------------------------------------------
               If Self.Callback
                  Self.Callback ()
               Else
                  OpenURL(String(extra))
               EndIf
            EndIf
      EndSelect
      
      Return Null
   
   EndMethod
   
   Method SetFont( font:TGuiFont )
      fntDefault = font;fntHoverDefault = font
      Super.SetFont(font)
   EndMethod
   
   Method SetColor(r,g,b)
      colors[1][0] = r;colors[1][1] = g;colors[1][2] = b
   EndMethod
   
   Method SetTextColor(r,g,b)
      colors[0][0] = r;colors[0][1] = g;colors[0][2] = b
      Super.SetTextColor(colors[0][0], colors[0][1], colors[0][2])
   EndMethod
   
   Method Free()
      lstHyperlinkGadgets.Remove(Self)
      Super.Free()
   EndMethod
   
   Function Initialize()
      lstHyperlinkGadgets = New TList
      AddHook EmitEventHook, eventHandler, Null, 1
      fntDefault = LookupGuiFont( GUIFONT_SYSTEM, 0, 0 )
      fntHoverDefault = LookupGuiFont( GUIFONT_SYSTEM, 0, FONT_UNDERLINE )
   EndFunction
   
   Function eventHandler:Object( pID%, pData:Object, pContext:Object )
      Local pEvent:TEvent = TEvent(pData)
      
      If pEvent Then
         For Local tmpHyperlinkGadget:TMyHyperlinkGadget = EachIn lstHyperlinkGadgets
            If tmpHyperlinkGadget.proxy = pEvent.source Then Return tmpHyperlinkGadget.EventHook( pEvent )
         Next
      EndIf
      
      Return pData
   EndFunction
   
EndType
  • Zuletzt bearbeitet von d-bug am Di, Sep 30, 2008 7:05, insgesamt einmal bearbeitet
 

danielos

BeitragMo, Sep 29, 2008 20:37
Antworten mit Zitat
Benutzer-Profile anzeigen
vielen dank d-bug, und ich versuche prinzipiell alles zu verstehen,
allerdings spuckt der compiller ne fehlermeldung aus:
Zeile: hyperlinkstyle = style;extra = pUrl
Fehler: identifier "extra" not found
Question

d-bug

BeitragMo, Sep 29, 2008 20:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Sollte aber nicht, denn das "extra" Object ist ein fester Bestandteil der TGadget Klasse, aus der wiederum TProxyGadget abgeleitet wurde!

Da ich aber nun kein Windows besitze kann ich da jetzt nicht bei gucken! Bei mir (OS-X) lief es so, wie ich es im letzten Post hier rein setzte!

Sorry, hier muss ich mich wieder ausklinken!
 

jsp

BeitragMo, Sep 29, 2008 21:46
Antworten mit Zitat
Benutzer-Profile anzeigen
D-bug's code funktioniert bei mir -> Win XP!

Wenn dir ein einfacher label als link reicht probier mal folgendes:

Code: [AUSKLAPPEN]

SuperStrict

Import maxgui.drivers

Local Window1:TGadget = CreateWindow:TGadget("Window1",269,130,319,148,Null,WINDOW_TITLEBAR|WINDOW_RESIZABLE |WINDOW_STATUS |WINDOW_CLIENTCOORDS )
   Local Label1:TGadget = CreateLabel:TGadget("Oeffne Arbeitsplatz",22,30,106,17,Window1:TGadget,Null)
      SetGadgetSensitivity( Label1:TGadget,SENSITIZE_MOUSE )

Repeat
   WaitEvent()
   Select EventID()
      Case EVENT_WINDOWCLOSE
         Select EventSource()
            Case Window1   Window1_WC( Window1:TGadget )
         End Select

      Case EVENT_MOUSEDOWN
         Select EventSource()
            Case Label1   Label1_MD( Label1:TGadget , EventData() , Window1:TGadget )
         End Select

   End Select
Forever

Function Window1_WC( Window:TGadget )
   DebugLog "Window Window1 wants to be closed"

   End
End Function

Function Label1_MD( Label:TGadget , MouseButton:Int , Window:TGadget=Null , expanded:Int=True)
   DebugLog "Label Label1 detected Mouse Button "+ MouseButton +" pressed down"
   'hier dein code einsetzen
   
   'z.b. einen explorer oeffnen
   Local str:String
   If expanded Then str="/e,"
   system_("explorer.exe "+str+"::{20D04FE0-3AEA-1069-A2D8-08002B30309D}") 'Arbeitsplatz oeffnen
   
End Function


Ist vielleicht etwas einfacher am Anfang als ein Proxy Gadget.

-jsp-
Logic Gui Professional a Gui Designer for MaxGui

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group