Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

BOUTON RÉDUIRE DANS SYSTRAY DANS LA BARRE DE TITRE AU LOOK XP (COMPATIBLE TOUT WINDOWS)


Information sur la source

Catégorie :Formulaire Classé sous : systray, stylexp, barre, bouton, xp Niveau : Initié Date de création : 20/11/2004 Date de mise à jour : 23/12/2004 21:21:00 Vu / téléchargé: 14 099 / 2 434

Note :
9,67 / 10 - par 12 personnes
9,67 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (71)
Ajouter un commentaire et/ou une note


Description

Cliquez pour voir la capture en taille normale
Cela faisait un bon moment que je cherchais à faire ceci, et j'ai enfin réussi, ouf !

Il s'agit d'une source qui est un mix de plusieurs sources de ce site et de vbAccelerator.com. Je n'ai par contre plus le nom des auteurs, mais je suis sûr qu'il se reonnaîtrons.

Au menu : Ajout d'un bouton dans la barre de titre de Windows, interception de ces événements pour réduire dans le systray lors d'un clic, et le fin du fin : un look complètement XP qui gère le changement des thèmes ! Normalement, cette source est compatible avec les autres versions de Windows (pas uniquement XP), mais cela reste à tester !

Bref, il s'agit d'un "vrai" bouton de barre de titre, et non un simple bouton carré à la Windows 95 tout moche rajoutté dans la barre de titre

Le code est assez simple, par contre, la classe de tracé des graphismes de Windows XP n'est pas de moi.

Le mouseOver est bien entendu géré, ainsi que le MouseDown !
Par contre, si la fenêtre n'est pas active, l'image du bouton n'est pas modifiée, ce qui est assez moche au final. Je pense modifier cà par la suite.
 

Source

  • Private oSystray As New SysTray
  • Private Sub Form_Load()
  • Call dksSystrayButton1.InitializeTitleBar
  • End Sub
  • Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
  • 'on interception des événements sur l'icône du systray
  • Select Case X
  • Case &H202 To &H203
  • Me.Show
  • Call oSystray.DeleteIcon
  • Let dksSystrayButton1.Visible = True
  • End Select
  • End Sub
  • Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
  • Call dksSystrayButton1.TerminateTitleBar
  • End Sub
  • Private Sub uTransparentPicture1_Click()
  • 'on créer une icône dans le systray
  • Call oSystray.CreateIcon(Me, Me.Caption)
  • Me.Hide
  • Let dksSystrayButton1.Visible = False
  • End Sub
Private oSystray As New SysTray

Private Sub Form_Load()

    Call dksSystrayButton1.InitializeTitleBar

End Sub

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

    'on interception des événements sur l'icône du systray
    Select Case X
        Case &H202 To &H203
        Me.Show
        Call oSystray.DeleteIcon
        Let dksSystrayButton1.Visible = True
    End Select

End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)

    Call dksSystrayButton1.TerminateTitleBar

End Sub

Private Sub uTransparentPicture1_Click()

    'on créer une icône dans le systray
    Call oSystray.CreateIcon(Me, Me.Caption)
    Me.Hide
    Let dksSystrayButton1.Visible = False

End Sub

Conclusion

Si vous avez des idées pour inclures d'autres images de Windows, dites le moi, et j'essaierais de les mettre dans cette source. Maintenant que je sais comment récupèrer les principaux graphismes de WinXP et de tout les thèmes, je ne vais sûrement pas m'arrêter en si bon chemin ;)
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

22 novembre 2004 21:40:10 :
Mise à jour : - Gestion de la taille des boutons selon les thèmes. - Gestion de la couleur de fond pour la rendre transparence. - Correction du bug lors du clic sur l'icône du systray
23 décembre 2004 16:18:48 :
Grosse mise à jour de la source : dorénavant tout est implémenté dans l'ocx, donc niveau utilisateur, tout est beaucoup plus somple ! Ajout : compatibilité avec Windows 98/2000 (ca reste à tester) Gestion du thème "thème classique" de windows XP qui posait problème avant.
23 décembre 2004 16:24:00 :
23 décembre 2004 16:26:53 :
23 décembre 2004 21:21:02 :

