[WIN] Tray

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

Geeecko

Betreff: [WIN] Tray

BeitragMi, Jan 28, 2009 23:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Huhu!
Habe für mein derzeitiges Programm ein Tray-Manager gebraucht.
Das Programm kann 200 Fenster in den Tray setzen xD
Die Zahl kann auch verändert werden, aber ich denke 200 sollten reichen...

Code: [AUSKLAPPEN]

windowToTray(window:TGadget, tip:String = "", icon:String = "", func(window:TGadget, msg:Int) = Null)

Setzt ein fenster in den Tray. Fenster muss manuell versteckt werden.
window: Fenster was in den Tray versetzt werden soll
tip: Tooltip der angezeigt wird
icon: *.ico Datei für das Icon
func(window:TGadget,msg:int): Funktion die aufgerufen wird, wenn etwas mit dem Icon geschieht.
window ist das Fenster, und msg die Aktion.
Code: [AUSKLAPPEN]

msg |
------+
1 = Linke Maustaste

Füge später noch Aktionen hinzu.

Wird NULL angegeben, wird das Fenster automatisch wieder angezeigt und aus dem Tray geholt bei einem Linksklick auf das Icon.



Code: [AUSKLAPPEN]

windowFromTray(window:TGadget)

Holt ein Fenster aus dem Tray.
window: Fenster welcher heruasgeholt werden soll
Fenster muss manuell wieder angezeigt werden.


ACHTUNG: Ein Fenster darf NICHT öfter als 1mal in den Tray gesetzt werden!


Ihr braucht 2 Datein:

Code: [AUSKLAPPEN]

#include "windows.h"

void __windowToTray(HWND window,int ID,const char *tip[],LPCTSTR iconFile)
{
   NOTIFYICONDATA nid;
   nid.cbSize = sizeof(NOTIFYICONDATA);
   nid.hWnd = window;
   nid.uID = 0;
   nid.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;
   nid.uCallbackMessage = WM_USER+ID;
   nid.hIcon = LoadImage(NULL,iconFile,IMAGE_ICON,0,0,LR_LOADFROMFILE|LR_DEFAULTCOLOR);
   strcpy(nid.szTip,tip);
   Shell_NotifyIcon(NIM_ADD,&nid);
}

void __windowFromTray(HWND window,int ID,const char *tip[],LPCTSTR iconFile)
{
   NOTIFYICONDATA nid;
   nid.cbSize = sizeof(NOTIFYICONDATA);
   nid.hWnd = window;
   nid.uID = 0;
   Shell_NotifyIcon(NIM_DELETE,&nid);
}

tray.c - Hätte man auch direkt in BMax wrappen können, hatte aber keine Lust. Eine *.c Datei tuts auch.


Code: [AUSKLAPPEN]

Extern
   Function __windowToTray:Byte Ptr(hwnd:Int, id:Int, tip:Byte Ptr, iconFile:Byte Ptr)
   Function __windowFromTray(hwnd:Int, id:Int, tip:Byte Ptr, iconFile:Byte Ptr)
End Extern

Type TTrayManager
   Global ids:Int[] = New Int[200]
   Global trayList:TList = New TList
   
   Field window:TGadget
   Field tip:String
   Field icon:String
   Field func(window:TGadget, MSG:Int)
   Field id:Int

   Function windowToTray(window:TGadget, tip:String = "", icon:String = "", func(window:TGadget, msg:Int) = Null)
      Local newTray:TTrayManager = New TTrayManager
           newTray.window = window
           newTray.tip = tip
           newTray.icon = icon
           newTray.func = func
      SetWindowLongW(QueryGadget(window, QUERY_HWND), GWL_WNDPROC, Int Byte Ptr ___traysystem___Callback)
      Local id:Int = 0
      For Local i:Int = 0 To 199
         If(TTrayManager.ids[i] = 0) Then
            id = i
            Exit
         EndIf
      Next
      TTrayManager.ids[id] = 1
      newTray.id = id
      If(func) Then
         newTray.func = func
      Else
         newTray.func = __traysystem__defaultfunc
      EndIf
      __windowToTray(QueryGadget(window, QUERY_HWND), id, tip.ToCString(), icon.ToCString())
      TTrayManager.trayList.AddLast(newTray)
   End Function
   
   Function windowFromTray(window:Tgadget)
      For Local tray:TTrayManager = EachIn TTrayManager.trayList
         If(tray.window = window) Then
            __windowFromTray(QueryGadget(tray.window, QUERY_HWND), tray.id, tray.tip.ToCString(), tray.icon.ToCString())
            TTrayManager.ids[tray.id] = 0
            TTrayManager.trayList.Remove(tray)
         EndIf
      Next
   End Function
