Tunning

couranrjet Messages postés 12 Date d'inscription mardi 14 février 2006 Statut Membre Dernière intervention 23 août 2006 - 17 août 2006 à 11:42
couranrjet Messages postés 12 Date d'inscription mardi 14 février 2006 Statut Membre Dernière intervention 23 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 

19 réponses

racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
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.
0
couranrjet Messages postés 12 Date d'inscription mardi 14 février 2006 Statut Membre Dernière intervention 23 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
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
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().
0
couranrjet Messages postés 12 Date d'inscription mardi 14 février 2006 Statut Membre Dernière intervention 23 août 2006
18 août 2006 à 01:16
Racpp, merci pour ton aide.

Mais je patine.

IDC_ELLIPSE identifie le bouton sur lequel je travaille.

Voici un bout de code( en gras ce que j'ai rajouté) :

...

#define IDC_ELLIPSE       
           
    1000   
HWND hwnd;

CreateWindow("button"," ",BS_OWNERDRAW,112,40, 18,18, hwnd,       

                                  
(HMENU)111,GetModuleHandle(NULL),NULL);

// Next default values for new objects

#ifdef APSTUDIO_INVOKED

..

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.

...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mogwai93 Messages postés 362 Date d'inscription mardi 31 décembre 2002 Statut Membre Dernière intervention 4 novembre 2023
18 août 2006 à 10:09
HWND hCtrl;

HRGN MyRgn;

       

hCtrl = CreateWindowEx(0, "button", "test",

        WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN, 100, 100, 100, 100,

        hwnd, (HMENU)1000, GetModuleHandle(NULL), NULL);

  

MyRgn=CreateEllipticRgn(0, 0, 100, 100);

SetWindowRgn(hCtrl, MyRgn, TRUE);


et là tu as un bouton en forme de cercle !
0
couranrjet Messages postés 12 Date d'inscription mardi 14 février 2006 Statut Membre Dernière intervention 23 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 

...
0
mogwai93 Messages postés 362 Date d'inscription mardi 31 décembre 2002 Statut Membre Dernière intervention 4 novembre 2023
18 août 2006 à 11:24
en MFC, je ne sais plus (ca fait trop longtemps que je ne touche plus aux MFC.....)


en API, tu peux le mettre ici :

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

{

    HWND hCtrl;

    HRGN MyRgn;

       

    switch
(message)                 
/* handle the messages */

    {

        case WM_CREATE :

                 // mettre le code ici

                break;

...

   }

}
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
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().
0
couranrjet Messages postés 12 Date d'inscription mardi 14 février 2006 Statut Membre Dernière intervention 23 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...


Là je replonge dans le Mordor des MFC.


Couranrjet

 

...
0
couranrjet Messages postés 12 Date d'inscription mardi 14 février 2006 Statut Membre Dernière intervention 23 août 2006
21 août 2006 à 13:54
Ok avec HWND *hwnd;

GetDlgItem(IDC_BUTTON1, hwnd);

...

...
0
couranrjet Messages postés 12 Date d'inscription mardi 14 février 2006 Statut Membre Dernière intervention 23 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
0
couranrjet Messages postés 12 Date d'inscription mardi 14 février 2006 Statut Membre Dernière intervention 23 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 

...
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
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

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
couranrjet Messages postés 12 Date d'inscription mardi 14 février 2006 Statut Membre Dernière intervention 23 août 2006
22 août 2006 à 00:09
Voici le bout de code que j'essaie de faire fonctionner pour le moment:
    HWND hCtrl;

    HRGN MyRgn;  

    MyRgn=CreateEllipticRgn(0, 0, 100, 100);

    ::SetWindowRgn(m_button.m_hwnd,MyRgn, false);

Mais  error C2039: 'm_hwnd' : is not a member of 'CButton'

Que faire? QQ a une idée? Bon ben la nuit porte conseille il paraît..

A demain.
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
22 août 2006 à 04:36
m_hWnd pas m_hwnd

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
couranrjet Messages postés 12 Date d'inscription mardi 14 février 2006 Statut Membre Dernière intervention 23 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

...
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
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

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
couranrjet Messages postés 12 Date d'inscription mardi 14 février 2006 Statut Membre Dernière intervention 23 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);

Donc si qq y voit clair, merci pour son aide

 

...
0
couranrjet Messages postés 12 Date d'inscription mardi 14 février 2006 Statut Membre Dernière intervention 23 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.

...
0
Rejoignez-nous