Salut tatous :)
Voila, je voudrais savoir s'il est possible de mette mon texte static en vert et en gras, si oui, cé comment ky fo faire :).
Merci
Version imprimable
Salut tatous :)
Voila, je voudrais savoir s'il est possible de mette mon texte static en vert et en gras, si oui, cé comment ky fo faire :).
Merci
Il faut te créer une font que tu appliques à ton static.
Dans ton .h de ta classe
Code:
1
2 CStatic m_mySt ;
Dans le .cpp de ta classe
Pour la couleur, cherche un peu dans les caractéristiques de LOG_FONT.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 ... //-------------------------------------------------------------- // dans doDataExchange DDX_Control(pDX,IDC_ST_MY_ST, m_mySt) ; .... //-------------------------------------------------------------- // dans la fonction d'initialisation de ta classe/boîte ... ... LOGFONT LogFont_staticTxt ; // récupération de la police en cours de ton static (m_mySt.GetFont())->GetLogFont(&logFont_staticTxt); // modification de la police LogFont_staticTxt.lfWeight=FW_DEMIBOLD; // <-- là c'est le gras LogFont_staticTxt.lfHeight = 30 ; // <-- là c'est la taille sprintf(LogFont_staticTxt.lfFaceName,"Arial") ; // <-- si tu veux changer de police // création d'une police qui contiendra toutes les caractéristiques désirées CFont* pFontNew=new CFont; pFontNew->CreateFontIndirect(&LogFont_staticTxt); // Mise à jour de ton static avec ta nouvelle police m_mySt.SetFont(pFontNew); ...
:D
Alice
---------------------------------------------------------------
A coeur vaillant, rien d'impossible
cf. Chevalier Bayard
Non pour la couleur il faut définir un handler sur WM_CTLCOLOR :
http://c.developpez.com/faq/vc/?page...#CEditCtlColor
Merci pour cette réponse rapide et précise :ave:
Mais j'ai un problème à la compilation:
DDX_Control(pDX,IDC_STATIC, m_mySt) ;
sur cette ligne, le compilo me dit :
error C2065: 'm_mySt' : undeclared identifier
Je vois pourtant bien cette viriable associée a mon static dans le classWizard :koi: bizard bizard ....
Ce que tu me montre est pour un Edit, ca marche aussi pour du static ?Citation:
Envoyé par BertrandA
oui c'est valable pour tous les controles.
Alors voila,
En suivant ce qui est dit dans le lien, en supprimant les lignes permettant de mettre de la couleur en cas de "READONLY", j'obtient ce code:
Et le compilo me dit sur cette ligne:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 // CMyEdit CMyEdit::CMyEdit() { CBrush* m_pBrush = NULL; } CMyEdit::~CMyEdit() { delete m_pBrush; } BEGIN_MESSAGE_MAP(CMyEdit, CEdit) //{{AFX_MSG_MAP(CMyEdit) ON_WM_CTLCOLOR_REFLECT() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CMyEdit message handlers HBRUSH CMyEdit::CtlColor(CDC* pDC, UINT nCtlColor) { // TODO: Change any attributes of the DC here m_pBrush = new CBrush(RGB(0,255,0)); pDC->SetBkColor(RGB(0,255,0)); return (HBRUSH)m_pBrush->GetSafeHandle(); // TODO: Return a non-NULL brush if the parent's handler should not be called return NULL; }
ceci:Code:delete m_pBrush;
error C2065: 'm_pBrush' : undeclared identifier
Je me demande alors que m_pBrush est défini juste o dessus dans le constructeur, si le compilo n'est pas un couill** :D
La du coup je n'ai plus d'idée pour avancer .... :help:
re,
tu declares dans ton .h CBrush* m_pBrushReadOnlyCitation:
Envoyé par FAQ
et dans le constructeur tu ecris :m_pBrushReadOnly=NULL;
c'est tout .
:D
:oops:
Le couill** n'est peut être pas toujours le compilo :roll: :roll:
Cepandant, même si tout passe à la compilation, je vois toujours mes statics s'afficher en noir, alors que j'ai pourtant mis (0.255.0)
Je ne comprend pas pourquoi ..
bon en plus ton code n'est pas correcte :
maintenant afficher pour toi c'est quoi ?:Code:
1
2
3
4
5
6
7
8
9
10
11
12 HBRUSH CMyEdit::CtlColor(CDC* pDC, UINT nCtlColor) { // TODO: Change any attributes of the DC here if(!m_pBrush) m_pBrush = new CBrush(RGB(0,255,0)); pDC->SetBkColor(RGB(0,255,0)); return (HBRUSH)m_pBrush->GetSafeHandle(); // TODO: Return a non-NULL brush if the parent's handler should not be called return NULL; }
couleur d'ecriture du texte ,du fond du texte etc...
la on ne touche qu'au background .
Il faudrait en fait que j'écrive mes statics en vert, gras,
Mais je ne veu pas toucher au backGround.
A mon avis c'est sur cette ligne qu'il faut intervenir:
Mais je ne connais pas la fonction me permettant de modifier la couleur de mes textes statics, pleazz HELP !!Code:pDC->SetBkColor(RGB(0,255,0));
Je vien de tester ceci:
La fonction SetTextColor semble être celle qui m'intéresse, seulement même si ce code passe a la compilation, lors de l'exécution je ne voi aucun changement ....Code:
1
2
3
4
5
6
7
8
9
10
11
12 HBRUSH CMyEdit::CtlColor(CDC* pDC, UINT nCtlColor) { // TODO: Change any attributes of the DC here if(!m_pBrush) m_pBrush = new CBrush(RGB(0,255,0)); pDC->SetTextColor(RGB(0, 255, 0)); return (HBRUSH)m_pBrush->GetSafeHandle(); // TODO: Return a non-NULL brush if the parent's handler should not be called return NULL; }
N'hésitez pas à me corriger si g une erreur dans ce code. Merci
J'ai enfin réussi à mettre mes static en couleur, (ouf ca avance un peu ...)
Le problème c'est que je n'est pas que mes statics en vert mais tous les textes de ma boitie de dialogue, j'ai bien tenter de voir comment remettre une couleur noir a ma combo, ma listBox et mes editBox, mais je ne trouve pas de fonction capables de réaliser ceci.
Un peu d'aide serait la bienvenue, :)
Je croi que je doit reformuler ma demande :wink:
Est-ce qu'il y a un moyen de régler la couleur uniquement pour mes textes Statics, ainsi que la fonte ?
J'ai l'impression qu'il n'y a pas moyen de modifier la couleur d'un seul contrôle....
mais si ,mais si ,
j'ai pas tout relu le post.
pour affecter une fonte a un controle il suffit de faire SetFont .
pour changer les attributs voir faq:
http://c.developpez.com/faq/vc/?page...CustomFontCtrl
Attention je le redis au cas ou l'objet fonte de la faq ne doit etre local à la fonction mais presistant dans la classe...
:D
Il ya une petite chose que je ne comprend pas dans ton lien:
// CFont m_font; // objet local à la classe parent fenetre CDialog,CFormView
Ou faut il que je définisse m_font ?
dans la classe ou est definit ce contrôle (donc sa fenetre parent) ,qui doit etre soit une CDIalog ou une CFormView .
Hello, je me permet d'intervenir ici car ça m'intéresse aussi.
Si pour la fonte en gras je n'ai eu aucun problème en appliquant la FAQ du lien ci-dessus, ça n'est pas le cas pour la couleur.
J'ai pas l'impression qu'on puisse reprendre exactement la même structure.
Moi j'ai fait ça dans InitDialog(), pourquoi ça ne fait rien?
CWnd * pWnd = GetDlgItem(IDC_STATICRED);
CDC* pDC = pWnd->GetDC();
pDC->SetTextColor(RGB(255,0,0));
Hokagge, apparemment t'as réussi, tu peux dire comment?
Merci :D
parce que ça ne fonctionne pas comme ça .Citation:
Envoyé par stof
voir faq:
http://c.developpez.com/faq/vc/?page...#CEditCtlColor
et comme je l'ai dis plus haut l'exemple faq c'est un edit
mais c'est pareil pour les autres controles.
note ces sujets sont expliqués dans mon tuto ...
:D
Ok c'est bon pour la fonte, merci beaucoup,
Mais il me reste toujours mon problème pour la couleur, à savoir que pour l'instant j'ai réussi a modifier la couleur de tous mes textes, mais ce qui m'intéresse c'est de modifier uniquement la couleur de mes static,
Est-ce qu'il ya une possibilité de choisir la couleur que pour un controle, comme cela est fait avec la fonte, avec ceci par exemple:
Code:CWnd* pWnd = GetDlgItem(IDC_STATIC);
Je croi que ce que j'ai fai ne va pas t'intéresser,Citation:
Envoyé par stof
Dans mon appli, maintenant tous mes textes sont en verts :? , et ce n'est pas forcément très zoli, c'est pourquoi j'essaye de trouver un moyen d'appliquer cette couleur uniquement a mes static
Sinon Stof,
Ou as-tu mis le bout de code permettant de modifier la fonte qui est dans la FAQ?
Dans OnIniDialog ?
Dans le handler OnCtlColor() tu disposes d'un pointeur sur le CWnd du contrôle concerné par le message.
Avec le code suivant tu détermines sur quels contrôles opérer un changement de couleur :
Code:
1
2
3
4
5
6 switch (pWnd->GetDlgCtrlID()) { case IDC_LE_STATIC_DE_MES_REVES : ... break; }
recuperez l'exemple du tuto :
http://farscape.developpez.com/Samples/samplesdi.zip
dans la view le premier static est customisé .
la technique mise en place est bien celle du message "reflect" =WM_CTLCOLOR decrite dans la faq.
seulement ici je suis allé plus loin en proposant une classe template unique permettant de faire le travaille une seule fois .
dans l'exemple un edit est customisé et un static.
mieux que ça je ne peux pas . :roll:
Je dois avouer que le code de ton tuto est bien trop évoluer pour moi,
Je suis plus penché C, alors que je n'ai que de très petites bases de C++, imagine la galère :scarymov:,
Sinon ca y est enfin ca marche pour la couleur :yaisse2: !!!
J'ai l'impression d'avoir fait quelquechose d'un peu différent de ce qu'y était expliqué dans la FAQ (cf http://c.developpez.com/faq/vc/?page...#CEditCtlColor)
C'est à dire qu'au lieu d'intercepter le message "reflect" =WM_CTLCOLOR dans une classe CEdit, j'ai tout simplement intercepté le message WM_CTCOLOR dans la fonction sans passer par cette CEdit:
Puis avec le code fourni par BertrandA j'ai fais le traitement de la couleur QUE pour mes statics.Code:HBRUSH CAlturionDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
Voila ca y est enfin, je pensais bien que je n'allais pas en voir le bout !!! :ccool:
Juste une petite chose encore :) , je voudrais savoir ou mettre ce code http://c.developpez.com/faq/vc/?page=Fontes#SetCustomFontCtrl, pour pouvoir modifier la fonte, je le mets dans mon OnIniDialog ?
Oui, je l'avais mis là; dommage que j'ai réussi si facilement la partir qui ne m'intéressait pas.Citation:
Envoyé par Hokagge
Comme je reviens de manger, j'ai pas avancé sur les couleurs, mais avec l'exemple de Farscape ou la solution que tu proposes, je vais bien y arriver à mon tour!
EDIT : j'ai essayé l'exemple de Farscape...ça marche mais c'est de l'artillerie lourde pour changer juste la couleur d'un malheureux edit; moyennant l'inclusion donc du nécessaire "TplCtrl.h", ça y est... :?
Parce que tu melanges tout :Citation:
Envoyé par Hokagge
il deux techniques pour customiser les couleurs des controles:
1) prendre la main sur la fonction onCtlColor au niveau de la dialogue.
ce qui permet un traitement globale pour tous les controles
mais oblige a mettre sa logique de couleur sur la fenetre contenant les controles ,ce qui n'est pas forcemment pratique.
2) faire gerer la couleur par le controle lui meme par le message reflect.
et quand on va plus loin ,il est agreable d'avoir une classe finalisée qui
fait le boulot une fois pour toute .
les deux techniques sont expliquées dans la faq et dans le tuto qui les mets en oeuvre dans la view et dans la dialogue.
En effet j'ai un peu tout mélangé,
Merci pour ces explications, maintenant j'ai compris le truc :)
Me voici a nouveau face à un problème, concernant la fonte en gras:
En applicant à la lettre le code de la FAQ, (exepté l' IDC du Static), je m'apercoi que rien ne se passe :? :?
Alors voila, vu que je développe sur PDA, est-ce possible de modifier cette fonte sur ce type de support ?
Si oui, y a t'il besoin de certains paramètres à cocher dans les propriété de mes statics ?
Ou alors ya t-il un problème de mettre le code de la FAQ dans mon OnInitDialog() ( ce qui métonnerai vu qu'apperement c'est ce que d'autres ont fait ex:Stof et ca à l'air de marcher).
T'as vraiment pas de chance alors, je sais pas sur PDA mais dans le OnInitDialog si je fais :Citation:
Envoyé par Hokagge
ça marche.Code:
1
2
3
4
5
6
7
8
9
10
11
12 CWnd *pWnd = GetDlgItem(IDC_MONTEXTSTATIC); CFont* pFont = pWnd->GetFont(); CFont m_font; if(pFont!=NULL) { LOGFONT lf; pFont->GetLogFont(&lf); lf.lfWeight=FW_BOLD; //mettre en gras m_font.DeleteObject(); // destruction GDI de l'ancien objet eventuellement m_font.CreateFontIndirect(&lf); // creation de la fonte d'apres la LOGFONT } pWnd->SetFont(&m_font); // affectation de la nouvelle fonte.
En revanche, j'ai moi aussi 2 autres problèmes :
***le texte en gras apparaît comme dédoublé et il n'apparaît correctement que si la fenêtre est redessinée (après une occlusion par exemple).*
Comment faire redessiner cette fenêtre dès le départ (sachant que OnPaint ne fait rien ne plus).
***Pire, j'ai voulu faire la même chose avec des SliderCtrl; là, j'ai abusé car les variables de contrôle normalement sont pas faites pour être statiques, mais ça marche bien si je rétrécit la fenêtre et que je la ré-ouvre (ici, même le redessin après une occlusion ne suffit pas).
Bon eh bien même avec ton code, le résultat est le même,
Sinon je suis désolé, mais les problèmes que tu rencontres sont trop compliqués pour moi,
Sorry :oops: :oops:
Ah, là là, on est bien malheureux :cry:
Super FARSCAPE à la rescousse? :wink:
J'ai déjà rencontré des problèmes sur PDA moi aussi.
Je crois que je ne parvenais pas effectivement à modifier la fonte des static texts. Je n'avais pas cherché plus loin et remplacé les static par des CEdit read only.
Pas ce qu'il faut sous la main et pas le temps de chercher désolé.
Regarder éventuellement dans la KB Microsoft.
pour ton pb on est d'accord que ta variable m_font est declarée dans ta classe et non dans ta fonction ?Citation:
Envoyé par stof
sinon quand la variable sort de sa portée la fonte est detruite et l'objet gdi avec, et donc le controle a un probleme ...
par contre pour ton 2 pb j'ai rien compris :lol:
:D
j'ai fais un essai rapide avec embedded Vc++ .
rien que dans l'emulateur win CE la fonte ne change pas ...
:D
Citation:
Envoyé par farscape
OK pour le problème de la fonte en gras (effectivement, ma variable était locale à la fonction).
Pour le deuxième problème, je ré-explique :
j'ai attaché à une scrollbar une variable de classe CNewStatic exactement comme pour les textes de ma boîte de dialogue.
Je procède pareil que les textes dans OnInitDialog pour attribuer la couleur (un seul paramètre, le deuxième ne sert à rien dans ce cas, les valeurs par défaut suffisent) :
m_staticSlider.SetBkColor(RGB(255,255,180));
où RGB(255,255,180) correspond à la couleur jaune de fond de ma boîte de dialogue.
Bien, alors le souci, c'est que quand j'ouvre ma boîte, la scrollbar est entourée de blanc au lieu d'être entourée de jaune, et que pour que ça soit bien entouré de jaune, je dois sois faire passer une autre page en avant-plan avant de revenir à mon logiciel, soit cacher la boîte par le signe "-" et la réouvrir .
Quand elle se redessine comme ça, je retrouve l'apparence souhaitée, (mais pas quand la partie en cause disparaît de l'écran quand on déplace la boîte hors de l'écran, et réapparaît quand on redéplace la boîte dans la zone visible de l'écran, ce qui est curieux puisque cette opération redessine aussi la boîte).
Et donc, puisque c'est une histoire de dessin, je pensait à OnPaint, mais non!
:?:
Quand je fais un clic droit sur ma boite de dialogue, propriété, il y a un bouton font, et je m'apercoi que même la dedans j'arrive pas à mettre di gras pour tte ma boite de dialogue. (dailleur il n'est même pas proposé :()Citation:
Envoyé par farscape
Citation:
Envoyé par stof
Toujours pas?