Page 1 sur 1

[R]Incrustation d'icones dans la barre de menu

Posté : ven. 03 juil. 2020 12:52
par someonescripting
Bonjour,

Je viens de faire un petit proof of concept d'une barre de menu dans une fenêtre afin d'y afficher des icônes en ayant arrangé un exemple trouvé sur le net.

Code : Tout sélectionner

#pragma compile(Icon, .\ICO\POW10.ico)
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <Constants.au3>
#include <GUIConstants.au3>
#include <GUIMenu.au3>
#include <GDIPlus.au3>
#RequireAdmin

Opt ("GUIOnEventMode", 1)

Global $StopScript = False

#Region ### START Koda GUI section ###
Global $Form1 = GUICreate("Form1", 260, 200, 192, 124)
Global $MenuItemFile = GUICtrlCreateMenu("&Fichier")
Global $MenuItemSystemInfo = GUICtrlCreateMenuItem("&Informations système", $MenuItemFile)
Global $MenuItemSeparation1 = GUICtrlCreateMenuItem("", $MenuItemFile, 2)
Global $MenuItemAllCheck = GUICtrlCreateMenuItem("Tout &coher", $MenuItemFile)
Global $MenuItemAllUncheck = GUICtrlCreateMenuItem("Tout &décocher", $MenuItemFile)
Global $MenuItemSeparation2 = GUICtrlCreateMenuItem("", $MenuItemFile, 5)
Global $MenuItemExit = GUICtrlCreateMenuItem("&Quitter", $MenuItemFile)
Global $MenuItemHelp = GUICtrlCreateMenu("&?")
Global $MenuItemAbout = GUICtrlCreateMenuItem("A &Propos", $MenuItemHelp)

_GDIPlus_Startup()

Global $IconSystemInfo = _WinAPI_LoadImage(2, ".\ICO\InfoSys.ico", $IMAGE_ICON, 16, 16, $LR_LOADFROMFILE)
Global $IconAllCheck = _WinAPI_LoadImage(2, ".\ICO\Check.ico", $IMAGE_ICON, 16, 16, $LR_LOADFROMFILE)
Global $IconAllUnCheck = _WinAPI_LoadImage(2, ".\ICO\Uncheck.ico", $IMAGE_ICON, 16, 16, $LR_LOADFROMFILE)
Global $IconExit = _WinAPI_LoadImage(2, ".\ICO\Exit.ico", $IMAGE_ICON, 16, 16, $LR_LOADFROMFILE)
Global $IconAbout = _WinAPI_LoadImage(2, ".\ICO\About.ico", $IMAGE_ICON, 16, 16, $LR_LOADFROMFILE)

Global $BitmapSystemInfo = _GDIPlus_BitmapCreateFromHICON($IconSystemInfo)
Global $BitmapAllCheck = _GDIPlus_BitmapCreateFromHICON($IconAllCheck)
Global $BitmapAllUnCheck = _GDIPlus_BitmapCreateFromHICON($IconAllUnCheck)
Global $BitmapExit = _GDIPlus_BitmapCreateFromHICON($IconExit)
Global $BitmapAbout = _GDIPlus_BitmapCreateFromHICON($IconAbout)

Global $GDIBitmapSystemInfo = _GDIPlus_BitmapCreateHBITMAPFromBitmap($BitmapSystemInfo)
Global $GDIBitmapAllCheck = _GDIPlus_BitmapCreateHBITMAPFromBitmap($BitmapAllCheck)
Global $GDIBitmapAllUnCheck = _GDIPlus_BitmapCreateHBITMAPFromBitmap($BitmapAllUnCheck)
Global $GDIBitmapExit = _GDIPlus_BitmapCreateHBITMAPFromBitmap($BitmapExit)
Global $GDIBitmapAbout = _GDIPlus_BitmapCreateHBITMAPFromBitmap($BitmapAbout)

