Page 1 sur 1

[Résolu] systray : icone de l'appli par defaut

Publié : sam. 08/mai/2004 16:53
par Dionyzos
Bonjour,

Je voudrais savoir s'il est possible d'utiliser l'icone de l'application elle même par defaut plutot que de charger un ficheir image tiers dans le systray?

Pour n'avoir qu'un seul executable au final.

Ou peut-etre est-il possible d'integrer un fichier image dans l'exe comme pour une ressource.

Je sais pô comment faire dans les deux cas :(

Help please :cry:

Dionyzos

Publié : sam. 08/mai/2004 17:01
par Chris
Pour ta première question, oui, normalement, tu peux utiliser l'icône du programme dans le systray. (C'est d'ailleurs ce que je fais à chaque fois)

Chris :)

Publié : sam. 08/mai/2004 17:03
par Dionyzos
heu...merci de ta réponse rapide, mais comment fait-on ? :)

Publié : sam. 08/mai/2004 17:06
par Chris
Tu vas trop vite, j'étais parti récupérer un bout de code :lol:

Code : Tout sélectionner

;- Constantes fenêtres
Enumeration
  #Win_Main
EndEnumeration

;-Constantes diverses
Enumeration
  #SysIcon
  #Sytray
  #PopUp
EndEnumeration

;- Variables globales
Global ScreenWidth, ScreenHeight, CurPos.POINT

