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 confirm� Avatar de saidus
    Homme Profil pro
    Inscrit en
    Octobre 2004
    Messages
    166
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 48

    Informations forums :
    Inscription : Octobre 2004
    Messages : 166
    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

  2. #2
    Membre confirm� Avatar de saidus
    Homme Profil pro
    Inscrit en
    Octobre 2004
    Messages
    166
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 48

    Informations forums :
    Inscription : Octobre 2004
    Messages : 166
    Par d�faut
    Bonjour !!
    voila je vous montre un un exemple du style

  3. #3
    Membre �prouv�
    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 : 54
    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
    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�.

    @+

  4. #4
    Membre chevronn�
    Avatar de Altau
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    296
    D�tails du profil
    Informations personnelles :
    �ge : 68
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 296
    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 ?

  5. #5
    Membre �prouv�
    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 : 54
    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
    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,
    @+

  6. #6
    Membre �prouv�
    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 : 54
    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
    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 ...

    @ +

  7. #7
    Membre �prouv�
    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 : 54
    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
    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.

  8. #8
    Membre �prouv�
    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 : 54
    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
    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();
    	}
    }
    //----------------------------------------------------------------------------
    @+

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