_GUICtrlMenu_SetItemBmp(GUICtrlGetHandle($MenuItemFile), 0, $GDIBitmapSystemInfo)
_GUICtrlMenu_SetItemBmp(GUICtrlGetHandle($MenuItemFile), 2, $GDIBitmapAllCheck)
_GUICtrlMenu_SetItemBmp(GUICtrlGetHandle($MenuItemFile), 3, $GDIBitmapAllUnCheck)
_GUICtrlMenu_SetItemBmp(GUICtrlGetHandle($MenuItemFile), 5, $GDIBitmapExit)
_GUICtrlMenu_SetItemBmp(GUICtrlGetHandle($MenuItemHelp), 0, $GDIBitmapAbout)

GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

#Region GUI2
Global $Form2 = GUICreate("Form2", 200, 100)

GUISetState(@SW_HIDE)
#EndRegion GUI2

GUISetOnEvent ($GUI_EVENT_CLOSE, "STOP", $Form1)
GUISetOnEvent ($GUI_EVENT_CLOSE, "CLOSEINFOSYS", $Form2)
GUICtrlSetOnEvent ($MenuItemExit, "STOP")
GUICtrlSetOnEvent ($MenuItemSystemInfo, "OPENINFOSYS")


While Not $StopScript
	Sleep (100)
WEnd

Func STOP()
	_GDIPlus_BitmapDispose($BitmapSystemInfo)
	_GDIPlus_BitmapDispose($BitmapAllCheck)
	_GDIPlus_BitmapDispose($BitmapAllUnCheck)
	_GDIPlus_BitmapDispose($BitmapExit)
	_GDIPlus_BitmapDispose($BitmapAbout)

	_WinAPI_DeleteObject($GDIBitmapSystemInfo)
	_WinAPI_DeleteObject($GDIBitmapAllCheck)
	_WinAPI_DeleteObject($GDIBitmapAllUnCheck)
	_WinAPI_DeleteObject($GDIBitmapExit)
	_WinAPI_DeleteObject($GDIBitmapAbout)

	_WinAPI_DestroyIcon($IconSystemInfo)
	_WinAPI_DestroyIcon($IconAllCheck)
	_WinAPI_DestroyIcon($IconAllUnCheck)
	_WinAPI_DestroyIcon($IconExit)
	_WinAPI_DestroyIcon($IconAbout)

	_GDIPlus_Shutdown()
	$StopScript = True
EndFunc

Func OPENINFOSYS()
	GUISetState (@SW_SHOW, $Form2)
EndFunc

Func CLOSEINFOSYS()
	GUISetState (@SW_HIDE, $Form2)