;- Récupération des paramètres de l'écran
; Cette partie récupère les coordonnées de la zone de travail de l'écran, 
; c'est à dire la largeur, et la hauteur sans la barre de tâches
;
SystemParametersInfo_(#SPI_GETWORKAREA,0,rect.RECT,0)
ScreenWidth = rect\right        ; Largeur de l'écran
ScreenHeight = rect\bottom      ; Hauteur de l'écran (Zone de travail)

;- Procedures 

;- Ouverture de la fenêtre Principale
Procedure Open_Win_Main(ScrWidth.l, ScrHeight.l, WinWidth, WinHeight)
  WinRect.RECT
  
  If OpenWindow(#Win_Main, ScrWidth - WinWidth, ScrHeight-WinHeight, WinWidth, WinHeight,  #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_Invisible , "SysTray-Test")
    hwnd = WindowID(#Win_Main)
    
    ; Après avoir ouvert la fenêtre, on récupère ses dimensions réelles, c'est à dire
    ; celles qui incluent la barre de titre et les bordures 
    GetWindowRect_(hwnd, @WinRect)
    W_Width = WinRect\right - WinRect\left    ; Calcul de la largeur
    W_Height = WinRect\bottom - WinRect\top   ; Calcul de la hauteur
    
    ; On déplace ensuite la fenêtre pour qu'elle colle au coin bas/droite de l'écran
    MoveWindow_(hwnd,ScrWidth-W_Width,ScrHeight-W_Height,W_Width,W_Height,#True)
    
    ProcedureReturn hwnd
  EndIf
EndProcedure

;/ Fermeture/Ouverture de la fenêtre des options
Procedure Minimize(Flag.b)
  If Flag = 1
    DisableMenuItem(1,1)          ; Désactive le menu 1
    DisableMenuItem(2,0)          ; Active le menu 2
    HideWindow(#Win_Main, 1)      ; Réduit la fenêtre
  Else
    DisableMenuItem(1,0)          ; Active le menu 1
    DisableMenuItem(2,1)          ; Désactive le menu 2
    HideWindow(#Win_Main, 0)      ; Affiche la fenêtre
  EndIf
EndProcedure

;- Ouverture de la fenêtre, et création des menus et du SysTray
hwnd = Open_Win_Main(ScreenWidth, ScreenHeight, 200, 150)   ; Ouvre la fenêtre
hIconSysTray = LoadImage(#SysIcon,"ClearScreen.ico")        ; Charge l'icône
AddSysTrayIcon(#Sytray,hwnd,hIconSysTray)                   ; Ajoute l'icône dans le SysTray
CreatePopupMenu(#PopUp)                                     ; Crée un menu Pop-Up
MenuItem(1,"Mettre en icône...")                            ; Ajout des menus
MenuItem(2,"Afficher...")
MenuBar()
MenuItem(3,"Quitter")

; Comme la fenêtre sera invisible à l'ouverture, le menu servant
; à la minimiser sera inactif, tandis que celui servant à l'agrandir
; sera actif
; 
DisableMenuItem(1,1)                         ; Menu inactif à l'ouverture
DisableMenuItem(2,0)                         ; Menu actif à l'ouverture
  
;- Début de la boucle
Repeat
  
  Select WaitWindowEvent()
    Case #PB_Event_SysTray
      Select EventType()
        Case #PB_EventType_RightClick         ; Un click droit fait apparaître le menu          
          DisplayPopupMenu(#PopUp, hwnd)
      EndSelect
      
    Case #PB_EventMenu
      Select EventMenuID()
        
        Case 1 : Minimize(1)                 
        Case 2 : Minimize(0)                  
          
        Case 3 : quit = 1                     
      EndSelect
      
    Case #PB_EventGadget
      Select EventGadgetID()
      EndSelect
    Case #PB_EventCloseWindow : Minimize(1)   
  EndSelect
Until quit = 1
End
Pour le fichier .ico, tu en trouveras certainement un sur ton PC

PS: j'ai pas eu le temps de retirer les bouts de code inutiles :)
Chris :)

Publié : sam. 08/mai/2004 17:14
par Flype
c'est pas bon ta réponse chris

la question etait de recuperer l'icone inclus dans l'exe
pour ensuite, sans avoir à le charger depuis le disque,
l'utiliser pour le systray

ya qq chose dans codearchive je crois je regarde...

Publié : sam. 08/mai/2004 17:18
par Dionyzos
Merci Chris, mais en effet ton code ne repond pas à mon attente.
et désolé d'être aussi impatient ;-)

Merci aussi à toi Flype, je vais aussi regarder dans les codes archives...

Publié : sam. 08/mai/2004 17:22
par Chris
Voui!!! :oops:

J'ai zappé un bout du message :cry:

Tant pis, ça servira à d'autres :lol:

Chris :)

Publié : sam. 08/mai/2004 17:36
par Chris
J'ai trouvé un truc, tu mets ce code à la fin de ton fichier source

Code : Tout sélectionner

Icon: 
IncludeBinary "TonFichier.ico" 
IconEnd:
Et celui là au début:

Code : Tout sélectionner

If CreateFile(0, "TonFichier.ico") 
  WriteData(?Icon, ?IconEnd-?Icon)
  CloseFile(0) 
EndIf
Tu n'auras qu'un exe, et l'icone sera extraite au premier lancement.

J'ai pas trouvé autre chose! :(


Chris :)

Publié : sam. 08/mai/2004 17:57
par Le Soldat Inconnu
j'ai plus simple pour récupérer l'icone de l'exe

ce code montre comment récupèrer l'icone de l'exe, tu le trouvras sur Codes-Fr, voir ma signature, dans la rubrique "exécutables"

Publié : sam. 08/mai/2004 17:58
par Flype
ben voilà la réponse gràce au code du Soldat Inconnu dans CodeFR
et legerement adapté pour l'occasion :

Code : Tout sélectionner

Procedure.l CatchExeIcon( Flags.l) 
  ExeName.s = Space(255) 
  GetModuleFileName_(0, @ExeName, 255)
  SHGetFileInfo_(ExeName, 0, @InfosFile.SHFILEINFO, SizeOf(SHFILEINFO), #SHGFI_ICON | Flags)
  ProcedureReturn InfosFile\hIcon 
EndProcedure 

Procedure.l CatchExeBigIcon()
  ProcedureReturn CatchExeIcon(#SHGFI_LARGEICON)
EndProcedure

Procedure.l CatchExeSmallIcon()
  ProcedureReturn CatchExeIcon(#SHGFI_SMALLICON)
EndProcedure

OpenWindow(0, 0, 0, 200, 100, #PB_Window_SystemMenu | #PB_Window_ScreenCentered, "Icone de l'exe") 
CreateGadgetList(WindowID()) 

AddSysTrayIcon(0, WindowID(), CatchExeSmallIcon()) 
ButtonImageGadget(0, 5, 5, 90, 90, CatchExeSmallIcon()) 
ButtonImageGadget(1, 105, 5, 90, 90, CatchExeBigIcon()) 
    
Repeat : Until WaitWindowEvent() = #WM_Close

Publié : sam. 08/mai/2004 18:08
par Chris
Ca marche pas avec la 3.91

Chris :)

Publié : sam. 08/mai/2004 18:09
par Dionyzos
Merci beaucoup les gars, ca marche nikel !!! :D :lol:

Publié : mer. 12/mai/2004 13:14
par Dionyzos
J'ai trouvé une autre solution (de Denis) qui marche aussi bien, et qui reprend l'idée de Chris, en utilisant le CatchImage et IncludeBinary :

Là où je veux charger l'icone dans le systray:

Code : Tout sélectionner

AddSysTrayIcon(#SYSTRAY, WindowID(#WIN), CatchImage(#ICON, ?MonIcone))
Et à la fin du fichier je place le bout de code suivant :

Code : Tout sélectionner

DataSection
MonIcone: IncludeBinary "icone.ico"
EndDataSection
Lorsque je compile et créer l'EXE, le fichier icone est inclus dans l'EXE.
Je me retrouve avec un fichier un peu plus gros, mais je n'ai aucun autre fichier à part mon exe 8)

Et voilà 2 solutions pour le prix d'une :D

Publié : mer. 12/mai/2004 15:14
par Flype
la solution que tu propose est bien connue...
c comme çà qu'on fait quand on sait pas recuperer l'icone de l'exe :wink:

Publié : sam. 15/mai/2004 10:25
par Chris
Même si le problème est résolu, voilà une autre solution.
Le code peut paraître un peu long, mais il n'y a que la procedure GetIcone qui assure l'extraction de l'icone ,(4 lignes).
Le reste ne sert que pour la fenêtre et les menus :wink:

Code : Tout sélectionner

;- Constantes fenêtres
Enumeration
  #Win_Main
EndEnumeration

;-Constantes diverses
Enumeration
  #SysIcon
  #Sytray
  #PopUp
EndEnumeration

;- *********** Extraction de l'icône **************
Procedure GetIcone(WinHandle)
  hInstance = GetWindowLong_(WinHandle,#GWL_HINSTANCE)
  app.s = Space(255)
  GetModuleFileName_(0,@app,255)
  ProcedureReturn ExtractIcon_(hInstance, app, 0)
EndProcedure
;- ************************************************

Procedure Minimize(Flag.b)
  If Flag = 1
    DisableMenuItem(1,1)          ; Désactive le menu 1
    DisableMenuItem(2,0)          ; Active le menu 2
    HideWindow(#Win_Main, 1)      ; Réduit la fenêtre
  Else
    DisableMenuItem(1,0)          ; Active le menu 1
    DisableMenuItem(2,1)          ; Désactive le menu 2
    HideWindow(#Win_Main, 0)      ; Affiche la fenêtre
  EndIf
EndProcedure

;- Ouverture de la fenêtre, et création des menus et du SysTray

hwnd = OpenWindow(#Win_Main, 300, 300, 100, 100,  #PB_Window_SystemMenu | #PB_Window_Invisible , "SysTray-Test")

;- ******* Récupération de l'icone, et affichage ******
hIconSysTray = GetIcone(hwnd)
AddSysTrayIcon(#Sytray,hwnd,hIconSysTray)                   ; Ajoute l'icône dans le SysTray
;- ****************************************************

CreatePopupMenu(#PopUp)                                     ; Crée un menu Pop-Up
MenuItem(1,"Mettre en icône...")                            ; Ajout des menus
MenuItem(2,"Afficher...")
MenuBar()
MenuItem(3,"Quitter")

DisableMenuItem(1,1)                         ; Menu inactif à l'ouverture
DisableMenuItem(2,0)                         ; Menu actif à l'ouverture
 
;- Début de la boucle
Repeat
  
  Select WaitWindowEvent()
    Case #PB_Event_SysTray
      Select EventType()
        Case #PB_EventType_RightClick         ; Un click droit fait apparaître le menu          
          DisplayPopupMenu(#PopUp, hwnd)
      EndSelect
      
    Case #PB_EventMenu
      Select EventMenuID()
        
        Case 1 : Minimize(1)                 
        Case 2 : Minimize(0)                  
          
        Case 3 : quit = 1 : End
      EndSelect
      
    Case #PB_EventGadget
      Select EventGadgetID()
      EndSelect
    Case #PB_EventCloseWindow : Minimize(1)   
  EndSelect
Until quit = 1
End
Chris :)