Slt,
Je cherche un tuto sur l'utilisation des tab control
jtrouve pas !
merci bien
Version imprimable
Slt,
Je cherche un tuto sur l'utilisation des tab control
jtrouve pas !
merci bien
farscape a fait un projet se basant sur les CTabCtrl qui t'apprendra surement pas mal de choses
http://farscape.developpez.com/Samples/CxTabCtrl.zip
il me l'a filé celui la deja, mais c'est en utilisant une classe speciale, non ?
moi jvoudrai les utiliser simplement
c'est un paradoxe ....Citation:
Envoyé par firejocker
Justement le CTabCtrl est tout sauf simple à utiliser.
Cette classe permet justement de faire les choses simplement....
:D
lol, donc si je piges bien....
les tabctrl, c'est la misere à utiliser et ta classe le facilite
elle est libre pour toute utilisation cte classe ?
dans le code, je vois que pour creer les 2 onglets, tu fais :
que fais cette ligne :Code:
1
2
3
4
5
6
7
8
9 m_pTabInformation = new CTabInformation; m_pTabInformation->Create(CTabInformation::IDD, &m_tabctrl); m_tabctrl.AddTab(m_pTabInformation, "Information", 0); m_pTabInformation->m_pTab = &m_tabctrl; m_pTabMoreInformation = new CTabMoreInformation; m_pTabMoreInformation->Create(CTabMoreInformation::IDD, &m_tabctrl); m_tabctrl.AddTab(m_pTabMoreInformation, "More Information", 1);
qui n'apparait que dans l e premier bloc ?Code:m_pTabInformation->m_pTab = &m_tabctrl;
oui ,et je viens de remettre a jour le projet.
:D
jpiges pas pourquoi le gris de la fiche inséré dans le tabctrl est différent du reste de l'appli ?
j'ai tenté de faire ce que tu as fais avec les couleurs, ca donne rien
mon code :
DlValidationPage1 est la classe de la fiche que je veux insererCode:
1
2
3
4
5
6 DlValidationPage1* Page1 = new DlValidationPage1; Page1->Create(DlValidationPage1::IDD, &TabCtrl); TabCtrl.AddTab(Page1, "Information", 0); TabCtrl.SetSelectedColor(RGB(0, 0, 255)); TabCtrl.SetMouseOverColor(RGB(255, 0, 0));
TabCtrl est la variable associé au tab control
tu vois mon erreur la dedans ?
je vois .... c'est le tab control qui n'a pas le même gris que la fiche
comment puis je y remedier ?
je me suis planté dans la MAJ ,j'avais ecrasé mes modifications... :aie:Citation:
Envoyé par firejocker
maintenant c'est ok:
ça permet d'avoir un pointeur directe sur le tabctrl dans la dialogue...Citation:
Envoyé par firejocker
voir la fonction:
pour la couleur ça ne passe pas inapercu lol;Code:
1
2 void CTabInformation::OnUpdateId()
voir les modifications apportées a la dialogue :
application direct de la faq....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
34
35
36
37
38
39
40
41
42
43
44
45
46 void CTabInformation::SetDialogBkColor(COLORREF clrCtlBk /*= RGB(192, 192, 192)*/, COLORREF clrCtlText /*= RGB(0, 0, 0) */) { //m_HbrClrCtlBk est à null dans le constructeur if(m_HbrClrCtlBk) ::DeleteObject(m_HbrClrCtlBk); m_HbrClrCtlBk = ::CreateSolidBrush(clrCtlBk); m_ClrCtlText = clrCtlText; /* COLORREF */m_ClrCtlBk= clrCtlBk; } HBRUSH CTabInformation::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); // TODO: Change any attributes of the DC here switch(nCtlColor) { // Intercepte le message pour la dialogue et les statics. case CTLCOLOR_DLG: case CTLCOLOR_STATIC : // Fixe la couleur decriture du texte pDC->SetTextColor(m_ClrCtlText); // enventuellement suivant les cas // pDC->pDC->SetBkColor(m_ClrCtlBk); // Fixe le fond en transparent pour le texte // à ne pas faire pour un edit. pDC->SetBkMode(TRANSPARENT); // retourne le handle de la brush pour le fond si il existe. if(m_HbrClrCtlBk ) hbr = m_HbrClrCtlBk; break; } // TODO: Return a different brush if the default is not desired return hbr; // TODO: Return a different brush if the default is not desired return hbr; } BOOL CTabInformation::OnInitDialog() { CDialog::OnInitDialog(); // TODO: Add extra initialization here SetDialogBkColor(RGB(193, 193, 255)); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE }
:D
jvois pas comment l'appliquer pour que le CtrlTab est la même couleur que la ficher CDialog :(
si tu ne toccupes pas de la couleur, ce sera la couleur par défaut partout, donc partout la memeCitation:
Envoyé par firejocker
ben justement non....
le gris par defaut du TabCtrl et celui par defaut de la fiche sont différents, celui du CDialog est plus clair
je remonte cette question une fois car les différences de couleurs sont la,
et qu'ils faut vraiment que j'uniformise ces gris
http://firejocker.info/tmp/vue.jpg
je viens de remettre a jour mon projet .
j'ai rajouté une classe template de gestion des couleurs pour les dialogues:
CTplDlgColor.
j'ai fais l'impasse pour l'instant sur le style XP en cochant la propriete owner draw fixed sur le tabctrl pour eviter la bande grise restante sur le tabctrl.
c'est une question de gout a toi de voir.
note l'appel de la fonction
permet d'ajuster le panneau client sur le tabctrl,evitant ainsi les differences de gris.Code:
1
2 m_tabctrl.SetAutoSizePannel(); // retaille automatiquement les panneaux clients.
:D
cool ca !
ca marche !!!
merci bien !
tu as vu qu'il reste un morceau de gris different
sur le texte des onglets non sélectionnés
bon je ne sais pas ce qui se passe j'ai un pb de mise à jour FTP .. :oops: ,Citation:
Envoyé par firejocker
j'ai changé le nom :
http://farscape.developpez.com/Samples/CxTabCtrl.zip
cette fois ci c'est bon j'ai verifé et re verifié ...
:D
Que faire ?Citation:
c:\Documents and Settings\jb\Mes documents\Visual Studio Projects\Douchette\XTabCtrl.h(87) : error C2039: '_GetBaseMessageMap' : is not a member of 'CTplDlgColor<GENERIC_DLGCOLOR>'
tu as recuperé tout le projet ?
attention il y a un include en plus :
si c'est le projet lui même ,fait un clean et rebuild all.Code:
1
2 #include "TemplDef.h" // message map extensions for templates
:D
j'ai recuperé uniquement ces 3 fichiers :
XTabCtrl.h
XTabCtrl.cpp
TemplDef.h
que j'ai ajouté à ma solution (enfin que le 3 eme, les autres y etaient deja)
clean puis rebuild et j'ai toujours l'erreur
c''est quoi la version de compilateur vs ? 6.0, .net 2001-2003 ,2005 ?
:D
c'est visual c++ .net
on la trouve ou la version du compile, sur le about, j'ai :
Microsoft Development Environment 2003 Version 7.1.3088
bon c'est a cause des templates ,ça passe parfaitement sous VC6.0...
essaye de mettre ce code dans templdef.h
en remplacement du bloc DECLARE_TEMPLATE_MESSAGE_MAP
de plus a partir de .net cette macro existe ,je l'ai renommée en changeant
_TEMPLATE_ par _TPL_
ça devrait passer sous .net 2003 ,mais ça passe pas sous VC 2005 :evil: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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69 /////////////////////////////////////////////////////////////////////////////// // definition for MESSAGE_MAP: #define DECLARE_TPL_MESSAGE_MAP() DECLARE_MESSAGE_MAP() #include "afxtempl.h" #if _MSC_VER >= 0x0700 #ifdef _AFXDLL #define BEGIN_TPL_MESSAGE_MAP(theTemplArgs, theClass, baseClass) \ template \ const AFX_MSGMAP* PASCAL theClass::GetThisMessageMap() \ { return &theClass::messageMap; } \ template \ const AFX_MSGMAP* theClass::GetMessageMap() const \ { return &theClass::messageMap; } \ template \ AFX_COMDAT const AFX_MSGMAP theClass::messageMap = \ { &baseClass::GetThisMessageMap, &theClass::_messageEntries[0] }; \ template \ AFX_COMDAT const AFX_MSGMAP_ENTRY theClass::_messageEntries[] = \ { #else #define BEGIN_TPL_MESSAGE_MAP(theTemplArgs, theClass, baseClass) \ template \ const AFX_MSGMAP* theClass::GetMessageMap() const \ { return &theClass::messageMap; } \ template \ AFX_COMDAT const AFX_MSGMAP theClass::messageMap = \ { &baseClass::messageMap, &theClass::_messageEntries[0] }; \ template \ AFX_COMDAT const AFX_MSGMAP_ENTRY theClass::_messageEntries[] = \ { #endif #else #ifdef _AFXDLL #define BEGIN_TPL_MESSAGE_MAP(theTemplArgs, theClass, baseClass) \ template <theTemplArgs> \ const AFX_MSGMAP* PASCAL theClass::_GetBaseMessageMap() \ { return &baseClass::messageMap; } \ template <theTemplArgs> \ const AFX_MSGMAP* theClass::GetMessageMap() const \ { return &theClass::messageMap; } \ template <theTemplArgs> \ AFX_COMDAT AFX_DATADEF const AFX_MSGMAP theClass::messageMap = \ { &theClass::_GetBaseMessageMap, &theClass::_messageEntries[0] }; \ template <theTemplArgs> \ AFX_COMDAT const AFX_MSGMAP_ENTRY theClass::_messageEntries[] = \ { \ #else #define BEGIN_TPL_MESSAGE_MAP(theTemplArgs, theClass, baseClass) \ template <theTemplArgs> \ const AFX_MSGMAP* theClass::GetMessageMap() const \ { return &theClass::messageMap; } \ template <theTemplArgs> \ AFX_COMDAT AFX_DATADEF const AFX_MSGMAP theClass::messageMap = \ { &baseClass::messageMap, &theClass::_messageEntries[0] }; \ template <theTemplArgs> \ AFX_COMDAT const AFX_MSGMAP_ENTRY theClass::_messageEntries[] = \ { \ #endif #endif #define END_TPL_MESSAGE_MAP() END_MESSAGE_MAP()
oula !!!
j'ai à bloc d'erreur !!!!
j'essai de trouver la premiere ..... et jla poste
[edit de moi :)] jai supprimé les 300 lignes d'erreurs que j'avais mis et qui encombré le forum inutilement
si tu relis mon message ,j'ai dis qu'il fallait remplacer
DECLARE_TEMPLATE_MESSAGE_MAP par
DECLARE_TPL_MESSAGE_MAP
et de maniere generale _TEMPLATE_ par _TPL_ ......
c'est fait (exact j'avais oublié)
ca se réduit maintenant à :
Citation:
------ Build started: Project: Douchette, Configuration: Debug Win32 ------
Compiling...
XTabCtrl.cpp
XTabCtrl.h(87) : error C2039: '_GetBaseMessageMap' : is not a member of 'CTplDlgColor<GENERIC_DLGCOLOR>'
XTabCtrl.cpp(53) : error C2440: 'static_cast' : cannot convert from 'void (__thiscall CXTabCtrl::* )(NMHDR *,LRESULT *)' to 'BOOL (__thiscall CCmdTarget::* )(NMHDR *,LRESULT *)'
None of the functions with this name in scope match the target type
XTabCtrl.cpp(129) : warning C4244: 'initializing' : conversion from 'INT_PTR' to 'int', possible loss of data
DlValidationPage2.cpp
DlValidation.cpp
XTabCtrl.h(87) : error C2039: '_GetBaseMessageMap' : is not a member of 'CTplDlgColor<GENERIC_DLGCOLOR>'
DlRecapitulatif.cpp
XTabCtrl.h(87) : error C2039: '_GetBaseMessageMap' : is not a member of 'CTplDlgColor<GENERIC_DLGCOLOR>'
DlListClick.cpp
XTabCtrl.h(87) : error C2039: '_GetBaseMessageMap' : is not a member of 'CTplDlgColor<GENERIC_DLGCOLOR>'
DlConnection.cpp
XTabCtrl.h(87) : error C2039: '_GetBaseMessageMap' : is not a member of 'CTplDlgColor<GENERIC_DLGCOLOR>'
DlAccueil.cpp
XTabCtrl.h(87) : error C2039: '_GetBaseMessageMap' : is not a member of 'CTplDlgColor<GENERIC_DLGCOLOR>'
Douchette.cpp
XTabCtrl.h(87) : error C2039: '_GetBaseMessageMap' : is not a member of 'CTplDlgColor<GENERIC_DLGCOLOR>'
Generating Code...
Build log was saved at "file://Debug\BuildLog.htm"
Douchette - 8 error(s), 1 warning(s)
---------------------- Done ----------------------
Build: 0 succeeded, 1 failed, 0 skipped
bon j'ai opté pour une solution compilable pour les 3 compilateurs vc6,.net,2005., je verrais le probleme des messages map templates une autre fois.
le projet est a jour.
:D
y'a une manip à faire avec ?
j'ai cette erreur dans ton projet :Citation:
XTabCtrl.cpp(53) : error C2440: 'static_cast' : cannot convert from 'void (__thiscall CXTabCtrl::* )(NMHDR *,LRESULT *)' to 'BOOL (__thiscall CCmdTarget::* )(NMHDR *,LRESULT *)'
essaye ça:
j'ai remplacé le void par BOOL .Code:
1
2
3
4
5
6
7
8
9 BOOL CXTabCtrl::OnSelchanging(NMHDR* pNMHDR, LRESULT* pResult) { // TODO: Add your control notification handler code here m_iSelectedTab = GetCurSel(); *pResult = 0; return FALSE; }
modifie aussi le .h .
c'est le probleme du portage d'un code VC6 sur .net ....
:D
lol, ce coup ci,
c'est le gris qui déconne :)
le titre de l'onglet est foncé alors que le contenu est clair
tu as appelé :SetDialogBkColor dans les differentes dialogues ?
voir mon exemple .
http://farscape.developpez.com/images/Cxtabctrl.JPG
:D
je pensais qu'il suffisait de mettre TabCtrl.SetAutoSizePannel(); à l'appelante
comment puis alors connaitre la couleur de base (le gris clair) ?
je l'ai plus en tete mais :
une petite copie ecran de la zone concernée ,
puis appel paint
copier la zone
prelevée la couleur avec l'outil prelevement couleur
et menu couleurs / modifier les couleurs /bouton couleurs personnalisées.
la tu trouves les valeurs RGB.
:D
j'essai de l'appeler comme tu l'a fais :
et j'ai bien misCitation:
BOOL DlValidationPage2::OnInitDialog()
{
CDialog::OnInitDialog();
SetDialogBkColor(RGB(193, 193, 255));
dans mon .h seulement, il trouve pas :Citation:
#include "XTabCtrl.h"
jvois pas mon erreur la,Citation:
DlValidationPage2.cpp(56) : error C3861: 'SetDialogBkColor': identifier not found, even with argument-dependent lookup
j'ai beau cleaner ma solution, rien n'y fais
regarde mon exemple et l'utilsation de la classe template....
les 3 classes panneaux et dialog utilisent la classe template....Code:
1
2
3
4
5
6 class CTabMoreInformation : public CTplDlgColor<CDialog> ... class CTabInformation : public CTplDlgColor<CDialog> ... class CTabctrlDlg : public CTplDlgColor<CDialog>
voir les implementations dans les .cpp.
:D
quelle tache ! j'ai zappé ca !
mais sinon, pkoi hier de base, le gris etait ok (di ce n'est dans les onglet), et plus la ?
j'ai rien fais de plus hier, aucun SetDialogBkColor ....
le gris etait ok sur les panneaux grace au resize des dialogues...
ben il y est toujours ce truc mais plus le gris
ton projet integre un manifest ? si oui tu as mis le Ctabctrl owner draw dans les ressources.
sinon montre moi une copie d'ecran de ta fenetre .
:D