EndFunc
Ma question est la suivante : Je dispose d’icônes au format "ico" (je peux les convertir ou en trouver d'autre en bmp/png etc) en 16x16. Connaitriez vous une méthode plus simple (ou plus optimisé) afin d'arriver au même résultat ?

Avec la méthode précédente, certain de mes icônes sont comme "baveux" alors que les fichiers "ico" parraissent propre (question de conversion en bitmap ?)

Merci d'avance.

Re: [..]Incrustation d'icones dans la barre de menu

Posté : ven. 03 juil. 2020 19:02
par walkson
Bonjour,
Je vous mets un exemple polyvalent (Pic, button, menu, contextmenu) et pour tous types d'images

Code : Tout sélectionner

#include <GUIConstantsEx.au3>
#include <GuiMenu.au3>
#include <GDIPlus.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>
#include <StaticConstants.au3>
$GUI = GUICreate("Test",250,200)
Global $Pic1 = GUICtrlCreatePic("", 0, 0, 250, 200, $SS_BITMAP)
GUICtrlSetState(-1, $GUI_DISABLE)
$img = ADD_image(@ProgramFilesDir & "\AutoIt3\Examples\Helpfile\Extras\Hatch.bmp",250, 200)
$hb = GUICtrlSendMsg($Pic1, $STM_SETIMAGE, $IMAGE_BITMAP, $img)
If $hb Then _WinAPI_DeleteObject($hb)
$boutonArbo = GUICtrlCreateButton("clique droit",50,50,140,40)
$bouton = GUICtrlCreateButton("",50,100,140,40,BitOR($BS_BITMAP,$BS_CENTER,$BS_VCENTER))
;===================================================================
Global $idFilemenu = GUICtrlCreateMenu("&File")
$Hmenu = GUICtrlGetHandle($idFilemenu) ; handle du menu
Global $idFileitem = GUICtrlCreateMenuItem("Open", $idFilemenu)
GUICtrlSetState(-1, $GUI_DEFBUTTON)
Global $idExititem = GUICtrlCreateMenuItem("Exit", $idFilemenu)
GUICtrlCreateMenuItem("Save", $idFilemenu)
GUICtrlSetState(-1, $GUI_DISABLE)
Global $idHelpmenu = GUICtrlCreateMenu("?")
Global $idInfoitem = GUICtrlCreateMenuItem("Info", $idHelpmenu)
;====================================================================
Global $contexte = GUICtrlCreateContextMenu($boutonArbo) ;ID du menu
$Hcontexte = GUICtrlGetHandle($contexte) ; handle du menu
GUISetState(@SW_SHOW,$GUI)
;============== items du menu =================================
	$e_idNew = GUICtrlCreateMenuItem("&New",$contexte)
	$e_idOpen = GUICtrlCreateMenuItem("&open",$contexte)
	$e_idSave = GUICtrlCreateMenuItem("&Save",$contexte)
;============= charge les images =============================
	$img1 = ADD_image(@ProgramFilesDir & "\AutoIt3\Examples\GUI\Torus.png",32, 32) ;ADD_image(chemin, largeur, hauteur)
	$img2 = ADD_image(@ProgramFilesDir & "\AutoIt3\Examples\GUI\merlin.gif",32, 32)
	$img3 = ADD_image(@ProgramFilesDir & "\AutoIt3\Examples\Helpfile\Extras\Exclamation.png",32, 32)
	$img4 = ADD_image(@ProgramFilesDir & "\AutoIt3\Examples\Helpfile\Extras\Soccer.ico",32, 32)
	$img5 = ADD_image(@ProgramFilesDir & "\AutoIt3\Examples\Helpfile\Extras\Arrow.ico",32, 32)
	$img6 = ADD_image(@ProgramFilesDir & "\AutoIt3\Examples\Helpfile\Extras\Script.ico",32, 32)
;============ enregistre les images sur les items ====================
	_GUICtrlMenu_SetItemBmp($Hcontexte, 0, $img1)
	_GUICtrlMenu_SetItemBmp($Hcontexte, 1, $img2)
	_GUICtrlMenu_SetItemBmp($Hcontexte, 2, $img3)
	_GUICtrlMenu_SetItemBmp($Hmenu, 0, $img4)
	_GUICtrlMenu_SetItemBmp($Hmenu, 1, $img5)
	_GUICtrlMenu_SetItemBmp($Hmenu, 2, $img6)
	$hb = GUICtrlSendMsg($bouton, $BM_SETIMAGE, $IMAGE_BITMAP, $img3)
	If $hb Then _WinAPI_DeleteObject($hb)

While 1
       $msg = GUIGetMsg()
	   Switch $msg
		   Case $GUI_EVENT_CLOSE, $idExititem
			   _WinAPI_DeleteObject($img1)
			   _WinAPI_DeleteObject($img2)
			   _WinAPI_DeleteObject($img3)
			   _WinAPI_DeleteObject($img4)
			   _WinAPI_DeleteObject($img5)
			   _WinAPI_DeleteObject($img6)
			    Exit
		   Case $e_idNew
			   MsgBox(0,"","New")
		   Case $idFileitem, $e_idOpen
			   FileOpenDialog("Choose file...", @DesktopDir, "All (*.*)")

	   EndSwitch
WEnd

Func ADD_image($sFile,$W = 128, $H = 128) ;crer un Hbitmap selon chemin
	_GDIPlus_Startup()
	$hBitmap = _GDIPlus_BitmapCreateFromFile ($sFile) ; charge image
	$hBitmap= _GDIPlus_ImageResize($hBitmap, $W , $H) ;redimensionne pour rentrer dans le menu
	$hGraphic = _GDIPlus_ImageGetGraphicsContext($hBitmap) ;crée un graphic selon l'image
	_GDIPlus_GraphicsSetCompositingQuality($hGraphic, 2) ;améliore la qualité non indispensable
	_GDIPlus_GraphicsSetInterpolationMode($hGraphic, 7) ;améliore la qualité non indispensable
	_GDIPlus_GraphicsSetSmoothingMode($hGraphic, $GDIP_SMOOTHINGMODE_HIGHQUALITY) ;améliore la qualité non indispensable
    _GDIPlus_GraphicsDrawImageRectRect($hGraphic, $hBitmap, 0, 0,$W,$H, 0, 0,$W,$H) ;dessine l'image dans le graphic
	$hBMP = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap) ;crée un Hbitmap adaptable au menu à partir du bitmap
    _GDIPlus_BitmapDispose($hBitmap) ;nettoie
	_GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_Shutdown()
Return $hBMP ;retourne le handle du Hbitmap
EndFunc

Vérifiez les chemins mais normalement ils doivent être bons

Re: [..]Incrustation d'icones dans la barre de menu

Posté : ven. 03 juil. 2020 21:11
par someonescripting
Que ferais-je sans la communauté de AutoItscript.fr ?

Encore une fois merci à toi @walkson ! (Et en plus, la fonction est commenté, ça c'est le top ! =D)

Adapté a mon petit bout de code précédent cela donne :

Code : Tout sélectionner

#pragma compile(Icon, .\ICO\POW10.ico)
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <Constants.au3>
#include <GUIConstants.au3>
#include <GUIMenu.au3>
#include <GDIPlus.au3>

Opt("MustDeclareVars", 1)
Opt ("GUIOnEventMode", 1)

Global $StopScript = False

#Region ### START Koda GUI section ###
Global $Form1 = GUICreate("Form1", 260, 200, 192, 124)
Global $MenuItemFile = GUICtrlCreateMenu("&Fichier")
Global $MenuItemSystemInfo = GUICtrlCreateMenuItem("&Informations système", $MenuItemFile)
Global $MenuItemSeparation1 = GUICtrlCreateMenuItem("", $MenuItemFile, 2)
Global $MenuItemAllCheck = GUICtrlCreateMenuItem("Tout &coher", $MenuItemFile)
Global $MenuItemAllUncheck = GUICtrlCreateMenuItem("Tout &décocher", $MenuItemFile)
Global $MenuItemSeparation2 = GUICtrlCreateMenuItem("", $MenuItemFile, 5)
Global $MenuItemExit = GUICtrlCreateMenuItem("&Quitter", $MenuItemFile)
Global $MenuItemHelp = GUICtrlCreateMenu("&?")
Global $MenuItemAbout = GUICtrlCreateMenuItem("A &Propos", $MenuItemHelp)

Global $imgSystemInfo = _ADD_image(".\ICO\Infosys.ico",16, 16) ;ADD_image(chemin, largeur, hauteur)
Global $imgAllCheck = _ADD_image(".\ICO\Check.ico",16, 16)
Global $imgAllUnCheck = _ADD_image(".\ICO\Uncheck.ico",16, 16)
Global $imgExit = _ADD_image(".\ICO\Exit.ico",16, 16)
Global $imgAbout = _ADD_image(".\ICO\About.ico",16, 16)
_GUICtrlMenu_SetItemBmp(GUICtrlGetHandle($MenuItemFile), 0, $imgSystemInfo)
_GUICtrlMenu_SetItemBmp(GUICtrlGetHandle($MenuItemFile), 2, $imgAllCheck)
_GUICtrlMenu_SetItemBmp(GUICtrlGetHandle($MenuItemFile), 3, $imgAllUnCheck)
_GUICtrlMenu_SetItemBmp(GUICtrlGetHandle($MenuItemFile), 5, $imgExit)
_GUICtrlMenu_SetItemBmp(GUICtrlGetHandle($MenuItemHelp), 0, $imgAbout)

GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

#Region GUI2
Global $Form2 = GUICreate("Form2", 200, 100)
GUISetState(@SW_HIDE)
#EndRegion GUI2

GUISetOnEvent ($GUI_EVENT_CLOSE, "_STOP", $Form1)
GUICtrlSetOnEvent ($MenuItemExit, "_STOP")
GUICtrlSetOnEvent ($MenuItemSystemInfo, "_OPENINFOSYS")
GUISetOnEvent ($GUI_EVENT_CLOSE, "_CLOSEINFOSYS", $Form2)

While NOT $StopScript
	Sleep (100)
WEnd

Func _ADD_image($sFile,$W = 128, $H = 128) ;crer un Hbitmap selon chemin
	_GDIPlus_Startup()
	Local $hBitmap = _GDIPlus_BitmapCreateFromFile ($sFile) ; charge image
	$hBitmap= _GDIPlus_ImageResize($hBitmap, $W , $H) ;redimensionne pour rentrer dans le menu
	Local $hGraphic = _GDIPlus_ImageGetGraphicsContext($hBitmap) ;crée un graphic selon l'image
	_GDIPlus_GraphicsSetCompositingQuality($hGraphic, 2) ;améliore la qualité non indispensable
	_GDIPlus_GraphicsSetInterpolationMode($hGraphic, 7) ;améliore la qualité non indispensable
	_GDIPlus_GraphicsSetSmoothingMode($hGraphic, $GDIP_SMOOTHINGMODE_HIGHQUALITY) ;améliore la qualité non indispensable
    _GDIPlus_GraphicsDrawImageRectRect($hGraphic, $hBitmap, 0, 0,$W,$H, 0, 0,$W,$H) ;dessine l'image dans le graphic
	Local $hBMP = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap) ;crée un Hbitmap adaptable au menu à partir du bitmap
    _GDIPlus_BitmapDispose($hBitmap) ;nettoie
	_GDIPlus_GraphicsDispose($hGraphic) ;nettoie
    _GDIPlus_Shutdown()
	Return $hBMP ;retourne le handle du Hbitmap
