[Win32] Changer la couleur d'une toolbar

Changer la couleur d'une toolbar [Win32] - C++ - Programmation

Marsh Posté le 20-02-2007 à 18:55:01    

Hello,
 
Je suis entrain de développer une interface graphique en C++/Win32. J'arrive à créer une toolbar, avec les boutons que je veux et les commandes associées, ca marche bien.
 
Le problème, c'est qu'elle est horriblement laide :o  
 
Avant j'avais un problème de boutons en 3d, que j'ai corrigé en ajoutant un flag a CreateWindowEx, mais maintenant le background de la toolbar est blanc, et je n'arrive pas à le changer. Inutile de dire que c'est laid de chez laid :o
 
Voilà le code :
 

Code :
  1. HWND hTool = CreateWindowEx(0, TOOLBARCLASSNAME, NULL, WS_CHILD | WS_VISIBLE | TBSTYLE_FLAT , 0, 0, 0, 0,
  2.                    _hWnd, (HMENU)IDC_TOOL, GetModuleHandle(NULL), NULL);
  3. SendMessage(hTool, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);
  4. TBBUTTON tbb[4];
  5. TBADDBITMAP tbab;
  6. tbab.hInst = hInst;
  7. tbab.nID = IDB_TOOLBAR;
  8. SendMessage(hTool, TB_ADDBITMAP, sizeof(tbb)/sizeof(TBBUTTON), (LPARAM)&tbab);
  9. ZeroMemory(tbb, sizeof(tbb));
  10. tbb[0].iBitmap = 0;
  11. tbb[0].fsState = TBSTATE_ENABLED;
  12. tbb[0].fsStyle = TBSTYLE_BUTTON;
  13. tbb[0].idCommand = CMD_OPEN;
  14. tbb[1].iBitmap = 1;
  15. tbb[1].fsState = TBSTATE_ENABLED;
  16. tbb[1].fsStyle = TBSTYLE_BUTTON;
  17. tbb[1].idCommand = CMD_PLAY;
  18. tbb[2].iBitmap = 2;
  19. tbb[2].fsState = TBSTATE_ENABLED;
  20. tbb[2].fsStyle = TBSTYLE_BUTTON;
  21. tbb[2].idCommand = CMD_PAUSE;
  22. tbb[3].iBitmap = 3;
  23. tbb[3].fsState = TBSTATE_ENABLED;
  24. tbb[3].fsStyle = TBSTYLE_BUTTON;
  25. tbb[3].idCommand = CMD_STOP;
  26. SendMessage(hTool, TB_ADDBUTTONS, sizeof(tbb)/sizeof(TBBUTTON), (LPARAM)&tbb);


 
 
J'ai cherché, rien trouvé, Win32 c'est pas bien, et voilà :D
 
Si quelqu'un à une piste...


Message édité par did-54 le 21-02-2007 à 11:03:36
Reply

Marsh Posté le 20-02-2007 à 18:55:01   

Reply

Marsh Posté le 21-02-2007 à 15:29:54    

A l'aaaaaide :(

Reply

Marsh Posté le 21-02-2007 à 16:31:11    

tu créé ta toolbar avec le style TBSTYLE_CUSTOMERASE ce qui crééra une toolbar qui génerera le message NM_CUSTOMDRAW (généré par le message WM_ERASEBKGND). dans ta boucle de messages, tu traites ensuite ce message NM_CUSTOMDRAW pour récupérer la structure NMTBCUSTOMDRAW contenu dans lParam. et tu modifies cette structure en conséquence.
 
 
http://msdn.microsoft.com/library/ [...] omdraw.asp
http://msdn.microsoft.com/library/ [...] oolbar.asp
http://msdn.microsoft.com/library/ [...] omdraw.asp

Reply

Marsh Posté le 21-02-2007 à 17:09:42    

ouah, y'a pas plus compliqué ? :D  
merci je vais jetter un oeil la dedans.

Reply

Marsh Posté le 21-02-2007 à 17:13:08    

did-54 a écrit :

ouah, y'a pas plus compliqué ? :D


c'est du Win32 hein :o

Reply

Marsh Posté le 21-02-2007 à 17:46:59    

bon, je débute en win32, donc pataper :o
 
J'ai réussi à pondre ca, dans ma boucle de traitement des messages.
 