Commentaires et avis

signaler à un administrateur
Commentaire de crazyjoke le 20/11/2004 22:14:55

C'est sympa et utile :).

Bravo

signaler à un administrateur
Commentaire de Sipadan le 20/11/2004 22:23:00

Salut,
Un petit probleme chez moi.
Le bouton réduire dans le systray reste tout seul affiché sur l'écran après deux utilisations.
Ce serait pas mal aussi d'avoir un point au lieu d'un trait sur le bouton, je crois bien que le standard est un point pour la réduction du systray.
Je pinaille un peu, mais c'est vrai que cette source peut etre très utile.
@+,Yann.

signaler à un administrateur
Commentaire de jack le 21/11/2004 01:49:09 administrateur CS

Salut DARKSIDIOUS

Apparemment, ne doit fonctionner qu'avec XP car sous W2k, il demande uxtheme.dll.
Est-ce une DLL de l'OS de XP ou bien ?

signaler à un administrateur
Commentaire de spy166 le 21/11/2004 09:59:16

Heu bien mais à améliorer.
Moi j'utilise style XP, et le bouton il est deux fois plus gros que les autred et il est mal positionné.

signaler à un administrateur
Commentaire de DARKSIDIOUS le 21/11/2004 11:06:42 administrateur CS

Alors répondons dans l'ordre :

crazyjoke : Merci ;)

Sipadan : bizarre, je n'ai pas ce problème chez moi ! Est-ce systèmatique ?
C'est vrai que certains boutons de réductions sont avec un point, et d'autre avec un tiret. Je vais voir ce que je peux faire.

jack : uxtheme.dll est la dll qui permet de gérer les thèmes il me semble. Elle est incluse sous WinXP, mais peut-être pas sous Windows 2000... On la trouve assez fréquement sur le net pour XP, mais je ne sais pas si elle existe pour la version 2000 !

spy166 : Je n'ai essayé pour le moment qu'avec les thèmes de Windows ainsi que quelques autres, mais ce ne sont pas des thèmes très éxotiques. Il est possible qu'avec certains thèmes, la taille ne soit pas bonne, mais ce n'est qu'une question de réglage : pour l'instant, je fixe la taille à 21*21 pixels, mais il est possible de récupèrer cette taille avec GetSystemMetrics, ce que je ferais pour la prochaine version !

Merci beaucoup à vous tous pour ces remarques constructives, j'en prendrais compte pour les prochaines évolutions !

DarK Sidious

signaler à un administrateur
Commentaire de NISANDSYSTEMS le 21/11/2004 12:16:47

Meme petit probleme que Sipadan, lors d'un clic sur le bouton.
Sinon tres bon code et de plus instructif.

Nisand-Systems

signaler à un administrateur
Commentaire de DARKSIDIOUS le 21/11/2004 12:19:16 administrateur CS

Hum ! Vous avez le SP2 de XP ? Vous avez quel thème ? Avez-vous la version de uxtheme.dll de base, ou l'avez-vous patcher pour pouvoir appliquer les thèmes de Windows ?

DarK Sidious

signaler à un administrateur
Commentaire de Sipadan le 21/11/2004 17:05:30

Re salut,
J'ai pas installé le sp2, je suis sous xp pro, avec le theme par défaut, ayant toutes les options désactivées sauf  "Lisser les polices d'écran" et "Utiliser des styles visuels sur les fenetres et des boutons". je n'ai pas n'on plus patché uxtheme.
@+,Yann.

signaler à un administrateur
Commentaire de DARKSIDIOUS le 21/11/2004 17:11:48 administrateur CS

Perso, j'utilise une dll patché qui permet d'utiliser des thèmes de bureaux sans installer de programmes annexes. Peut-être que ca vient de là... Si NISANDSYSTEMS pouvais confirmer qu'il n'a pas lui non plus la dll pathée...

DarK Sidious

signaler à un administrateur
Commentaire de Scalpweb le 21/11/2004 17:57:42

Simpa, et utile, brvo.

