begin process at 2012 05 29 12:42:04
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

Modifier les propriétés des controles boutons (image, texte, couleur, ...)


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Modifier les propriétés des controles boutons (image, texte, couleur, ...)

vendredi 5 mai 2006 à 11:38:06 | Modifier les propriétés des controles boutons (image, texte, couleur, ...)

skirby

Bonjour tout le monde,

J'aurais voulu savoir si il était possible de créer des boutons sur lesquels on pourrait :
- afficher une icone (depuis un fichier .ico)
- afficher un texte sous l'icone
- modifier la couleur de fond du bouton

le tout sans utiliser BS_OWNERDRAW

Je vais me faire fusiller mais sous VB ou Delphi c'est possible directement depuis l'IDE.
J'imagine que cela doit être possible en appelant quelques API de Windows non ?

Voici ce que j'arrive à faire pour le moment:
- je créer ma boite de dialogue depuis ResED, je place un bouton de style icone et j'ajoute mon icone dans les ressources
- depuis mon code, j'arrive à lui affecter mon icone (LoadIcon)

Mon problème et que je n'arrive pas à changer la couleur de fond du bouton.
J'ai cru comprendre que ce n'était pas possible sans gérer complètement le bouton soit même.
Est-ce vrai ?

Sinon j'ai essayé de m'inspirer de la source suivante:
http://www.cppfrance.com/codes/COULEURS-TRANSPARENCE-CONTROLES-API_27889.aspx

J'arrive à changer la couleur et mettre un texte sur mon bouton mais je n'arrive pas à ajouter mon icone.

Merci d'avance pour vos réponses.

samedi 6 mai 2006 à 23:31:21 | Re : Modifier les propriétés des controles boutons (image, texte, couleur, ...)

Gendal67

bonsoir,

il faut traiter le message WM_CTLCOLORBTN et retourner un (long) HBRUSH.
exemple :


// WinProc

case WM_CTLCOLORBTN:

   return (long) (HBRUSH) GetStockObject(BLACK_BRUSH);
 break;


Et voila

dimanche 7 mai 2006 à 04:21:55 | Re : Modifier les propriétés des controles boutons (image, texte, couleur, ...)

racpp

Administrateur CodeS-SourceS
Réponse acceptée !
Salut, Gendal67 >> A ma connaissance, le message WM_CTLCOLORBTN ne permet pas de changer la couleur de fond d'un bouton. Si c'était possible je l'aurais utilisé dans mon code source cité par l'auteur de cette question. Tu as déjà utilisé ce message? Et ça a marché? skirby >> Un bouton n'est pas comme les autres controles. Son apparence dépend de son état: enfoncé, relaché, ayant ou non le focus etc. Pour faire ce qu'on veut de notre bouton, il faut obligatoirement qu'il soit de type BS_OWNERDRAW. Ainsi, on peut le personnaliser comme on veut. Pour charger une icone à partir d'un fichier on utilise la fonction LoadImage() comme ceci per exemple: HICON icone=(HICON)LoadImage(0,"monicone.ico",IMAGE_ICON,16,16,LR_LOADFROMFILE); Pour afficher cette icone quelque part sur le bouton, on utilise la fonction DrawIcon() pendant le traitement du message WM_DRAWITEM comme ceci: ExtTextOut(lpds->hDC.....//Cette fonction efface le fond et écrit du texte DrawIcon(lpds->hDC,x,y,icone);// x et y indiquent la position de l'icone. Ainsi, l'icone sera placée là où on veut: sous le texte, en dessus, à droite, à gauche etc. Il est vrai qu'avec VB ou Delphi c'esp plus facile, mais grâce aux API on peut faire beaucoup plus car on maitrise totalement l'apparence et le comportement de notre bouton.
dimanche 7 mai 2006 à 11:01:21 | Re : Modifier les propriétés des controles boutons (image, texte, couleur, ...)

skirby

Salut racpp,

merci de ta réponse, je vais essayer ça de suite.
mardi 9 mai 2006 à 12:34:44 | Re : Modifier les propriétés des controles boutons (image, texte, couleur, ...)

skirby

C'est encore moi.
J'ai suivi tes explications racpp et ça fonctionne très bien (j'ai un bouton de couleur avec une icône).
Le seul truc qui ne va pas c'est que je n'arrive pas à avoir l'effet "bouton appuyé"
En fait, l'icône reste en position 0,0 (position donnée dans la fonction DrawIcon)

Comment faire pour que mon image donne la sensation de s'enfoncer quand on appui sur le bouton ?

Merci d'avance.

mardi 9 mai 2006 à 13:48:59 | Re : Modifier les propriétés des controles boutons (image, texte, couleur, ...)

Gendal67

case WM_DRAWITEM:

 DRAWITEMSTRUCT* pdis = (LPDRAWITEMSTRUCT) lParam;

 if(pdis->itemState & ODS_SELECTED)
  InvertRect(pdis->hDC, &pdis->rcItem);

return 0;



Et voila, tu obtiens bien un effet de pression de boutton...si tu veux quelque chose de +complexe, rajoute des commandes autre que InvertRect  

mardi 9 mai 2006 à 15:04:42 | Re : Modifier les propriétés des controles boutons (image, texte, couleur, ...)

skirby

Salut Gendal67,