Code :
  1. case WM_NOTIFY:
  2.    cout << "WM_NOTIFY" << endl;
  3.    lpNMCustomDraw = (LPNMCUSTOMDRAW) lParam;
  4.    switch(lpNMCustomDraw->hdr.code)
  5.    {
  6.    case NM_CUSTOMDRAW:
  7. cout << "NM_CUSTOMDRAW" << endl;
  8. lpNMTBCustomDraw = (LPNMTBCUSTOMDRAW) lpNMCustomDraw;
  9. lpNMTBCustomDraw->clrBtnFace = RGB(80,0,0);
  10. cout << lpNMTBCustomDraw->clrBtnFace << endl;
  11. break;
  12.    }
  13. break;


 
Ca m'affiche bien WM_NOTIFY puis NM_CUSTOMDRAW quand je charge l'appli, ou quand je clique sur un bouton par exemple. Le seule problème, c'est que la face du bouton reste grise. (le dernier cout m'affiche aussi 80).
 
J'ai bien mis le flag TBSTYLE_CUSTOMERASE dans la creation de la toolbar.
 
PS: tiens je viens de voir que j'ai traité ca a partir de WM_NOTIFY et non WM_ERASEBKGND ...


Message édité par did-54 le 21-02-2007 à 17:50:55
Reply

Marsh Posté le 21-02-2007 à 20:52:54    

up :(
Pas moyen de changer quoi que ce soit de propriété de cette foutu bar :(

Reply

Marsh Posté le 22-02-2007 à 12:15:46    

Hey mais revenez ! :D
 
 

Reply

Marsh Posté le 23-02-2007 à 13:23:23    

up mal déguisé !

Reply

Marsh Posté le 23-02-2007 à 13:33:42    

Depuis 3 jours, tu n'as pas avancé ? Tu n'as fait aucune recherche, tu ne t'es pas documenté ? T'as fait aucun test ?
Si tu ne te bouges pas le cul, on ne va pas se le bouger pour toi.
Harkonnen t'a filé une piste, à toi d'approfondir. Si quelque chose te parait obscur, pose des questions précises. Mais ça sert à rien de faire des "up" en disant que ça marche pas.
 
Je ne connais pas particulièrement ce controle mais voici peut être une autre piste. Tout élément créé avec CreateWindow(Ex) possède un HWND qui permet de récupérer un HDC. Avec ça, tu peux dessiner ce que tu veux sur l'élément.

Reply

Marsh Posté le 23-02-2007 à 13:33:42   

Reply

Marsh Posté le 23-02-2007 à 15:44:15    

Je comprends, mais je ne trouve pas d'article très détaillé sur le sujet, aucun cours. Il ya des tutoriaux, mais ils expliquent comment faire sans montrer la finalité de chaque action. Alors je veux bien me bouger le cul, et évidemment que je fais des tests, mais comme je n'ai même pas les bases en Win32, ben c'est la guerre...
 
Je vais regarder du coté de ta piste et je vous tiens au courant.


Message édité par did-54 le 23-02-2007 à 15:44:59
Reply

Marsh Posté le 28-02-2007 à 18:03:23    

Je reviens vers vous, je n'ai rien réussi à faire.
Je sais que je suis dans le bon case du traitement des messages, j'arrive éventuellement à récupérer le HWND puis le HDC de ma toolBar mais je n'arrive pas à dessiner dessus.
 

Code :
  1. case NM_CUSTOMDRAW:
  2.   cout << "NM_CUSTOMDRAW" << endl;
  3.   HWND hTool2 = GetDlgItem(hWnd, IDB_TOOLBAR);
  4.   hdcToolbar = BeginPaint(hTool2,&psToolbar);
  5.   HBRUSH hbr = CreateSolidBrush(RGB(0,0,0));
  6.   RECT rc;
  7.   rc.top = 0;
  8.   rc.left = 0;
  9.   rc.bottom = 20;
  10.   rc.right = 1000;
  11.   FillRect(hdcToolbar,&rc,hbr);
  12.   EndPaint(hTool2,&psToolbar);


 
Je commence à désespérer. Je n'arrive meme pas à trouver d'autres débuts de piste en fait. Donc je suis un peu tout con parceque je sais pas dans quelle direction chercher.
 


Message édité par did-54 le 28-02-2007 à 18:04:45
Reply

Marsh Posté le 03-03-2007 à 02:42:22    

Ca a déjà été répondu x fois sur news://fr.comp.os.ms-windows.programmation
Il suffit de savoir lire...

Reply

Marsh Posté le 03-03-2007 à 11:47:25    

Je ne connais pas les newsgroups...
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed