Seite 1 von 2

Symbolleiste programmieren?

Verfasst: 18.08.2007 00:09
von mx03
Wie kann ich ein "Plugin" für die Symbolleiste schreiben mithilfe von Purebasic?
Beispiel (WMP, Encarta Suche):
Bild

Verfasst: 18.08.2007 00:16
von Kaeru Gaman
alles, was über ein einfaches systray-icon hinausgeht, ist weit entfernt von einer "anfängerfrage".

das nur als hinweis.

diese aufgabenstellung ist sogar für profis herausfordernd.

also, wenn du das unterforum "Anfänger" ernst gemeint hast,
probier erstmal eine anwendung mit symbol im systray,
die auf rechtsklick ein normales menu aufpoppt.
das ist für anfänger absolut herausfordernd genug.

das ist keine PB-spezifische antwort, bei so "hard-stuff" ist es egal,
ob du PB, VB oder C++ proggst.

PS:
ich weiß nicht, wie es geht. das ist absolut ne spezialistenfrage.

Verfasst: 18.08.2007 01:13
von Sicro

Code: Alles auswählen

Define Shell_Tray.l, ReBar.l, WinRect.RECT, WindowWidth, Event.l

#WindowWidth = 50

Shell_Tray = FindWindow_(@"Shell_TrayWnd",0)
ReBar = FindWindowEx_(Shell_Tray,0,@"ReBarWindow32",0)