EndFunc

Func _OPENINFOSYS()
	GUISetState (@SW_SHOW, $Form2)
EndFunc

Func _CLOSEINFOSYS()
	GUISetState (@SW_HIDE, $Form2)
EndFunc

Func _STOP()
	_WinAPI_DeleteObject($imgSystemInfo)
	_WinAPI_DeleteObject($imgAllCheck)
	_WinAPI_DeleteObject($imgAllUnCheck)
	_WinAPI_DeleteObject($imgExit)
	_WinAPI_DeleteObject($imgAbout)
	$StopScript = True
EndFunc
Plus propre, moins de ligne, et des icônes au moins 4x mieux représenté =D

Re: [..]Incrustation d'icones dans la barre de menu

Posté : mar. 07 juil. 2020 22:59
par someonescripting
Bonsoir, je me permet de ré-ouvrir ce post car je rencontre un petit problème ...

Lorsque je compile mon script, et que l'exe est dans le dossier du script, aucun problème, mais si je déplace l'exe admettons sur le bureau, lorsque je lance celui-ci, les icônes dans ma barre de menu ne s'affiche pas ...
J'imagine que je doit inclure mes fichier ICO au script ? (Je souhaiterais autant que faire ce peux avoir juste un exe standalone, sans dépendre d'autre dossiers ou fichiers)

Des idées ?

Merci d'avance !

Re: [..]Incrustation d'icones dans la barre de menu

Posté : mar. 07 juil. 2020 23:05
par Tlem
Bonsoir.
La fonction FileInstall() est votre amie. ^^

Re: [..]Incrustation d'icones dans la barre de menu

Posté : mar. 07 juil. 2020 23:16
par someonescripting
Bonsoir @Tlem,