signaler à un administrateur
Commentaire de DARKSIDIOUS le 21/11/2004 18:07:13 administrateur CS

Merci scalpweb, sympa.

DarK Sidious

signaler à un administrateur
Commentaire de NISANDSYSTEMS le 22/11/2004 10:26:28

DarK Sidious, j'utilise XP SP2 et le theme par défaut.

Nisand-Systems

signaler à un administrateur
Commentaire de DARKSIDIOUS le 22/11/2004 11:21:41 administrateur CS

Oui, mais ta dll uxtheme a-t-elle était patchée ?

DarK Sidious

signaler à un administrateur
Commentaire de NISANDSYSTEMS le 22/11/2004 18:11:42

non

signaler à un administrateur
Commentaire de DARKSIDIOUS le 22/11/2004 18:57:17 administrateur CS

Cela vient peut-être de cà alors ! J'utilise une dll patchée pour pouvoir utiliser d'autres thèmes que ceux proposés par Microsoft... Et à ce moment là, c'est vraiment génant ! (à moins de distribuer la dll patchée lors du déploiement de l'application intégrant cette technique ! :(

DarK Sidious

signaler à un administrateur
Commentaire de NISANDSYSTEMS le 22/11/2004 19:23:11

C'est une solution mais si ton applic reagit sur cette difference là, imagine lors d'une update de windows.

Toute personne ayant ton applic devra systématiquement procéder à sa mie à jour.

Commercialement pas pratique, sinon tres bonne source.

Nisand-Systems

signaler à un administrateur
Commentaire de DARKSIDIOUS le 22/11/2004 19:32:41 administrateur CS

Ben ouais, je sais bien ! :(

Malheureusement, je ne vois pas trop d'autres solutions ! Ah mois de faire un InvalidateRect dès que la feuille est réduite !

Pourrais-tu me dire stp s'il s'agit uniquement de l'image qui reste affichée, ou s'il s'agit du bouton (essaye de passer la souris dessus pour voir si l'image change ou pas)

DarK Sidious

signaler à un administrateur
Commentaire de Sipadan le 22/11/2004 19:44:18

Pour moi c'est le bouton qui reste affiché.
@+,Yann.

signaler à un administrateur
Commentaire de DARKSIDIOUS le 22/11/2004 19:53:04 administrateur CS

AH ! carrément le bouton ! Vraiment bizarre cà !

Et est-ce que vous pourriez faire un petit test : remplacer le code de deux fonctions :

Private Sub Picture1_Click()

    'on créer une icône dans le systray
    Call oSystray.CreateIcon(Me, Me.Caption)
    Me.Hide
    Let Picture1.Visible = False

End Sub

et :

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)

    'on interception des événements sur l'icône du systray
    Select Case x
        Case &H201 To &H203
        Me.Show
        Call oSystray.DeleteIcon
        Let Picture1.Visible = True
    End Select

End Sub


Chez moi ca le masque bien...

C'est à partir de la deuxième fois que vous masquez la feuille que ca laisse le bouton ?

DarK Sidious

signaler à un administrateur
Commentaire de Sipadan le 22/11/2004 20:56:39

Yes, ça marche.
C'était bien au bout de la 2e fois qu'il restait affiché.
Bon tu vas dire que je suis chiant, mais des que je clique sur l'icone dans le systrait, la form réaparait bien mais ça m'ouvre la connection réseau aussi car l'icone est juste en dessous.
@+,yann.

signaler à un administrateur
Commentaire de DARKSIDIOUS le 22/11/2004 21:10:53 administrateur CS

Ouf, c'est déjà cà !

Bon, pour le clic sur le bouton du systray, c'est normal : c'est juste dans l'interception des événements dessus : uniquement 1 click et non un double, sinon, l'icône qui suit est activée. Je gérerais cà dans la prochaine version qui arrive avec gestion de la couleur de transparence pour ne pas voir le fond de l'image du bouton. De plus, je passerais le picturebox en usercontrol => plus de possibilités, et code plus clair et plus compact dans la feuille principale pour l'utilisateur de cette source. Gestion également de la taille des boutons selon le thème utilisé, bref, encore un peu de boulot pour perfectionner cette source, mais je pense que ca va servir à pas mal de monde ! ;)

DarK Sidious

signaler à un administrateur
Commentaire de DARKSIDIOUS le 22/11/2004 21:41:06 administrateur CS

Mise à jour de la source avec les modif dites dans mon dernier message.

DarK Sidious

signaler à un administrateur
Commentaire de MadM@tt le 22/11/2004 21:55:27

c'est fort ça ! dommage qu'il y'ai encore quelques problèmes comme je vois avec les posts précédents mais si je peux apporter un ptit peu d'aide au niveau des tests demandez moi...

signaler à un administrateur
Commentaire de DARKSIDIOUS le 22/11/2004 21:58:45 administrateur CS

ben normalement, avec cette version mise à jour, les problèmes mentionnés sont résolus. A confirmer quand même ! ;)

DarK Sidious

signaler à un administrateur
Commentaire de NISANDSYSTEMS le 23/11/2004 14:03:51

Auparavant, seul le controle Picture avec l'image resté.
Cela se voyait sur la Bar de titre lors de son incrustation.

Maintenant....

Exellente mise à jour. Fonctionne correctement.

Plus de probleme de distribution.
Un travail toujours aussi remarquable.
Bravo.

Nisand-Systems

signaler à un administrateur
Commentaire de DARKSIDIOUS le 23/11/2004 14:10:54 administrateur CS

Et encore, ce n'est pas fini : je pense intégrer l'affichage de plusieurs types de boutons standards (maximized, minimized, close, etc.), et créer un ocx uniquement pour tracer ces boutons. Ainsi, plus besoin de code extérieur pour afficher le bouton. Uniquement du code pour intéragir avec ces boutons, et les placer dans la barre de titre (je vais même réfléchir pour voir si ce n'est pas possible d'intégrer cette fonctionnalités dans l'ocx directement !)

En tout cas, merci beaucoup NISANDSYSTEMS et Sipadan, grâce à vous, j'ai pu résoudre un bug qui m'aurait complètement échappé !

DarK Sidious

signaler à un administrateur
Commentaire de NISANDSYSTEMS le 23/11/2004 19:45:17

Aucun probleme, quand c'est bien,il faut le dire et
il me semble que la communauté VBFrance est faite pour aider et etre aidé aussi.

En tout les cas, on attend la suite car ça promet une belle panoplie de nouveautés.

Nisand-Systems    

signaler à un administrateur
Commentaire de DARKSIDIOUS le 23/12/2004 16:23:07 administrateur CS

grosse mise à jour de la source.

Dorénavant, tout est encapsulé dans un ocx, que ce soit l'ajout dans la barre de titre ou la réduction dans le systray.

Il y a également la possibilité d'avoir jusqu'à 6 images différentes :
Réduction
Maximisation
Restauration
Fermeture
Petite icône de fermeture
Question

Simplification du code au niveau utilisateur : une dizaine de lignes suffisent

Reste à tester la compatibilté avec les autres windows (98/2000, si vous le possèdez, je vous serez reconnaissant de me dire si cette source marche chez vous ou non, merci d'avance !)

DarK Sidious

signaler à un administrateur
Commentaire de MasterHack le 23/12/2004 20:15:08

super bien le code 10/10
moi je pense creer une Dll activeX contenant des controles (commandbutton,optionbutton,checkbox ...) qui suivent le changement du theme winXP.En utilisant les api de la dll Uxtheme.Merci pour la source,c'est tres utile.
MasterHack
@+

signaler à un administrateur
Commentaire de Pym Corp le 23/12/2004 20:30:35

Alors là chapeau !

signaler à un administrateur
Commentaire de DARKSIDIOUS le 23/12/2004 21:18:01 administrateur CS

Merci beaucoup pour vos commentaires !

Dites, l'un de vous n'aurez pas Windows 2000 ou 98/95/Me par hasard ? Et si oui, est-ce que vous pourriez tester si ca marche sur ces OS svp ? J'aimerais rendre cette source compatible avec toutes les versions de Windows pour la rendre universelle. Normalement, le code est fait pour que ca soit compatible, mais je n'ai aucun moyen de le vérifier !

DarK Sidious

signaler à un administrateur
Commentaire de DARKSIDIOUS le 23/12/2004 21:23:01 administrateur CS

MasterHack : je ne vois pas trop l'intérêt d'une dll contenant les contrôles standards pour afficher les contrôles au look XP selon le thème actuel : il suffit d'intégrer le manifest directement dans l'exe, et le tour est joué.

Il existe une source sur vbAccelerator qui le permet et qui est bien pratique ! Et ainsi, plus besoin de fichier manifest à côté du prog !

DarK Sidious

signaler à un administrateur
Commentaire de Pym Corp le 23/12/2004 23:08:28

J'ai trouvé un petit bug, ou plutot un truc à améliorer.
Le bouton ne change pas lorsque la fenêtre perd le focus.

signaler à un administrateur
Commentaire de Pym Corp le 23/12/2004 23:15:39

Autre chose aussi, quand tu minimise la fenêtre et que le titre touche les bouttons, il n'apparaît pas en entier mais par exemple pour "Form1" comme ceci "For..."

Mais bon ca même le controle d'emule ou de filezilla le fait pas.

PS : mes commentaires sont pas des critiques, mais des idées d'améliorations.
C'est super ce que t'a fait bravo !

signaler à un administrateur
Commentaire de jack le 24/12/2004 03:00:22 administrateur CS

Ok, c'est bon DarkSirious
Sous W2k, le bouton apparait cette fois correctement à gauche de la mise en icône.
Juste deux remarques pour être parfait :
- La mise en SysTray se symbolise avec un point, et non un souligné (utilisé pour la mise en icône)
- Dans la gestion des clicks sur le SysTray : Il réagit au simple clique, mais pas au double click + l'cone disparait du SysTray lorsque la forme est régénérée : Conséquence : Lors d'un double-click, on donne un click de trop dans l'icône voisine de celle de l'appli = pas top

Vala.
Beau boulot de mise à jour, superbe.

signaler à un administrateur
Commentaire de MasterHack le 27/12/2004 16:27:00

DARKSIDIOUS>
Oui avec le manifest...mais il ya un probeleme je dirrai meme un grand probleme :quand on met les controles en 2em degre comme dans un frame,c'est pas beau a voir et aussi pour les scrollbar et palette comme on le voit en appliquant le manifest à vb6,tout ça me pousse a ceer un nouveau groupe de controles.de toute façcon j'ai commence.pas question de revenir.

signaler à un administrateur
Commentaire de DARKSIDIOUS le 27/12/2004 16:38:16 administrateur CS

MasterHack : Oui, c'est vrai qu'un checkbox dans un container, ca fait tout noir !

jack : je ne suis pas sûr qu'il existe une ressource sous Windows pour symboliser la réduction dans le systray (en tout cas, je ne la trouve pas !), et je me demande si le point n'est pas tout simplement une convention choisie par les développeurs qui mette un tel bouton dans la barre de titre...

DarK Sidious

signaler à un administrateur
Commentaire de gimystic le 31/12/2004 11:48:16

ah c trop bien

signaler à un administrateur
Commentaire de nr le 04/01/2005 10:48:17

Très impressionnant darksidious ! Félicitations.

Pour Le pb des checkbox qui sont noirs, il faut les mettre dans une picturebox et l'affichage est parfait.

@+

signaler à un administrateur
Commentaire de DARKSIDIOUS le 04/01/2005 10:56:21 administrateur CS

merci gimystic et nr

DarK Sidious

signaler à un administrateur
Commentaire de casy le 21/01/2005 22:28:56

Slt Dark

Je viens d'essayer ton code, pas mal du tout

il y a quelques temps j'avais codé une icone animée dans le systray, j'étais fier de moi, mais je dois avouer que je me trouve un peu ridicule maintenant ;) mais bon il n'y a que moi qui le sait donc ça va :)))

J'ai quand même 2 petits soucis :

J'utilise un thème perso basé sur le thème Luna (Windows XP, par défaut) et le modèle de couleur "Gris clair"

le premier pb est que lorsque la fenêtre perd le focus "système" on va dire, par exemple, ta fenêtre est au premier plan et que tu va cliquer dans une zone vide de la barre des taches, la fenêtre change d'apparence (dans mon cas elle devient assez pâle) les boutons systèmes aussi sauf le tiens. Je n'ai pas chercher mais c'est peut être rien à modifier.

le second est qu'en jouant avec les thèmes, fenêtre ouverte, au bout d'un moment, ton bouton est venu se supperposé au bouton de réduction, légèrement décalé vers le bouton d'agrandissement, de sorte (en visant bien) que j'avais toujours accès au bouton réduction. Il m'a fallu arrêter puis relancer ton soft pour que ça redevienne normal.

En tous cas ce code me donne des idées.

signaler à un administrateur
Commentaire de DARKSIDIOUS le 22/01/2005 08:16:40 administrateur CS

Merci pour ces remarques constructives casy.

Pour le premier problème, j'étais au courant (voir un peu plus haut les remarques).

Pour le deuxième problème, je n'y avais pas pensé ! Va falloir que j'y réfléchisse également !

DarK Sidious

signaler à un administrateur
Commentaire de casy le 22/01/2005 09:56:19

Ok pour le premier point, j'avais du sauté le post de Pim autant pour moi.

Il doit juste manquer quelque part une option refresh soit dans le controle soit dans l'appli.

J'ai eu un autre soucis, j'ai désactivé le .hide sur le click du bouton pour analyser un peu comment ça marchait tout ça.
Dans ces conditions quand tu clique sur le bouton dans le systray tu réaffiche la fenêtre (qui n'étais pas cachée) ton bouton n'est pas toujours réaffiché, mais en déplaçant la fenêtre il apparait (en fait il est peut être affiché mais au premier plan comme la fenêtre n'as pas le focus). C'est certainement la même cause, un problème de refresh.

Ca me laisse à penser (pure spéculation) que ton bouton ne vient pas s'intégrer à la barre de titre de la fenêtre, il vient juste se supperposé. N'y a-t-il moyen par les api ou autres de faire considérer ce bouton comme un bouton système et donc intégré à la fenêtre (en redéfinissant un controle Form ça risque d'être lourd, non?)

C'est possible, car j'ai essayer une appli une fois ou il y avait 7 boutons supplémentaires parfaitement integrés, mais je ne sais comment elle était codée :) probablement pas en VB en plus.

Pour le second point te prend pas trop la tête, c'est pas en utilisation normale. Qui s'ammuse à changer une dizaine de fois de thèmes en 2 minutes avec cette appli ouverte? :))) ...................... oui moi, mais c'est pas une raison pour faire pareil :)))