If Shell_Tray And ReBar
  GetWindowRect_(ReBar,@WinRect)
  WindowWidth = WinRect\right - WinRect\left
  
  If OpenWindow(0,WindowWidth - #WindowWidth,1,#WindowWidth,24,"",#PB_Window_BorderLess)
    If CreateGadgetList(WindowID(0))
      StringGadget(0,1,1,50,50,"")
    
      SetParent_(WindowID(0),ReBar)
  
      Repeat
        Event = WaitWindowEvent(100)
        
        GetWindowRect_(ReBar,@WinRect)
        WindowWidth = WinRect\right - WinRect\left
        ResizeWindow(0,WindowWidth - #WindowWidth,1,#PB_Ignore,#PB_Ignore)
      Until Event = #PB_Event_CloseWindow
    EndIf
  EndIf
EndIf
Bei Unverständlichkeiten fragen :)

Edit 1: unnötige FindWindow entfernt
Edit 2: Fenster wird bei Änderungen im TrayNotify entsprechend neu positioniert

Mfg DerProgger

Verfasst: 18.08.2007 01:32
von Fluid Byte
Einfach das parent handle zu ändern ist leider nicht die Lösung. Das Fenster setzt sich auf bestehende Tabs in der Taskbar und lässt mich diese nicht mehr anklicken. Es muss nativ integriert werden was bedeuted das du ein bestimmten Bereich auf der Taskbar für deine Anwendung reservieren musst. Du musst also auf alle Grössenveränderungen insklusive Systray reagieren sonst sieht das Ganze schnell vermurkst aus. So was geht nur mit Hook und übersteigt glaube ich deine und mx03's Fähigkeiten ein wenig.

Dieser Code könnte ganz interessant sein wobei es auch hier anscheindend noch Probleme gibt:

http://www.purebasic.fr/german/viewtopic.php?t=13952

Verfasst: 18.08.2007 01:51
von Sicro
Ich habe den Code etwas überarbeitet. Die Tabs werden nun - zumindest bei mir - nicht mehr überdeckt.

Edit: Ok, jetzt hapert es, wenn man Tray-Icons hinzufügt. Ich werde mir später mal deinen Link anschauen und mich nochmal damit beschäftigen.

Mfg DerProgger

Verfasst: 18.08.2007 02:09
von Fluid Byte
Was hast du geändert? Gleiches Problem:

Bild

Verfasst: 19.08.2007 00:24
von Sicro
Fluid Byte hat geschrieben:Gleiches Problem:
Hm... mit meinem Design-Theme schien es heute früh so als würde es funktionieren. War ich wohl zu müde... /:-> :lol:

Ich habe jetzt nochmal recherchiert, wie man so eine Symbolleiste normalerweise erstellt, und herausgefunden, das diese mit ActiveX und dem "Desk Band"-Interface erstellt wird. Da ich unter PB noch nichts mit ActiveX gemacht habe, habe ich meinen bisherigen Code nochmal neu geschrieben. Dieser funktioniert bei mir jetzt fehlerfrei, solange kein(e) Symbolleiste oder Tray-Icon hinzugefügt oder entfernt wird. Das werde ich später vielleicht noch erweitern, damit es auch in diesen Fällen richtig funktioniert.

Hier der neue Code:

Code: Alles auswählen

Define Shell_Tray.l, ReBar.l, TrayNotify.l, WinRect.RECT, Event.l
Define ReBarWidth.l, ReBarHeight.l, TrayNotifyX.l, NewReBarWidth.l

#WindowWidth = 50
#WindowHeigth = 24

Shell_Tray = FindWindow_(@"Shell_TrayWnd",0)
ReBar = FindWindowEx_(Shell_Tray,0,@"ReBarWindow32",0)
TrayNotify = FindWindowEx_(Shell_Tray,0,@"TrayNotifyWnd",0)

If Shell_Tray And ReBar And TrayNotify
  GetWindowRect_(ReBar,@WinRect)
  ReBarWidth = WinRect\right - WinRect\left
  ReBarHeight = WinRect\bottom - WinRect\top

  GetWindowRect_(TrayNotify,@WinRect)
  TrayNotifyX = WinRect\left

  ReBarWidth - #WindowWidth - 5
  SetWindowPos_(ReBar,0,0,0,ReBarWidth,ReBarHeight,#SWP_NOMOVE | #SWP_NOZORDER)

  If OpenWindow(0,TrayNotifyX - #WindowWidth,1,#WindowWidth,#WindowHeigth,"",#PB_Window_BorderLess)
    If CreateGadgetList(WindowID(0))
      ButtonGadget(0,1,1,#WindowWidth,#WindowHeigth,"test")
      
      SetParent_(WindowID(0),Shell_Tray)
      
      Repeat
        Event = WaitWindowEvent(10)
        
        GetWindowRect_(ReBar,@WinRect)
        NewReBarWidth = WinRect\right - WinRect\left
        ReBarHeight = WinRect\bottom - WinRect\top
        
        If NewReBarWidth <> ReBarWidth
          GetWindowRect_(TrayNotify,@WinRect)
          TrayNotifyX = WinRect\left
        
          ReBarWidth = NewReBarWidth
          ReBarWidth - #WindowWidth - 5
          SetWindowPos_(ReBar,0,0,0,ReBarWidth,ReBarHeight,#SWP_NOMOVE | #SWP_NOZORDER)
          
          ResizeWindow(0,TrayNotifyX - #WindowWidth,1,#PB_Ignore,#PB_Ignore)
        EndIf
      Until Event = #PB_Event_CloseWindow Or Event = #PB_Event_Gadget
      
      SetWindowPos_(ReBar,0,0,0,ReBarWidth + #WindowWidth + 5,ReBarHeight,#SWP_NOMOVE | #SWP_NOZORDER)
    EndIf
  EndIf
EndIf
Edit:
Das Fenster wird nun neu positioniert, wenn Symbolleisten oder Tray-Icons hinzugefügt oder entfernt werden oder wenn die Höhe der Taskleiste geändert wird.
Natürlich könnte man auch einen Hook an die ReBar hängen, aber so müsste es auch schon genügen.

Funktioniert es bei euch auch?

Mfg DerProgger

Verfasst: 19.08.2007 19:07
von mx03
Das Fenster wird nun neu positioniert, wenn Symbolleisten oder Tray-Icons hinzugefügt oder entfernt werden oder wenn die Höhe der Taskleiste geändert wird.
Natürlich könnte man auch einen Hook an die ReBar hängen, aber so müsste es auch schon genügen
mhmm bei mir bleib das Fenster immer an der gleichen Stelle egal wieviele Icons ich hinzufüge.

Wie kann ich nun eine Symbolleiste mit ActiveX und Deskband erstellen?
Gibts da irgenteine vorteilhafte Sprache zum programmieren von einer solchen Leiste?

Verfasst: 19.08.2007 23:04
von edel
Das geht auch mit PB. Auf MSDN findest du auch ein? Beispiel.

Verfasst: 19.08.2007 23:49
von Sicro
Hier ist die entsprechende Anleitung bei MSDN: Klick
Mit Google und dem Suchbegriff "desk band" findest du Beispiel-Codes für Delphi, C++ usw.
Ich habe leider zu wenig Zeit mich damit ausführlich zu beschäftigen...
mx03 hat geschrieben:mhmm bei mir bleib das Fenster immer an der gleichen Stelle egal wieviele Icons ich hinzufüge.
Setzt sich das Fenster aber nach dem Start vor den Infobereich?
Werden die Tabs überdeckt?
Welches Windows?

Mfg DerProgger