End Type

Function ___traysystem___Callback:Int(hwnd:Int, msg:Int, wparam:Int, lparam:Int) "win32"
   For Local tray:TTrayManager = EachIn TTrayManager.trayList
      If(MSG = 1024 + tray.id) Then
         If(lparam = 513) Then ' Linke Maustaste
            If(tray.func) Then tray.func(tray.window, 1)
         EndIf
      EndIf
   Next
   Return TWindowsGUIDriver.ClassWndProc(hwnd, MSG, wparam, lparam)
End Function

Function __traysystem__defaultfunc(window:TGadget, msg:Int)
   ShowGadget(window)
   TTrayManager.windowFromTray(window)
End Function

Function windowToTray(window:TGadget, tip:String = "", icon:String = "", func(window:TGadget, msg:Int) = Null)
   TTrayManager.windowToTray(window, tip, icon, func)
End Function

Function windowFromTray(window:TGadget)
   TTrayManager.WindowFromTray(window)
End Function

tray.bmx - Enthält die beiden Funktionen



Code: [AUSKLAPPEN]

SuperStrict


'----------------------------------- WICHTIG!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  ---------->
Import maxgui.drivers
Import "tray.c"
Include "tray.bmx"
'----------------------------------- WICHTIG!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  <----------


Global window:TGadget = CreateWindow("Window", 0, 0, 300, 300, Null, WINDOW_DEFAULT)
Global window2:TGadget = CreateWindow("Window2", 100, 100, 300, 300, Null, WINDOW_DEFAULT)


Repeat
   Select WaitEvent()
      Case EVENT_WINDOWCLOSE
      
         Select EventSource()
         
            Case window
               HideGadget(window)
               TTrayManager.windowToTray(window, "Window", "TestIcon.ico")
               
            Case window2
               HideGadget(window2)
               TTrayManager.windowToTray(window2, "Window 2~nlol", "TestIcon.ico")
      
         End Select
         
   End Select
Forever

Beispiel.bmx - Enthält ein Beispiel. (TestIcon.ico müsst ihr Testweise irgendwo runterladen, sonst wird ein leeres Feld im Tray angeziegt)



Code: [AUSKLAPPEN]

SuperStrict


'----------------------------------- WICHTIG!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  ---------->
Import maxgui.drivers
Import "tray.c"
Include "tray.bmx"
'----------------------------------- WICHTIG!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  <----------


Global window:TGadget = CreateWindow("Window", 0, 0, 300, 300, Null, WINDOW_DEFAULT)
Global window2:TGadget = CreateWindow("Window2", 100, 100, 300, 300, Null, WINDOW_DEFAULT)


Repeat
   Select WaitEvent()
      Case EVENT_WINDOWCLOSE
       
         Select EventSource()
         
            Case window
               HideGadget(window)
               TTrayManager.windowToTray(window, "Window", "TestIcon.ico", meineFunktion)
               
            Case window2
               HideGadget(window2)
               TTrayManager.windowToTray(window2, "Window 2~nlol", "TestIcon.ico", meineFunktion)
       
         End Select
         
   End Select
Forever

Function meineFunktion(window_:TGadget, msg:Int)
   Select window_
      Case window
         Confirm "Window!"
         ShowGadget(window)
         windowFromTray(window)
         
      Case window2
         Confirm "Window 2!"
         ShowGadget(window2)
         windowFromTray(window2)
   End Select
End Function

Noch ein Beispiel.



ACHTUNG:
Code: [AUSKLAPPEN]

Import maxgui.drivers
Import "tray.c"
Include "tray.bmx"

Muss immer in der "Haupt-Datei" stehen.

Ich hoffe es gefällt. Sollte alles Funktionieren. Aber garantiere für nichts Wink Wer Bugs entdeckt soll sie sagen xD
lg MD
[/code]

DAK

BeitragDo, Jan 29, 2009 6:14
Antworten mit Zitat
Benutzer-Profile anzeigen
^^sowas hab ich vorgestern den ganzen tag gesucht^^

habs mir dann per winapi selbst gebaut...

gute sache aber!

wär vll cool, wenn dus in ein modul umbauen könntest...
Gewinner der 6. und der 68. BlitzCodeCompo

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group