Ce n'est pas tout à fait ça que je voulais.
InvertRect fait un NOT logique sur la couleur de chaque pixel.

J'aurais aimé avoir un bouton avec une image qui s'enfonce quand on clique sur le bouton tout simplement.
En fait c'est le mode de fonctionnement normal quand le bouton n'utilise pas le style BS_OWNERDRAW

Une idée ?
mardi 9 mai 2006 à 19:25:16 | Re : Modifier les propriétés des controles boutons (image, texte, couleur, ...)

Gendal67

Oui oui ne t'inquiète pas j'avais compris
Je pensais juste que tu ne savais pas où mettre le code correspondant, dans quel cas je t'ai répondu en disant : "à la place du InvertRect".

Pour ton problême, je te conseille carrément de dessinner son apparence "normale de bouton enfoncé". Essaie voir de mettre une ligne en pointillée pour montrer que le bouton a le focus et une ligne noire tout autour ombrée en haut et sur le coté gauche.

J'imagine que je suis très clair -_-" ....en fait j'ai testé la "tête" qu'avait un bouton lorsqu'on cliquait dessus (sans relacher la souris pour avoir le temps de voir ).

Donc voila ce que personnellement j'écrirais en code :

case WM_DRAWITEMSTRUCT:
  
  DRAWITEMSTRUCT* pdis = (LPDRAWITEMSTRUCT) lParam;
  int cx, cy;

  cx = pdis->rcItem.right - pdis->rcItem.left;
  cy = pdis->rcItem.bottom - pdis->rcItem.top;

  HPEN hPen, hOld;


  if(pdis->itemState & ODS_SELECTED) {
    
    hPen = CreatePen(PS_SOLID, 3, RGB(128,128,128));
    hOld = SelectObject(pdis->hDC, hPen);
    
    MoveToEx(pdis->hDC, 0, 0, NULL);
    LineTo(pdis->hDC, cx - 1, 0);

    MoveToEx(pdis->hDC, 0, 0, NULL);
    LineTo(pdis->hDC, 0, cy - 1); 

    SelectObject(pdis->hDC, hOld);
    DeleteObject(hPen);
   }

  if(pdis->itemState & ODS_FOCUS) {
    
   FrameRect(pdis->hDC, &pdis->rcItem, (HBRUSH) GetStockObject(BLACK_BRUSH));

    pdis->rcItem.left += cx / 16;
    pdis->rcItem.top += cx / 16;
    pdis->rcItem.right -= cx / 16;
    pdis->rcItem.bottom -= cx / 16;

    DrawFocusRect(pdis->hDC, &pdis->rcItem);
   }


 return 0;

Essayez peut-être ceci et dites moi si cela correspond à ce que vous cherchiez.
Par contre, il faut peut-être ajuster les positions en x et y dans MoveToEx....tout dépend de comment Windows dessine. Là je suis parti du principe qu'avec le pinceau de 3 pixels d'épaisseur, le pixel le plus proche du coté sera dessiné aux positions indiquées par cette fonction.

Enfin voila, tenez moi au courant



Cette discussion est classée dans : arrive, texte, possible, icone, couleur


Répondre à ce message

Sujets en rapport avec ce message

editbox et couleur [ par Anacr0x ] Salut !J'ai deux ou trois ptite question a posé :a votre avis, est il possible d'avoir plusieur couleur de texte dans une editbox (ce qui m'étonneré) Couleur dans "EDIT" [ par Ifrit235 ] Salut a tous, je suis en train de programmer un éditeur de texte et j'aimerai savoir comment changer la couleur du texte (ou une partie) dans un "edit static [ par leprov ] salut a tous.bon alors voila. je fais une fenetre, et je voudrais placer quelques statiques. la j'ai plusieurs questions. la premiere étant comment fa COuleur dans un textedit [ par tetedemul ] Bonjour, je développe un ide pour l'asm, et je souhaite faire une coloration syntaxique.Je sais comment la faire (traitement ok), je l'ai réalisé sous du texte en couleur avec C [ par Amine_s11 ] salut tt le monde comment peut-on modifier la couleur du texte affiché en C quel bibliotheque utiliser et quel fonctions. peut on ainsi modifier la Récupérer le texte d'une icone d'une ListView [ par MorbhAck ] Bonsoir a tous !J'aurais un petite question ...Je voudrais récupérer le nom d'une icone d'une listView.J'ai une piste mais je block un peu :shttp://ms changement de couleur du texte uniquement pour rich edit?? [ par youpiyoyo ] j'ai réaliser un sous classement pour une edit control et WM_MOUSEMOVE egalement préparer pour celle-cij'essaye de changer la couleur du texte selecti texte opengl qui change de couleur [ par mondrone ] J'ai un programme OpenGL (+ Glut sous DevCpp) qui suivant certaines touches doit afficher des phrases prédéfinies à l'écran avec glutBitmapCharacter. STATIC, SetWindowText et icone[Dev-C++] [ par mastermatt29 ] Salut tout le monde !! Il se trouve que j'ai un problème avec mon code ! Premierement j'ai un static, déclaré avec CreateWindowEx(...). Je lui ai don [MFC] Couleur d'un texte [ par ekinox17 ] C'est simple, j'aimerai savoir comment changer la couleur d'un texte : je pensai pouvoir le faire avec un CFont : mais nan et je sais pas comment fair


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,170 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales