Manifest, Visual Styles et Boutons avec des Images
3 réponses
Pierre Y.
Salut,
J'imagine que le problème n'est pas nouveau.
Je veux utiliser des boutons ".net" avec le style Windows XP. J'ai
compris qu'en utilisant "Button.FlatStyle = FlatStyle.System" et en
appelant Application.EnableVisualStyles() :
Le problème était résolu, les composants qui supportent les styles sont
dessinés par Windows et tout va bien.
Ca se corse quand on veut mettre une image sur les boutons.
J'ai cherché un peu et j'ai trouvé sur codeproject un descendant de
Button qui utilise les vrais styles de windows (pas un bouton qui les
simule comme XP-Style Button :
http://www.codeproject.com/cs/miscctrl/xp-style_button.asp)
Il utilise une astuce pour savoir si les styles sont supportés et
reconstruit une image list avec les images nécessaires au dessin du
bouton et poste le message BCM_SETIMAGELIST pour que windows redessine
correctement le bouton avec son image.
A priori BCM_SETIMAGELIST n'est supporté que dans les version 6.0 et
supérieures de comctl32.dll donc il fait le test pour savoir si c'est
bien cette version de la dll qui est chargée.
Alors le truc rigolo c'est que si on utilise un fichier .manifest,
comctl32.dll 6.0 est LA SEULE version de comctl32.dll chargée en
mémoire donc le DllImport(... GetDLLVersion) fonctionne.
Si on utilise Application.EnableVisualStyles() alors les DEUX versions
de comctl32.dll sont chargées (5.82 qui ne supporte pas les thèmes et
6.0 qui les supporte)
Si on utilise Application.EnableVisualStyles ET le fichier .manifest
seule la version 6.0 est chargée.
Dans le cas où les deux versions de comctl32.dll sont chargées, les
astuces Michael Ganss dans son ImageButton ne fonctionnent pas.
Est-ce que vous connaissez un moyen d'avoir des boutons avec des images
qui supportent les styles de windows XP (tous les styles, les styles
standards et les autres styles tierce partie) qui fonctionnent avec
Application.EnableVisualStyles() ?
Ou savez-vous comment faire fonctionner le bouton de Michael Ganss avec
Application.EnableVisualStyles ?
Merci d'avance, A+
Pierre
--
Pierre Y.
levosgien.net - http://cerbermail.com/?7dwZGWwOB0
(Cliquez sur le lien ci-dessus pour me contacter en privé)
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Pierre Y.
Pierre Y. a écrit :
Salut,
J'imagine que le problème n'est pas nouveau.
Je veux utiliser des boutons ".net" avec le style Windows XP. J'ai compris qu'en utilisant "Button.FlatStyle = FlatStyle.System" et en appelant Application.EnableVisualStyles() :
Je vois que ça n'inspire personne. Vous savez peut-être où je pourrais aller ailleurs poser ma question ?
Merci encore,
Pierre Y.
-- Pierre Y. levosgien.net - http://cerbermail.com/?7dwZGWwOB0 (Cliquez sur le lien ci-dessus pour me contacter en privé)
Pierre Y. a écrit :
Salut,
J'imagine que le problème n'est pas nouveau.
Je veux utiliser des boutons ".net" avec le style Windows XP. J'ai compris
qu'en utilisant "Button.FlatStyle = FlatStyle.System" et en appelant
Application.EnableVisualStyles() :
Je vois que ça n'inspire personne. Vous savez peut-être où je pourrais
aller ailleurs poser ma question ?
Merci encore,
Pierre Y.
--
Pierre Y.
levosgien.net - http://cerbermail.com/?7dwZGWwOB0
(Cliquez sur le lien ci-dessus pour me contacter en privé)
Je veux utiliser des boutons ".net" avec le style Windows XP. J'ai compris qu'en utilisant "Button.FlatStyle = FlatStyle.System" et en appelant Application.EnableVisualStyles() :
Je vois que ça n'inspire personne. Vous savez peut-être où je pourrais aller ailleurs poser ma question ?
Merci encore,
Pierre Y.
-- Pierre Y. levosgien.net - http://cerbermail.com/?7dwZGWwOB0 (Cliquez sur le lien ci-dessus pour me contacter en privé)
Philippe
Chez moi ca marche en faisant ca
Application.EnableVisualStyles();
et this.MonBouton.FlatStyle = System.Windows.Forms.FlatStyle.System;
a++
Pierre Y. a écrit :
Pierre Y. a écrit :
Salut,
J'imagine que le problème n'est pas nouveau.
Je veux utiliser des boutons ".net" avec le style Windows XP. J'ai compris qu'en utilisant "Button.FlatStyle = FlatStyle.System" et en appelant Application.EnableVisualStyles() :
Je vois que ça n'inspire personne. Vous savez peut-être où je pourrais aller ailleurs poser ma question ?
Merci encore,
Pierre Y.
Chez moi ca marche en faisant ca
Application.EnableVisualStyles();
et
this.MonBouton.FlatStyle = System.Windows.Forms.FlatStyle.System;
a++
Pierre Y. a écrit :
Pierre Y. a écrit :
Salut,
J'imagine que le problème n'est pas nouveau.
Je veux utiliser des boutons ".net" avec le style Windows XP. J'ai
compris qu'en utilisant "Button.FlatStyle = FlatStyle.System" et en
appelant Application.EnableVisualStyles() :
Je vois que ça n'inspire personne. Vous savez peut-être où je pourrais
aller ailleurs poser ma question ?
et this.MonBouton.FlatStyle = System.Windows.Forms.FlatStyle.System;
a++
Pierre Y. a écrit :
Pierre Y. a écrit :
Salut,
J'imagine que le problème n'est pas nouveau.
Je veux utiliser des boutons ".net" avec le style Windows XP. J'ai compris qu'en utilisant "Button.FlatStyle = FlatStyle.System" et en appelant Application.EnableVisualStyles() :
Je vois que ça n'inspire personne. Vous savez peut-être où je pourrais aller ailleurs poser ma question ?
Merci encore,
Pierre Y.
Fabrice MALAINGRE
Bonsoir Pierre,
Je ne suis pas sûr d'avoir bien saisi la question mais, il me semble que pour résoudre votre problème, il suffirait de créer une classe qui dérive de Button, et qui surcharge la "WndProc".
A partir de là, il suffit de "trapper" le message WM_PAINT et de dessiner l'image après que le système est dessiné le bouton !
Quelque chose du genre :
//============================================ private class OwnerDrawnButton:System.Windows.Forms.Button { public OwnerDrawnButton(Image image) { this.Image = image; this.FlatStyle = FlatStyle.System; }
protected override void WndProc(ref Message m) { const int WM_PAINT = 0x00F;
switch (m.Msg) { case WM_PAINT: base.WndProc (ref m); if (this.FlatStyle == FlatStyle.System) { using (Graphics gc = Graphics.FromHwnd(this.Handle)) { // Draw image on the middle of the button gc.DrawImageUnscaled(this.Image, new Point((this.Width - this.Image.Width) / 2, (this.Height - this.Image.Height) / 2)); } } break;
default: base.WndProc (ref m); break; } } // WndProc(ref Message m) } // class OwnerDrawnButton:System.Windows.Forms.Button
//============================================ Ceci est juste histoire de vous donner une piste possible...
Il faudrait tester ce code dans tous les cas de figure, et sûrement l'adapter, pour être sûr du résultat attendu !
Cordialement
____________________________ Fabrice MALAINGRE Architecte Logiciel - Chef de Projet THEORIS - www.theoris.fr
Bonsoir Pierre,
Je ne suis pas sûr d'avoir bien saisi la question mais, il me semble que
pour résoudre votre problème, il suffirait de créer une classe qui dérive de
Button, et qui surcharge la "WndProc".
A partir de là, il suffit de "trapper" le message WM_PAINT et de dessiner
l'image après que le système est dessiné le bouton !
Quelque chose du genre :
//============================================ private class OwnerDrawnButton:System.Windows.Forms.Button
{
public OwnerDrawnButton(Image image)
{
this.Image = image;
this.FlatStyle = FlatStyle.System;
}
protected override void WndProc(ref Message m)
{
const int WM_PAINT = 0x00F;
switch (m.Msg)
{
case WM_PAINT:
base.WndProc (ref m);
if (this.FlatStyle == FlatStyle.System)
{
using (Graphics gc = Graphics.FromHwnd(this.Handle))
{
// Draw image on the middle of the button
gc.DrawImageUnscaled(this.Image, new
Point((this.Width - this.Image.Width) / 2, (this.Height - this.Image.Height)
/ 2));
}
}
break;
default:
base.WndProc (ref m);
break;
}
} // WndProc(ref Message m)
} // class OwnerDrawnButton:System.Windows.Forms.Button
//============================================
Ceci est juste histoire de vous donner une piste possible...
Il faudrait tester ce code dans tous les cas de figure, et sûrement
l'adapter, pour être sûr du résultat attendu !
Cordialement
____________________________
Fabrice MALAINGRE
Architecte Logiciel - Chef de Projet
THEORIS - www.theoris.fr
Je ne suis pas sûr d'avoir bien saisi la question mais, il me semble que pour résoudre votre problème, il suffirait de créer une classe qui dérive de Button, et qui surcharge la "WndProc".
A partir de là, il suffit de "trapper" le message WM_PAINT et de dessiner l'image après que le système est dessiné le bouton !
Quelque chose du genre :
//============================================ private class OwnerDrawnButton:System.Windows.Forms.Button { public OwnerDrawnButton(Image image) { this.Image = image; this.FlatStyle = FlatStyle.System; }
protected override void WndProc(ref Message m) { const int WM_PAINT = 0x00F;
switch (m.Msg) { case WM_PAINT: base.WndProc (ref m); if (this.FlatStyle == FlatStyle.System) { using (Graphics gc = Graphics.FromHwnd(this.Handle)) { // Draw image on the middle of the button gc.DrawImageUnscaled(this.Image, new Point((this.Width - this.Image.Width) / 2, (this.Height - this.Image.Height) / 2)); } } break;
default: base.WndProc (ref m); break; } } // WndProc(ref Message m) } // class OwnerDrawnButton:System.Windows.Forms.Button
//============================================ Ceci est juste histoire de vous donner une piste possible...
Il faudrait tester ce code dans tous les cas de figure, et sûrement l'adapter, pour être sûr du résultat attendu !
Cordialement
____________________________ Fabrice MALAINGRE Architecte Logiciel - Chef de Projet THEORIS - www.theoris.fr