IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

Composant de Gestion des TabBar<=>Form


Sujet :

C++Builder

  1. #1
    Membre régulier Avatar de saidus
    Homme Profil pro
    Inscrit en
    Octobre 2004
    Messages
    165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46

    Informations forums :
    Inscription : Octobre 2004
    Messages : 165
    Points : 89
    Points
    89
    Par défaut Composant de Gestion des TabBar<=>Form
    Bonjour !!
    je ne sais meme pas comment expliquer ... mais bon je vais essayer :
    voila !! je chercher un composant de tel sorte que dans une application MDI lors de la creation d'une form "Child " ,sur une toolbar il y aurai un tab qui ce cree et sera associer a cette form la .. sur le tab sera afficher le caption de la form + boutton system "ferme" en autre terme :
    si vous avez installer la JVCL il ya 2 Composant de ce type .. le
    JvTabBar et JvPageList qui vont de paire ..
    Existes il d'autre composants comme cela !!!
    Merci
    Dhukmucmur Vernedh

  2. #2
    Membre régulier Avatar de saidus
    Homme Profil pro
    Inscrit en
    Octobre 2004
    Messages
    165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46

    Informations forums :
    Inscription : Octobre 2004
    Messages : 165
    Points : 89
    Points
    89
    Par défaut
    Bonjour !!
    voila je vous montre un un exemple du style
    Dhukmucmur Vernedh

  3. #3
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Bonjour,

    Je dirais que cela ressemble a l'idée d'un TTabSet, mais pour afficher le bouton de fermeture il faudrait surement travailler avec un object en style 'tsOwnerDraw' et avec l'évènement OnDrawTab ...

    A voir ... Il existe peut être des composants tout fait, mais perso je ne connais pas, désolé.

    @+
    Aux persévérants aucune route n'est interdite.
    Celui qui ne sait pas se contenter de peu ne sera jamais content de rien.
    Current Status
    Avec 40% de pollinisateurs invertébrés menacés d'extinction selon les Nations Unies, l'homme risque fort de passer de la monoculture à la mono diète...
    Faîtes quelque chose de bien avec vos petits sous: Enfants du Mekong

  4. #4
    Membre averti
    Avatar de Altau
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    296
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 296
    Points : 360
    Points
    360
    Par défaut
    Ne serai-t-il pas plus simple d'abandonner le concept MDI et de gérer ça normalement dans un composant Tab quelque chose qui est fait pour ça ?
    RAD Studio 10.3 / Ubuntu 20.04 - RYZEN 7 2700X - 24Go de RAM

  5. #5
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Bonsoir,

    Un petit essai dans un TPageControl, si cela peut aider a faire avancer le 'schmilblick':
    .h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    //---------------------------------------------------------------------------
    class TMPC : public TPageControl
    {
    private:
     
    		void __fastcall OnPaint(TMessage &msg);
    		void __fastcall OnClickItem(TObject *Sender);
    		void __fastcall OnComunMenuItemDraw(System::TObject *Sender, Graphics::TCanvas *ACanvas, const Types::TRect &ARect, TOwnerDrawState State);
    		void __fastcall MMouseMove(TObject *Sender, TShiftState Shift, int X, int Y);
    		void __fastcall MMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y);
    		void __fastcall MMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y);
    		//On ajoute la gestion du message WM_PAINT:
    		BEGIN_MESSAGE_MAP
    			MESSAGE_HANDLER(WM_PAINT, TMessage, OnPaint);
    		END_MESSAGE_MAP(TPageControl)
    		//
    		HWND hwndUD; // <- handle du msctls_updown32, si il a été crée par l'objet
    		TRect rectUD; // <- rect du msctls_updown32, afin de déterminer si la souris est dans la zone du spincontrol ou non
    		int NbPage;
    		int Etat;     //0 = bouton relaché, 1 = bouton enfoncé
    		int PosX;     //Position de la souris donné dans le OnMouseMove
    		int PosY;
    		bool Survol;  //booléen, a true si le clique se fait sur l'image 'fermer'
    		//
    		TPopupMenu *aMenu; // <- menu contenant tous les noms d'onglets
    protected:
    		virtual void __fastcall DrawTab(int TabIndex, const Types::TRect &Rect, bool Active);
    public:
    	__fastcall TMPC(TComponent* Owner);
    	__fastcall virtual ~TMPC(void);
    };
    //---------------------------------------------------------------------------
    .cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
     
    //----------------------------------------------------------------------------
    __fastcall TMPC::TMPC(TComponent* Owner) : TPageControl(Owner)
    {
    	aMenu = new TPopupMenu(this);
    		aMenu->AutoHotkeys = maManual;
    		aMenu->OwnerDraw = true;
    	DoubleBuffered = true;
    	NbPage = PageCount;
    	Etat = 0;
    	Survol = false;
    	OwnerDraw = true;
    	OnMouseMove = MMouseMove;
    	OnMouseDown = MMouseDown;
    	OnMouseUp = MMouseUp;
    }
    //---------------------------------------------------------------------------
    __fastcall TMPC::~TMPC(void)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TMPC::OnClickItem(TObject *Sender)
    {
    	ActivePageIndex = aMenu->Items->IndexOf(((TMenuItem*)Sender));
    }
    //----------------------------------------------------------------------------
    void __fastcall TMPC::OnComunMenuItemDraw(System::TObject *Sender, Graphics::TCanvas *ACanvas, const Types::TRect &ARect, TOwnerDrawState State)
    {
    ACanvas->Brush->Color = clSilver;
    ACanvas->FillRect(ARect);
    if (State.Contains(odSelected))
    {
    	ACanvas->Font->Color = clRed;
    	ACanvas->Font->Style = TFontStyles()<< fsBold;
    	ACanvas->Rectangle(ARect);
    }
    else
    {
    	ACanvas->Font->Color = clNavy;
    	ACanvas->Font->Style = TFontStyles();
    }
    if (aMenu->Items->IndexOf(((TMenuItem*)Sender)) == ActivePageIndex)
    {
    	ACanvas->Font->Style = TFontStyles()<< fsBold << fsUnderline;
    }
    ACanvas->TextRect(ARect, ARect.Left + 3, ARect.Top, ((TMenuItem*)Sender)->Caption);
    }
    //----------------------------------------------------------------------------
    void __fastcall TMPC::OnPaint(TMessage &msg)
    {
    int i;
    DefaultHandler(&msg);
     //section menu
    if (NbPage != PageCount)
    {
    aMenu->Items->Clear();
    	TMenuItem *pItem;
    	for ( i = 0; i < PageCount; i ++)
    	{
    		pItem = new TMenuItem(aMenu);
    		pItem->Caption = Pages[i]->Caption;
    		pItem->OnClick = OnClickItem;
    		pItem->OnAdvancedDrawItem = OnComunMenuItemDraw;
    		aMenu->Items->Add(pItem);
    	}
    	pItem = NULL; delete pItem;
    NbPage = PageCount;
    }
    //repère position curseur / UpDown Control
    hwndUD = FindWindowEx(Handle, 0, "msctls_updown32", NULL);
    if (hwndUD != NULL)
    {
    	GetWindowRect(hwndUD, &rectUD);
    	if (PtInRect(rectUD, Mouse->CursorPos))
    	{
    		aMenu->Popup(rectUD.left, rectUD.bottom );
    	}
    }
    }
    //----------------------------------------------------------------------------
    void __fastcall TMPC::DrawTab(int TabIndex, const Types::TRect &Rect, bool Active)
    {
    int l = Canvas->TextExtent( Pages[TabIndex]->Caption ).cx;
    	Canvas->TextRect(Rect, Rect.left + 2, Rect.top + 2, Pages[TabIndex]->Caption);
    HDC hdc = GetDC(Handle);
    tagRECT tgrect;
    	tgrect.left = Rect.left + l + 3;
    	tgrect.right = Rect.right - 1;
    	tgrect.top = Rect.top + 1;
    	tgrect.bottom = ((Rect.Bottom - tgrect.top)/3)*2;
    if (TabIndex == ActivePageIndex) 
    {
    tagPOINT pt;
    	pt.x = PosX;
    	pt.y = PosY;
    	switch ( Etat )
    	{
    		case 0:
    			DrawFrameControl(hdc, &tgrect, DFC_CAPTION, DFCS_CAPTIONCLOSE);
    		break;
    		case 1:
    		if ( PtInRect(tgrect, pt) > 0 ) 
    		{
    			Survol = true;
    			DrawFrameControl(hdc, &tgrect, DFC_CAPTION, DFCS_CAPTIONCLOSE | DFCS_PUSHED	);	
    		}
    		else
    		{
    			Survol = false;
    			DrawFrameControl(hdc, &tgrect, DFC_CAPTION, DFCS_CAPTIONCLOSE);
    		}			
    		break;
    	}
    }
    else
    {
    	DrawFrameControl(hdc, &tgrect, DFC_CAPTION, DFCS_CAPTIONCLOSE);
    }
    }
    //----------------------------------------------------------------------------
    void __fastcall TMPC::MMouseMove(TObject *Sender, TShiftState Shift, int X, int Y)
    {
    PosX = X;
    PosY = Y;
    }
    //----------------------------------------------------------------------------
    void __fastcall TMPC::MMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
    {
    Etat = 1;
    Repaint();
    }
    //----------------------------------------------------------------------------
    void __fastcall TMPC::MMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
    {
    Etat = 0;
    Repaint();
    if (Survol == true) 
    {
    	delete (ActivePage);    
    }
    }
    //----------------------------------------------------------------------------
    Bon, il y a un petit comportement supplémentaire lorsque l'on cherche a faire défiler les onglets, puisque j'ai repris un petit bout de code d'un précédant bricolage ...

    Reste le coup du dimensionnement des onglets (en fonction de la taille du caption + la place pour le dessin du control), je ne suis pas sur qu'en l'état cela soit optimal.
    Et pis, faut peut être rajouter un test afin de vérifier si l'on delete ou pas le dernier TTabSheet présent (cela peut poser un soucis peut être ?)...

    En espérant t'aider,
    @+
    Aux persévérants aucune route n'est interdite.
    Celui qui ne sait pas se contenter de peu ne sera jamais content de rien.
    Current Status
    Avec 40% de pollinisateurs invertébrés menacés d'extinction selon les Nations Unies, l'homme risque fort de passer de la monoculture à la mono diète...
    Faîtes quelque chose de bien avec vos petits sous: Enfants du Mekong

  6. #6
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    (re)Bonsoir,

    Grrrrr .... Je viens d'essayer avec un TTabSet et il me semble que DrawFrameControl ne veux pas du Handle de cet objet; même en passant par GetDC() ou CreateCompatibleDC().

    Mais peut être ne sais je pas m'y prendre correctement avec les vieilles choses ...

    @ +
    Aux persévérants aucune route n'est interdite.
    Celui qui ne sait pas se contenter de peu ne sera jamais content de rien.
    Current Status
    Avec 40% de pollinisateurs invertébrés menacés d'extinction selon les Nations Unies, l'homme risque fort de passer de la monoculture à la mono diète...
    Faîtes quelque chose de bien avec vos petits sous: Enfants du Mekong

  7. #7
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    (re)(re)Bonsoir,

    (re)Grrrrrrrrrr.... Le message d'erreur levé est amusant:
    "Opération completed successfully"

    Donc, ya une erreur mais ya pas d'erreur ...
    C'est mignon ca.
    Aux persévérants aucune route n'est interdite.
    Celui qui ne sait pas se contenter de peu ne sera jamais content de rien.
    Current Status
    Avec 40% de pollinisateurs invertébrés menacés d'extinction selon les Nations Unies, l'homme risque fort de passer de la monoculture à la mono diète...
    Faîtes quelque chose de bien avec vos petits sous: Enfants du Mekong

  8. #8
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Citation Envoyé par Sunchaser Voir le message
    Bonsoir,

    Un petit essai dans un TPageControl, si cela peut aider a faire avancer le 'schmilblick':
    .h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    //---------------------------------------------------------------------------
    class TMPC : public TPageControl
    {
    private:
     
    		void __fastcall OnPaint(TMessage &msg);
    		void __fastcall OnClickItem(TObject *Sender);
    		void __fastcall OnComunMenuItemDraw(System::TObject *Sender, Graphics::TCanvas *ACanvas, const Types::TRect &ARect, TOwnerDrawState State);
    		void __fastcall MMouseMove(TObject *Sender, TShiftState Shift, int X, int Y);
    		void __fastcall MMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y);
    		void __fastcall MMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y);
    		//On ajoute la gestion du message WM_PAINT:
    		BEGIN_MESSAGE_MAP
    			MESSAGE_HANDLER(WM_PAINT, TMessage, OnPaint);
    		END_MESSAGE_MAP(TPageControl)
    		//
    		HWND hwndUD; // <- handle du msctls_updown32, si il a été crée par l'objet
    		TRect rectUD; // <- rect du msctls_updown32, afin de déterminer si la souris est dans la zone du spincontrol ou non
    		int NbPage;
    		int Etat;     //0 = bouton relaché, 1 = bouton enfoncé
    		int PosX;     //Position de la souris donné dans le OnMouseMove
    		int PosY;
    		bool Survol;  //booléen, a true si le clique se fait sur l'image 'fermer'
    		//
    		TPopupMenu *aMenu; // <- menu contenant tous les noms d'onglets
    protected:
    		virtual void __fastcall DrawTab(int TabIndex, const Types::TRect &Rect, bool Active);
    public:
    	__fastcall TMPC(TComponent* Owner);
    	__fastcall virtual ~TMPC(void);
    };
    //---------------------------------------------------------------------------
    .cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
     
    //----------------------------------------------------------------------------
    __fastcall TMPC::TMPC(TComponent* Owner) : TPageControl(Owner)
    {
    	aMenu = new TPopupMenu(this);
    		aMenu->AutoHotkeys = maManual;
    		aMenu->OwnerDraw = true;
    	DoubleBuffered = true;
    	NbPage = PageCount;
    	Etat = 0;
    	Survol = false;
    	OwnerDraw = true;
    	OnMouseMove = MMouseMove;
    	OnMouseDown = MMouseDown;
    	OnMouseUp = MMouseUp;
    }
    //---------------------------------------------------------------------------
    __fastcall TMPC::~TMPC(void)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TMPC::OnClickItem(TObject *Sender)
    {
    	ActivePageIndex = aMenu->Items->IndexOf(((TMenuItem*)Sender));
    }
    //----------------------------------------------------------------------------
    void __fastcall TMPC::OnComunMenuItemDraw(System::TObject *Sender, Graphics::TCanvas *ACanvas, const Types::TRect &ARect, TOwnerDrawState State)
    {
    ACanvas->Brush->Color = clSilver;
    ACanvas->FillRect(ARect);
    if (State.Contains(odSelected))
    {
    	ACanvas->Font->Color = clRed;
    	ACanvas->Font->Style = TFontStyles()<< fsBold;
    	ACanvas->Rectangle(ARect);
    }
    else
    {
    	ACanvas->Font->Color = clNavy;
    	ACanvas->Font->Style = TFontStyles();
    }
    if (aMenu->Items->IndexOf(((TMenuItem*)Sender)) == ActivePageIndex)
    {
    	ACanvas->Font->Style = TFontStyles()<< fsBold << fsUnderline;
    }
    ACanvas->TextRect(ARect, ARect.Left + 3, ARect.Top, ((TMenuItem*)Sender)->Caption);
    }
    //----------------------------------------------------------------------------
    void __fastcall TMPC::OnPaint(TMessage &msg)
    {
    int i;
    DefaultHandler(&msg);
     //section menu
    if (NbPage != PageCount)
    {
    aMenu->Items->Clear();
    	TMenuItem *pItem;
    	for ( i = 0; i < PageCount; i ++)
    	{
    		pItem = new TMenuItem(aMenu);
    		pItem->Caption = Pages[i]->Caption;
    		pItem->OnClick = OnClickItem;
    		pItem->OnAdvancedDrawItem = OnComunMenuItemDraw;
    		aMenu->Items->Add(pItem);
    	}
    	pItem = NULL; delete pItem;
    NbPage = PageCount;
    }
    //repère position curseur / UpDown Control
    hwndUD = FindWindowEx(Handle, 0, "msctls_updown32", NULL);
    if (hwndUD != NULL)
    {
    	GetWindowRect(hwndUD, &rectUD);
    	if (PtInRect(rectUD, Mouse->CursorPos))
    	{
    		aMenu->Popup(rectUD.left, rectUD.bottom );
    	}
    }
    }
    //----------------------------------------------------------------------------
    void __fastcall TMPC::DrawTab(int TabIndex, const Types::TRect &Rect, bool Active)
    {
    int l = Canvas->TextExtent( Pages[TabIndex]->Caption ).cx;
    	Canvas->TextRect(Rect, Rect.left + 2, Rect.top + 2, Pages[TabIndex]->Caption);
    HDC hdc = GetDC(Handle);
    tagRECT tgrect;
    	tgrect.left = Rect.left + l + 3;
    	tgrect.right = Rect.right - 1;
    	tgrect.top = Rect.top + 1;
    	tgrect.bottom = ((Rect.Bottom - tgrect.top)/3)*2;
    if (TabIndex == ActivePageIndex) 
    {
    tagPOINT pt;
    	pt.x = PosX;
    	pt.y = PosY;
    	switch ( Etat )
    	{
    		case 0:
    			DrawFrameControl(hdc, &tgrect, DFC_CAPTION, DFCS_CAPTIONCLOSE);
    		break;
    		case 1:
    		if ( PtInRect(tgrect, pt) > 0 ) 
    		{
    			Survol = true;
    			DrawFrameControl(hdc, &tgrect, DFC_CAPTION, DFCS_CAPTIONCLOSE | DFCS_PUSHED	);	
    		}
    		else
    		{
    			Survol = false;
    			DrawFrameControl(hdc, &tgrect, DFC_CAPTION, DFCS_CAPTIONCLOSE);
    		}			
    		break;
    	}
    }
    else
    {
    	DrawFrameControl(hdc, &tgrect, DFC_CAPTION, DFCS_CAPTIONCLOSE);
    }
    }
    //----------------------------------------------------------------------------
    void __fastcall TMPC::MMouseMove(TObject *Sender, TShiftState Shift, int X, int Y)
    {
    PosX = X;
    PosY = Y;
    }
    //----------------------------------------------------------------------------
    void __fastcall TMPC::MMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
    {
    Etat = 1;
    Repaint();
    }
    //----------------------------------------------------------------------------
    void __fastcall TMPC::MMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
    {
    Etat = 0;
    Repaint();
    if (Survol == true) 
    {
    	delete (ActivePage);    
    }
    }
    //----------------------------------------------------------------------------
    Bon, il y a un petit comportement supplémentaire lorsque l'on cherche a faire défiler les onglets, puisque j'ai repris un petit bout de code d'un précédant bricolage ...

    Reste le coup du dimensionnement des onglets (en fonction de la taille du caption + la place pour le dessin du control), je ne suis pas sur qu'en l'état cela soit optimal.
    Et pis, faut peut être rajouter un test afin de vérifier si l'on delete ou pas le dernier TTabSheet présent (cela peut poser un soucis peut être ?)...

    En espérant t'aider,
    @+
    Bonsoir,

    Bon, au passage j'ai solutionné le petit souci de redimensionnement du 'Widht' des onglets, avec TabCtrl_SetMinTabWidth.
    (dur a prononcer ce truc tout de même, non ?)
    J'ai donc modifié la classe comme suit (sait on jamais, ca peut toujours intéresser qqu'un...):
    Dans le .h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    class TMPC : public TPageControl
    {
    private:
     
    		void __fastcall OnPaint(TMessage &msg);
    		void __fastcall OnMDrawItem(TWMDrawItem &msg);
    		void __fastcall OnClickItem(TObject *Sender);
    		void __fastcall OnComunMenuItemDraw(System::TObject *Sender, Graphics::TCanvas *ACanvas, const Types::TRect &ARect, TOwnerDrawState State);
    		void __fastcall MMouseMove(TObject *Sender, TShiftState Shift, int X, int Y);
    		void __fastcall MMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y);
    		void __fastcall MMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y);
    		//On ajoute la gestion du message WM_PAINT:
    		BEGIN_MESSAGE_MAP
    			MESSAGE_HANDLER(WM_PAINT, TMessage, OnPaint);
    			MESSAGE_HANDLER(CN_DRAWITEM, TWMDrawItem, OnMDrawItem);
    		END_MESSAGE_MAP(TPageControl)
    		//
    		HWND hwndUD; // <- handle du msctls_updown32, si il a été crée par l'objet
    		TRect rectUD; // <- rect du msctls_updown32, afin de déterminer si la souris est dans la zone du spincontrol ou non
    		int NbPage;
    		int Etat;     //0 = bouton relaché, 1 = bouton enfoncé
    		int PosX;     //Position de la souris donné dans le OnMouseMove
    		int PosY;
    		bool Survol;  //booléen, a true si le clique se fait sur l'image 'fermer'
    		//
    		TPopupMenu *aMenu; // <- menu contenant tous les noms d'onglets
    protected:
     
    public:
    	__fastcall TMPC(TComponent* Owner);
    	__fastcall virtual ~TMPC(void);
    };
    Dans le .cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
     
    __fastcall TMPC::TMPC(TComponent* Owner) : TPageControl(Owner)
    {
    	aMenu = new TPopupMenu(this);
    		aMenu->AutoHotkeys = maManual;
    		aMenu->OwnerDraw = true;
    	DoubleBuffered = true;
    	NbPage = PageCount;
    	Etat = 0;
    	Survol = false;
    	OwnerDraw = true;
    	OnMouseMove = MMouseMove;
    	OnMouseDown = MMouseDown;
    	OnMouseUp = MMouseUp;
    }
    //---------------------------------------------------------------------------
    __fastcall TMPC::~TMPC(void)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TMPC::OnClickItem(TObject *Sender)
    {
    	ActivePageIndex = aMenu->Items->IndexOf(((TMenuItem*)Sender));
    }
    //----------------------------------------------------------------------------
    void __fastcall TMPC::OnComunMenuItemDraw(System::TObject *Sender, Graphics::TCanvas *ACanvas, const Types::TRect &ARect, TOwnerDrawState State)
    {
    ACanvas->Brush->Color = clSilver;
    ACanvas->FillRect(ARect);
    if (State.Contains(odSelected))
    {
    	ACanvas->Font->Color = clRed;
    	ACanvas->Font->Style = TFontStyles()<< fsBold;
    	ACanvas->Rectangle(ARect);
    }
    else
    {
    	ACanvas->Font->Color = clNavy;
    	ACanvas->Font->Style = TFontStyles();
    }
    if (aMenu->Items->IndexOf(((TMenuItem*)Sender)) == ActivePageIndex)
    {
    	ACanvas->Font->Style = TFontStyles()<< fsBold << fsUnderline;
    }
    ACanvas->TextRect(ARect, ARect.Left + 3, ARect.Top, ((TMenuItem*)Sender)->Caption);
    }
    //----------------------------------------------------------------------------
    void __fastcall TMPC::OnPaint(TMessage &msg)
    {
    TabCtrl_SetMinTabWidth(Handle, 50);
    int i;
    DefaultHandler(&msg);
     //section menu
    if (NbPage != PageCount)
    {
    aMenu->Items->Clear();
    	TMenuItem *pItem;
    	for ( i = 0; i < PageCount; i ++)
    	{
    		pItem = new TMenuItem(aMenu);
    		pItem->Caption = Pages[i]->Caption;
    		pItem->OnClick = OnClickItem;
    		pItem->OnAdvancedDrawItem = OnComunMenuItemDraw;
    		aMenu->Items->Add(pItem);
    	}
    	pItem = NULL; delete pItem;
    NbPage = PageCount;
    }
    //repère position curseur / UpDown Control
    hwndUD = FindWindowEx(Handle, 0, "msctls_updown32", NULL);
    if (hwndUD != NULL)
    {
    	GetWindowRect(hwndUD, &rectUD);
    	//hwndUD
    	//HDC hdc = GetDC(Handle);
    	//DrawFrameControl(hdc, &rectUD, DFC_MENU, DFCS_MENUARROW);
    	if (PtInRect(rectUD, Mouse->CursorPos))
    	{
    		aMenu->Popup(rectUD.left, rectUD.bottom);
    	}
    }
    }
    //----------------------------------------------------------------------------
    void __fastcall TMPC::OnMDrawItem(TWMDrawItem &msg)
    {
    tagRECT Rect;
    Rect = msg.DrawItemStruct->rcItem;
     
    Canvas->Brush->Color = clBtnFace;
     
    HTHEME hTheme = NULL;
    hTheme = OpenThemeData(Handle, L"Window");
    int l = Canvas->TextExtent( Pages[msg.DrawItemStruct->itemID]->Caption ).cx;
    	Canvas->TextRect(Rect, Rect.left + 2, Rect.top + 2, Pages[msg.DrawItemStruct->itemID]->Caption);
     
    HDC hdc = GetDC(Handle);
    tagRECT tgrect;
    	tgrect.left = Rect.left + l + 3;
    	tgrect.right = Rect.right - 1;
    	tgrect.top = Rect.top + 1;
    	tgrect.bottom = ((Rect.bottom - tgrect.top)/4)*3;
    if (TabIndex == ActivePageIndex)
    {
    tagPOINT pt;
    	pt.x = PosX;
    	pt.y = PosY;
    	switch ( Etat )
    	{
    		case 0:
    			//DrawFrameControl(hdc, &tgrect, DFC_CAPTION, DFCS_CAPTIONCLOSE);
    			DrawThemeBackground(hTheme, hdc, WP_CLOSEBUTTON, CBS_NORMAL, &tgrect, 0);
    			DrawThemeEdge(hTheme, hdc, WP_CLOSEBUTTON, CBS_NORMAL, &tgrect, EDGE_RAISED, BF_RECT, 0);
    		break;
    		case 1:
    		if ( PtInRect(tgrect, pt) > 0 )
    		{
    			Survol = true;
    			//DrawFrameControl(hdc, &tgrect, DFC_CAPTION, DFCS_CAPTIONCLOSE | DFCS_PUSHED	);
    			DrawThemeBackground(hTheme, hdc, WP_CLOSEBUTTON, CBS_PUSHED, &tgrect, 0);
    			DrawThemeEdge(hTheme, hdc, WP_CLOSEBUTTON, CBS_PUSHED, &tgrect, EDGE_SUNKEN, BF_RECT, 0);
    		}
    		else
    		{
    			Survol = false;
    			//DrawFrameControl(hdc, &tgrect, DFC_CAPTION, DFCS_CAPTIONCLOSE);
    			DrawThemeBackground(hTheme, hdc, WP_CLOSEBUTTON, CBS_NORMAL, &tgrect, 0);
    			DrawThemeEdge(hTheme, hdc, WP_CLOSEBUTTON, CBS_NORMAL, &tgrect, EDGE_RAISED, BF_RECT, 0);
    		}
    		break;
    		case 2: //pas beau car scintille !
    		if ( PtInRect(tgrect, pt) > 0 )
    		{
    			DrawThemeBackground(hTheme, hdc, WP_CLOSEBUTTON, CBS_HOT, &tgrect, 0);
    			DrawThemeEdge(hTheme, hdc, WP_CLOSEBUTTON, CBS_HOT, &tgrect, EDGE_RAISED, BF_RECT, 0);
    		}
    		else
    		{
    			DrawThemeBackground(hTheme, hdc, WP_CLOSEBUTTON, CBS_NORMAL, &tgrect, 0);
    			DrawThemeEdge(hTheme, hdc, WP_CLOSEBUTTON, CBS_NORMAL, &tgrect, EDGE_RAISED, BF_RECT, 0);
    		}
    		break;
    	}
    }
    else
    {
    	//DrawFrameControl(hdc, &tgrect, DFC_CAPTION, DFCS_CAPTIONCLOSE);
    	DrawThemeBackground(hTheme, hdc, WP_CLOSEBUTTON, CBS_NORMAL, &tgrect, 0);
    	DrawThemeEdge(hTheme, hdc, WP_CLOSEBUTTON, CBS_NORMAL, &tgrect, EDGE_RAISED, BF_RECT, 0);
    }
     
     
     
    }
    //----------------------------------------------------------------------------
    void __fastcall TMPC::MMouseMove(TObject *Sender, TShiftState Shift, int X, int Y)
    {
    	Etat = 2;
    	PosX = X;
    	PosY = Y;
    }
    //----------------------------------------------------------------------------
    void __fastcall TMPC::MMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
    {
    	Etat = 1;
    	Repaint();
    }
    //----------------------------------------------------------------------------
    void __fastcall TMPC::MMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
    {
    	Etat = 0;
    	Repaint();
    	if (Survol == true)
    	{
    		delete (ActivePage);
    		Repaint();
    	}
    }
    //----------------------------------------------------------------------------
    @+
    Aux persévérants aucune route n'est interdite.
    Celui qui ne sait pas se contenter de peu ne sera jamais content de rien.
    Current Status
    Avec 40% de pollinisateurs invertébrés menacés d'extinction selon les Nations Unies, l'homme risque fort de passer de la monoculture à la mono diète...
    Faîtes quelque chose de bien avec vos petits sous: Enfants du Mekong

Discussions similaires

  1. Gestion des pipes en Windows Form
    Par CleeM dans le forum VC++ .NET
    Réponses: 6
    Dernier message: 03/12/2012, 18h05
  2. [Joomla!] Cherche composant de gestion des accès des utilisateurs
    Par Alcius dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 4
    Dernier message: 20/07/2009, 10h45
  3. Réponses: 0
    Dernier message: 15/03/2008, 19h47
  4. un composant de gestion des utilisateur pour joomla 1.0.12
    Par metrax dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 20/06/2007, 11h48
  5. [VB.NET]La bonne gestion des forms
    Par Wintermute dans le forum Windows Forms
    Réponses: 11
    Dernier message: 13/01/2004, 16h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo