couranrjet
Messages postés12Date d'inscriptionmardi 14 février 2006StatutMembreDernière intervention23 août 2006
-
17 août 2006 à 11:42
couranrjet
Messages postés12Date d'inscriptionmardi 14 février 2006StatutMembreDernière intervention23 août 2006
-
23 août 2006 à 11:44
Bonjour,
Voilà mon environnement de travail est visual C++ 7 ou 8.
Je cherche un moyen de modifier la forme d'un pushbuton.
Je souhaite modifer sa forme rectangulaire en forme d'ellipse.
Je cherche au ssi un moyen pour pouvoir y faire des dégradés et des bordures.
Est ce que quelqu'un pourrait éclairer ma lanterne?Merci.
Bruno
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 17 août 2006 à 16:56
Salut,
Le bouton doit être de style BS_OWNERDRAW. Tu peux utiliser la fonction CreateEllipticRgn() pour créer une région sous forme d'ellipse. Tu appliques ensuite cette région à ton bouton avec la fonction SetWindowRgn(). Pour les contours, tu dois les dessiner toi-même dans la fonction de dessin du bouton. Tu peux aussi utiliser des images BITMAP pour les contours et les dégradés.
couranrjet
Messages postés12Date d'inscriptionmardi 14 février 2006StatutMembreDernière intervention23 août 2006 17 août 2006 à 21:02
Salut Racpp,
Merci pour ton aide.
Pourrait on me préciser l'endroit ou je dois placer les fonctions CreateEllipticRgn() et SetWindowRgn()?
J'ai essayé dans Resource.h... bo
Y a t il une bibliothèque à activée ( # include ... .h) .
On parle de wingdi.h et de "dlls/gdi/region.c".
C'est pas encore évident pour moi donc si vous pouvez m'aider, merci
Bruno
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 17 août 2006 à 21:39
Rien de spécial à activer. Seul "#include <windows.h>" suffit. Ces fonctions doivent être utilisées juste après la création du bouton avec CreateWindow().
Aurais-tu peut-être un exemple simple qui illustre CreateWindow et l'emplacement exacte des ligne de code à placer?
Car je ne comprends pas toutes les explications de MSDN et les exemples
sur le net parlent de fonctions Callback et WinMain, propres aux
applications WIN32 je suppose.
Merci.
Bruno
Merci.
...
Vous n’avez pas trouvé la réponse que vous recherchez ?
couranrjet
Messages postés12Date d'inscriptionmardi 14 février 2006StatutMembreDernière intervention23 août 2006 18 août 2006 à 11:08
Mogwai,
Merci pour ton aide.
Pourrais tu me préciser où je dois mettre ces lignes de code dans le programme.
Là j' ai mis tes qq lignes en lieu et place du code en gras (mail précédent) dans mon programme (MFC application sur VC++ 7.) dans Resource.h.
Mais j'ai des erreurs du type:
error C2040: 'hCtrl' : 'int' differs in levels of indirection from 'HWND' .
Peut-être faut il placer tes lignes de code à un endroit particulier où ajouter une librairie quelque part ou y a un truc qui m'échappe encore... bo
Ne me laissez pas me morfondre. Merci.
Bruno
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 18 août 2006 à 16:26
Salut,
mogwai93 >> Ton exemple ne suffit pas pour avoir un bouton rond. Comme j'ai précisé plus haut, le bouton doit être de style BS_OWNERDRAW. On doit dessiner les contours pendant le traitement du message WM_DRAWITEM. Il faut penser à tous les cas: normal, enfoncé, grisé etc.
couranrjet >> Moi non plus je n'aime pas les MFC. Mais le principe reste le même. Je pense que tu peux récupérer le HWND du bouton avec la fonction GetDlgItem(). Les deux autres fonctions viendront juste après. Tout cela pendant l'initialisation de la boite de dialogue (On_InitDialog). Le dessin des contours se fait dans (On_DrawItem) grâce aux fonctions comme Ellipse(). Le bouton doit avoir le style BS_OWNERDRAW. Si l'éditeur de ressources ne permet ce style, tu peux utiliser la fonction SetWindowLong() suivie de SetWindowPos().
couranrjet
Messages postés12Date d'inscriptionmardi 14 février 2006StatutMembreDernière intervention23 août 2006 21 août 2006 à 13:32
Hello,
Merci Racpp.
Le GetDlgItem donne un CWnd* et pas un HWND.
Donc je cherche une fonction qui donne l'HWND de l'IDC_ ou une autre qui convertit un CWnd* en HWND...
Si qq s'y connait pour ce problème, son aide est la bienvenue.
Je suis en train de voir que sont CWnd et HWND exactement ds les MFC...
peut-être aurais je une idée et si oui je vous en ferai part...
couranrjet
Messages postés12Date d'inscriptionmardi 14 février 2006StatutMembreDernière intervention23 août 2006 21 août 2006 à 14:22
Dans OnInitDialog :
...
// TODO : ajoutez ici une initialisation supplémentaire
HWND *hwnd;
GetDlgItem(IDC_BUTTON1, hwnd);
...
A la compilation pas de problème.mais en mode debug :
Run-Time Check Failure #3 - The variable 'hwnd' is being used without being defined.
...
Donc je n'arrive toujours pas à obtenir le HWND
Bon ben si qq y voit clair merci pour son aide...
Peut-être est ce impossible avec Visual c++ 7. MFC ...
IL faut peut être que j'attaque Visual C++ 8 avec des skins.
Bruno
couranrjet
Messages postés12Date d'inscriptionmardi 14 février 2006StatutMembreDernière intervention23 août 2006 21 août 2006 à 18:33
Bonsoir,
Je pense plutot utiliser une variable (m_ellipse) de controle associée au pushbutton (BS_OWNERDRAW).
Je crée la région voulue:
Dans InitDialog:
HRGN MyRgn;
BOOL bRedraw;
bRedraw =
false;
MyRgn=CreateEllipticRgn(0, 0, 100, 100);
m_ellipse.SetWindowRgn(MyRgn,bRedraw);
Erreur à l'execution : le programme break dans la fonction
void
CButton::DrawItem(LPDRAWITEMSTRUCT){ASSERT (FALSE);}
La fonction OnDrawItem existe aussi mais je vois pas comment gérer le bazarre.
Aidez moi si vous le pouvez please....
Bruno
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 21 août 2006 à 20:02
Le type CWnd et une classe MFC qui encapsule une variable de type HWND. Pour récupérer le HWND, tu fais objet.m_hWnd ou objet est le nom de ton objet de type CWnd
couranrjet
Messages postés12Date d'inscriptionmardi 14 février 2006StatutMembreDernière intervention23 août 2006 22 août 2006 à 10:07
Hello,
vecchio56>> merci pour m_hWnd, ben oui faut rester rigoureux.
Je n'ai pas d'erreur à la compilation.
Mais quand je lance le debug, il m'envoie un message d'assertion:
Unhandled exception at 0x7c27341b (mfc71d.dll) in rageagainstthebutton.exe: User breakpoint.
Et je break dans
void CButton::DrawItem(LPDRAWITEMSTRUCT){ASSERT(FALSE);}
Je suppose que jedois enlever le assert(false); et le remplacer par du code....Mais lequel ? bo
Si pas moyens , je travaille avec un bitmap.
Bruno
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 22 août 2006 à 15:11
Il faut pas enlever le ASSERT(FALSE), tu n'a pas le droit de toucher directement au code de la classe CButton.
Je crois que tu dois créer une sous-classe de CButton, pour laquelle tu redéfinira la méthode DrawItem, et dans laquelle tu écrira le code du dessin du bouton
couranrjet
Messages postés12Date d'inscriptionmardi 14 février 2006StatutMembreDernière intervention23 août 2006 23 août 2006 à 11:39
Hello,
Je crée une classe CButtonbis.
Je place les include dans ma clase ...Dlg.cpp et .h pour être sur.
Puis je vais dans Class View pour ajouter la fonction "équivalente"
à DrawItem.
Mais enparamètres je passe quoi.
Pour DrawItem j'ai :
void CButton::DrawItem(LPDRAWITEMSTRUCT)
Donc jen vois pas quel paramètre passer en argument dans ma nouvelle
fonction.
La définiton de LPDRAWITEMSTRUCT me donne un FAR*,
jen'ai pas la possibilité de créer un FAR dans la création automatique de la fonction ( j'ai des int, float, ... des types classiques mais pas des FAR)...
J'a essayé manuellement de déclarer la fonction dans Buttonbis.h:
void CButton::OnDrawItem(LPDRAWITEMSTRUCT);
Puis je l'ai définie dansButtonbis.cpp :
void
CButton::OnDrawItem(LPDRAWITEMSTRUCT){};
J'ai modifié mon CButton m_button en CButtonbis m_button
Et je retourne qd même dans le bug d'assertion de CButton::DrawItem
à l'exécution.
Rappel:
Dasn le ...Dlg.cpp:
HWND hCtrl;
HRGN MyRgn;
MyRgn=CreateEllipticRgn(0, 0, 100, 100);
::SetWindowRgn(m_button.m_hWnd,MyRgn,
false);
couranrjet
Messages postés12Date d'inscriptionmardi 14 février 2006StatutMembreDernière intervention23 août 2006 23 août 2006 à 11:44
En fait j'ai comme type d'erreur:
error C2509: 'OnDrawItem' : member function not declared in 'CButton'.
error C3241: 'void CButtonbis::OnDrawItem(LPDRAWITEMSTRUCT)' : this method was not introduced by 'CWnd', je ne retourne plus dans l'assertion de DRawItem.