Tunning

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

Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
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.
Messages postés
12
Date d'inscription
mardi 14 février 2006
Statut
Membre
Dernière intervention
23 août 2006

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
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
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().
Messages postés
12
Date d'inscription
mardi 14 février 2006
Statut
Membre
Dernière intervention
23 août 2006

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.

...
Messages postés
361
Date d'inscription
mardi 31 décembre 2002
Statut
Membre
Dernière intervention
19 mars 2015

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

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 

...
Messages postés
361
Date d'inscription
mardi 31 décembre 2002
Statut
Membre
Dernière intervention
19 mars 2015

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;

...

   }

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

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

 

...
Messages postés
12
Date d'inscription
mardi 14 février 2006
Statut
Membre
Dernière intervention
23 août 2006

Ok avec HWND *hwnd;

GetDlgItem(IDC_BUTTON1, hwnd);

...

...
Messages postés
12
Date d'inscription
mardi 14 février 2006
Statut
Membre
Dernière intervention
23 août 2006

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

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 

...
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
22 août 2010
10
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
Messages postés
12
Date d'inscription
mardi 14 février 2006
Statut
Membre
Dernière intervention
23 août 2006

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

_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
12
Date d'inscription
mardi 14 février 2006
Statut
Membre
Dernière intervention
23 août 2006

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

...
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
22 août 2010
10
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
Messages postés
12
Date d'inscription
mardi 14 février 2006
Statut
Membre
Dernière intervention
23 août 2006

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

 

...
Messages postés
12
Date d'inscription
mardi 14 février 2006
Statut
Membre
Dernière intervention
23 août 2006

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.

...