Symbolleiste programmieren?

Anfängerfragen zum Programmieren mit PureBasic.
mx03
Beiträge: 47
Registriert: 29.09.2006 22:44

Symbolleiste programmieren?

Beitrag von mx03 »

Wie kann ich ein "Plugin" für die Symbolleiste schreiben mithilfe von Purebasic?
Beispiel (WMP, Encarta Suche):
Bild
4
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Sicro
Beiträge: 963
Registriert: 11.08.2005 19:08
Kontaktdaten:

Beitrag 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
Zuletzt geändert von Sicro am 18.08.2007 02:35, insgesamt 2-mal geändert.
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag 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
Zuletzt geändert von Fluid Byte am 18.08.2007 02:05, insgesamt 2-mal geändert.
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
Sicro
Beiträge: 963
Registriert: 11.08.2005 19:08
Kontaktdaten:

Beitrag 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
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

Was hast du geändert? Gleiches Problem:

Bild
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
Sicro
Beiträge: 963
Registriert: 11.08.2005 19:08
Kontaktdaten:

Beitrag 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
mx03
Beiträge: 47
Registriert: 29.09.2006 22:44

Beitrag 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?
4
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Das geht auch mit PB. Auf MSDN findest du auch ein? Beispiel.
Benutzeravatar
Sicro
Beiträge: 963
Registriert: 11.08.2005 19:08
Kontaktdaten:

Beitrag 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
Antworten