Merci pour votre réponse, j'ai bien pensé à la fonction FileInstall, mais cela m'impose de les installer quelque part.
Serait-ce possible de les "include" uniquement dans le script et d'y faire appel ensuite ?

Merci.

Re: [..]Incrustation d'icones dans la barre de menu

Posté : mar. 07 juil. 2020 23:21
par Tlem
Cette fonction permet d'inclure un ou plusieurs fichiers dans votre script.
L'appel à cette fonction dans votre code exécutera l'extraction de la ressource concernée dans le dossier de votre choix. Vous pouvez utiliser comme de nombreux autres logiciels le dossier temporaire de l'utilisateur. ^^

Re: [..]Incrustation d'icones dans la barre de menu

Posté : mar. 07 juil. 2020 23:46
par someonescripting
Rebonsoir @Tlem.

Effectivement je n'avais pas pensé au dossier TEMP.
Maintenant un autre problème ce pose. Si je fait un FileInstall (".\ICO\Infosys.ico", @TempDir), cela ne marche pas ... Les fichiers ne sont pas installés, ni là, ni ailleurs.
Si je remplace @TempDir par admettons "C:\", pas de problème.
Je précise que j'ai mis #requireadmin en début de script.

Merci

Re: [..]Incrustation d'icones dans la barre de menu  

Posté : mar. 07 juil. 2020 23:50
par Tlem
Relisez la doc de FileInstall().
Il manque quelque chose pour la destination. :P

Re: [..]Incrustation d'icones dans la barre de menu

Posté : mar. 07 juil. 2020 23:59
par someonescripting
Effectivement ... il manquait l'antislash.
Merci pour la remarque @Tlem.

Re: [R]Incrustation d'icones dans la barre de menu

Posté : mer. 08 juil. 2020 00:31
par walkson
Bonjour,
Je précise que j'ai mis #requireadmin en début de script.
Mais, c'est devenu une manie ! Voila plusieurs codes où je vois #requireadmin :shock:
D'abord #requireadmin ne corrige pas les erreurs et ensuite pour ouvrir la porte de votre frigo, vous ne demandez pas la permission du président de la république ! C'est un peu ce que vous faites ! Et je ne parle pas de la fenêtre que cela génère (permission) que je n'ai jamais réussi à fermer automatiquement à mon grand désespoir :(
A part quelques programmes qui demandent #requireadmin ou pour modifier des fichiers système (et encore !), #requireadmin est inutile

Re: [R]Incrustation d'icones dans la barre de menu

Posté : mer. 08 juil. 2020 00:36
par someonescripting
Bonsoir @Walkson.

Je met le #requireadmin car c'est un script qui modifie surtout des clés de registre et lance des commandes Powershell en administrateur.
Est-ce un tort ?
Et je ne parle pas de la fenêtre que cela génère (permission) que je n'ai jamais réussi à fermer automatiquement à mon grand désespoir
C'est à dire ?

Re: [R]Incrustation d'icones dans la barre de menu

Posté : mer. 08 juil. 2020 00:57
par walkson
Pour le savoir, il faut lancer le code sans #requireadmin et de voir
Le fait de modifier les clefs du registre ne demande pas #requireadmin . Il faut tester. J'ai très peu de code qui modifie le registre sauf quand il s'agit de modifier le shell (clic droit de la souris)
[Edit]
Si vous modifiez votre message pendant que j'écris.....
Avec #requireadmin vous avez une fenêtre qui s'ouvre et vous demande l'autorisation de lancer le programme. C'est cette fenêtre que je n'ai jamais réussi à fermer automatiquement (control..., win...) et il semble que l'on ne peut pas la fermer en dehors du clic souris

Re: [R]Incrustation d'icones dans la barre de menu

Posté : mer. 08 juil. 2020 01:10
par someonescripting
Pour le registre je me doutais, mais je lance des commandes Powershell qui nécessite les droits d'administrateur comme changer le nom de l'ordinateur ou modifier la gestion et la taille du ficher d'échange, entre autres.