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
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
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!!!
J'ai zappé un bout du message
Tant pis, ça servira à d'autres
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
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 !!!

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
Et voilà 2 solutions pour le prix d'une

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

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