Sinon bon boulot

signaler à un administrateur
Commentaire de DARKSIDIOUS le 22/01/2005 10:08:15 administrateur CS

C'est un peu plus compliqué qu'un simple refresh :

J'ai essayé d'optimiser au max le code pour éviter d'avoir des applications trop lourdes, et du coup, le raffraichissement ne se fait pas automatiquement, sinon, il n'y aurait pas ce genre de problème. Pour l'instant, les raffraichissement se font : lorsque la souris passe dessus, lorsque la souris n'est plus dessus, et lorsque la souris clique dessus. Il reste donc à traiter : lorsque la fenêtre est désactivée, et lorsque la fenêtre se raffraichit, cas que je n'avais pas pensé.

En effet, le bouton n'est que superposé à la barre de titre, et il ne fait pas partit intégrante de la fenêtre. Mais je doute que ce soit possible à faire...

Pour ce qui est de mettre 7 boutons dans la barre de titre, c'est tout à fait possible. Je l'avais même fait avec ce bouton, mais cela demande une grosse modification du code à chaque ajout d'un nouveau bouton, c'est pour cette raison que j'ai laissé avec un seul bouton, ce qui est (à mon avis) le plus utile pour la plupart d'entre nous.

Bref, je vais y réfléchir pour voir comment corriger