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 :

Comment ajouter un bouton dans la barre de titre d'une fenêtre ?


Sujet :

C++Builder

  1. #1
    Membre éclairé
    Avatar de Interruption13h
    Inscrit en
    Août 2005
    Messages
    603
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 603
    Points : 786
    Points
    786
    Par défaut Comment ajouter un bouton dans la barre de titre d'une fenêtre ?
    Salut tout le monde !

    Je croi que tout est dans le titre !

    Nom : Barre.JPG
Affichages : 264
Taille : 2,0 Ko

    Merci d'avance !?
    Plus tu prends part aux joies et chagrins des gens, plus ils te sont proches et chers. Mais c'est le chagrin et les problèmes qui vous rapprochent le plus.

    (Mark TWAIN)

  2. #2
    Membre habitué

    Profil pro
    Cadre
    Inscrit en
    Mars 2006
    Messages
    132
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Cadre

    Informations forums :
    Inscription : Mars 2006
    Messages : 132
    Points : 168
    Points
    168
    Par défaut
    Screenshot d'emule?

    Du bon sens tu auras
    Du bon sens tu auras encore
    Du bon sens tu auras toujours
    http://emilien.bresson.free.fr

  3. #3
    Membre actif
    Avatar de lanonyme
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    229
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 229
    Points : 290
    Points
    290
    Par défaut
    Bonjour,

    Citation Envoyé par Tenguryu
    Screenshot d'emule?

    On dirai bien

    Les source d'emule ne sont t'elle pas dispo .... c'est peut etre dedans ??

    lanonyme

  4. #4
    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
    Je me permets de faire remonter ce sujet, car j'ai peut être un début de solution :

    .dans le .h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
            void __fastcall DessinBouton(int State);
            void __fastcall OnNCLBUTTONDOWN(TMessage& msg);
            void __fastcall OnNCLBUTTONUP(TMessage& msg);
            void __fastcall OnNCMOUSEMOVE(TMessage& msg);
     
            BEGIN_MESSAGE_MAP
                   MESSAGE_HANDLER(WM_NCLBUTTONDOWN,TMessage,OnNCLBUTTONDOWN)
                    MESSAGE_HANDLER(WM_NCLBUTTONUP,TMessage,OnNCLBUTTONUP)
                    MESSAGE_HANDLER(WM_NCMOUSEMOVE,TMessage,OnNCMOUSEMOVE)
            END_MESSAGE_MAP(TForm)
    .dans le .cpp:
    Pour le dessin du bouton, avec deux états possibles (enfoncé, relaché):
    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
     
    void __fastcall TForm7::DessinBouton(int State)
    {
            HDC hdc;
            HWND whdc;
            whdc = this->Handle;
            //
            tagRECT *arect = new tagRECT;
            tagRECT pRect;  //positionnement du bouton
            tagRECT topRect; //positionnement de la barre haut
            tagRECT bottomRect; //positionnement de la barre bas
     
            //On alimente le pointeur 'arect' avec les coordonnées de toute la fenêtre
            //c'est a dire la zone client classique - accessible par la Canvas d'une TForm par ex -
            //mais aussi toutes les parties 'externes' telles que la barre de titre :
            GetWindowRect(whdc, arect);
     
            // On détermine les coordonnées auxquelles on veut dessiner le
            //bouton :
            pRect.left = arect->left + 963;
            pRect.top = arect->top + 10;
            pRect.right = arect->left + 980;
            pRect.bottom = arect->top + 24;
     
            //Pour les 'décorations'...du bouton
            //coordonées pour la barre du haut
            topRect.left = arect->left + 965;
            topRect.top = arect->top + 12;
            topRect.right = arect->left + 976;
            topRect.bottom = arect->top + 15;
     
            //coordonnées pour la barre du bas
            bottomRect.left = arect->left + 965;
            bottomRect.top = arect->top + 19;
            bottomRect.right = arect->left + 976;
            bottomRect.bottom = arect->top + 22;
     
            //GetWindowDC permet de récuperer une 'zone de travail complète'
            //(incluant donc la TitleBar, les Menus et Scroll-bars)
            //sur laquelle nous pourrons effectivement dessiner
            //nos éléments :
            hdc = GetWindowDC(whdc);
            //
            switch (State)
            {
                    case 0:
                    DrawFrameControl(hdc, &pRect, DFC_BUTTON, DFCS_BUTTONPUSH);
                    break;
                    case 1:
                    DrawFrameControl(hdc, &pRect, DFC_BUTTON, DFCS_PUSHED | DFCS_ADJUSTRECT);
                    break;
            }
            DrawEdge(hdc, &topRect, BDR_SUNKENINNER, BF_RECT);
            DrawEdge(hdc, &bottomRect, BDR_SUNKENINNER, BF_RECT);
            //
            ReleaseDC(hdc, whdc);
            delete arect;
    }
    La gestion des messages:
    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
     
    void __fastcall TForm7::OnNCLBUTTONDOWN(TMessage& msg)
    {
    tagPOINTS *points = new tagPOINTS;
    points->x = msg.LParamLo;
    points->y = msg.LParamHi;
    if ( (points->x > 955 && points->x < 970) && (points->y > 1 && points->y < 12) )
    {
            DessinBouton(1);
    }
    else
    {
            DessinBouton(0);
    this->DefaultHandler(&msg);
    }
    delete points;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm7::OnNCLBUTTONUP(TMessage& msg)
    {
    tagPOINTS *points = new tagPOINTS;
    points->x = msg.LParamLo;
    points->y = msg.LParamHi;
    if ( (points->x > 955 && points->x < 970) && (points->y > 1 && points->y < 12) )
    {
            DessinBouton(0);
    }
    else
    {
            this->DefaultHandler(&msg);
    }
    delete points;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm7::OnNCMOUSEMOVE(TMessage& msg)
    {
    tagPOINTS *points = new tagPOINTS;
    points->x = msg.LParamLo;
    points->y = msg.LParamHi;
    if ( (points->x < 955 || points->x > 970) || (points->y < 1 || points->y > 12) )
    {
            DessinBouton(0);
    }
    this->DefaultHandler(&msg);
    delete points;
    }
    //---------------------------------------------------------------------------
    Pour finir quelques appels :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void __fastcall TForm7::FormPaint(TObject *Sender)
    {
    DessinBouton(0);
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm7::FormResize(TObject *Sender)
    {
    DessinBouton(0);
    }
    //---------------------------------------------------------------------------
    NB : le fait que le bouton soit redessiné dans OnNCMOUSEMOVE est assez (voir tres) important puisque si le click sur ce bouton provoque un appel a un ShowMessage(...) ou MessageDlg, ou une autre Form modale du même genre,
    au retour sur la Form je perdais ce bouton.
    En effet, on ne repasse pas par le OnPaint de la Form, ni un autre évènement facilement accessible.
    Avec le MouseMove, le bouton sera redessiné...

    Je continuerais a chercher pour le coup du 'points' et des valeurs lors du test du positionnement de la souris, qui n'est pas tres beau.

    En attendant vos remarques, et suggestions...

    @ +
    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

  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
    Pour regler le problème du test du positionnement de la souris sur le bouton (ou non), je propose ceci :
    .dans le .h, ajout de ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tagRECT StockRect;
    .dans le .cpp, dans la fonction DessinBouton(...), apres la déclaration concernant le tagRect pour le dessin du bouton :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
            // On détermine les coordonnées auxquelles on veut dessiner le
            //bouton :
            pRect.left = arect->left + 963;
            pRect.top = arect->top + 10;
            pRect.right = arect->left + 980;
            pRect.bottom = arect->top + 24;
    --->
            //Stock des coordoonnées du Rect représentant le bouton...
            StockRect.left = pRect.left;
            StockRect.top = pRect.top;
            StockRect.right = pRect.right;
            StockRect.bottom = pRect.bottom;
    et donc les gestion des messages seraient ceci :
    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
     
    void __fastcall TForm7::OnNCLBUTTONDOWN(TMessage& msg)
    {
    tagPOINT point;
    point.x = msg.LParamLo;
    point.y = msg.LParamHi;
    if (PtInRect(&StockRect, point))
    {
            DessinBouton(1);
    }
    else
    {
            DessinBouton(0);
    this->DefaultHandler(&msg);
    }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm7::OnNCLBUTTONUP(TMessage& msg)
    {
    tagPOINT point;
    point.x = msg.LParamLo;
    point.y = msg.LParamHi;
    if (PtInRect(&StockRect, point))
    {
            DessinBouton(0);
    }
    else
    {
            this->DefaultHandler(&msg);
    }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm7::OnNCMOUSEMOVE(TMessage& msg)
    {
    tagPOINT point;
    point.x = msg.LParamLo;
    point.y = msg.LParamHi;
    if (!PtInRect(&StockRect, point))
    {
            DessinBouton(0);
    }
    this->DefaultHandler(&msg);
    }
    //---------------------------------------------------------------------------
    Voili, voilou...
    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 Quelques progres...
    Voici quelques modifications, qui permettent que le bouton suive bien lorsque la fenêtre est redimensionnée.
    Mais surtout, lors du click() sur le bouton, la position de la souris semble effectivement bien repérée quelle que soit la position du bouton.
    Il me reste a travailler pour les TForms 'spéciales', pour celles ayant comme valeur a BorderStyle autre chose que bsSizeable.
    .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
     
    private:	// Déclarations de l'utilisateur
    int State;
    int nbButtons;
    int nbEspace;
            tagRECT StockRect;
     
            void __fastcall DessinBouton(int AState);
            void __fastcall CalculTailleCB(HWND aH, tagRECT *pRect);
     
            void __fastcall OnNCLBUTTONDOWN(TMessage& msg);
            void __fastcall OnNCLBUTTONUP(TMessage& msg);
            void __fastcall OnNCMOUSEMOVE(TMessage& msg);
     
     
            BEGIN_MESSAGE_MAP
                    MESSAGE_HANDLER(WM_NCLBUTTONDOWN,TMessage,OnNCLBUTTONDOWN)
                    MESSAGE_HANDLER(WM_NCLBUTTONUP,TMessage,OnNCLBUTTONUP)
                    MESSAGE_HANDLER(WM_NCMOUSEMOVE,TMessage,OnNCMOUSEMOVE)
            END_MESSAGE_MAP(TForm)
    .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
     
    void __fastcall TfrmSkin::DessinBouton(int AState)
    {
    State = AState;
            HDC hdc;
            HWND whdc;
            whdc = this->Handle;
            //
            tagRECT *arect = new tagRECT;
            //
            tagRECT pRect; //positionnement bouton
            // On détermine les coordonnées auxquelles on veut dessiner le
            //bouton :
            CalculTailleCB(whdc, &pRect);
     
            tagRECT topRect; //positionnement de la barre haut
            tagRECT bottomRect; //positionnement de la barre bas
     
            //On alimente le pointeur 'arect' avec les coordonnées de toute la fenêtre
            //c'est a dire la zone client classique - accessible par la Canvas d'une TForm par ex -
            //mais aussi toutes les parties 'externes' telles que la barre de titre :
            GetWindowRect(whdc, arect);
     
            //Stock des coordoonnées du Rect représentant le bouton...
            StockRect.left = pRect.left - 2;
            StockRect.top = pRect.top;
            StockRect.right = pRect.right - 2;
            StockRect.bottom = pRect.bottom;
     
            //Pour les 'décorations'...du bouton
            //coordonées pour la barre du haut
            topRect.left = pRect.left + 2;
            topRect.top = pRect.top + 1;
            topRect.right = pRect.left + 14;
            topRect.bottom = pRect.top + 5;
     
            //coordonnées pour la barre du bas
            bottomRect.left = pRect.left + 2;
            bottomRect.top = pRect.top + 8;
            bottomRect.right = pRect.left + 14;
            bottomRect.bottom = pRect.top + 12;
     
            //GetWindowDC permet de récuperer une 'zone de travail complète'
            //(incluant donc la TitleBar, les Menus et Scroll-bars)
            //sur laquelle nous pourrons effectivement dessiner
            //nos éléments :
            hdc = GetWindowDC(whdc);
            //
            switch (State)
            {
                    case 0:
                    DrawFrameControl(hdc, &pRect, DFC_BUTTON, DFCS_BUTTONPUSH);
                    break;
                    case 1:
                    DrawFrameControl(hdc, &pRect, DFC_BUTTON, DFCS_PUSHED | DFCS_ADJUSTRECT);
                    break;
            }
            DrawEdge(hdc, &topRect, BDR_SUNKENINNER, BF_TOPLEFT);
            DrawEdge(hdc, &bottomRect, BDR_SUNKENINNER, BF_TOPLEFT);
     
            //
            ReleaseDC(hdc, whdc);
            delete arect;
    }
    //---------------------------------------------------------------------------
    void __fastcall TfrmSkin::CalculTailleCB(HWND aH, tagRECT *pRect)
    {
            int PosLeft;
            GetWindowRect(aH, pRect);
            int WBordure = pRect->right - pRect->left;
            int WBoutonType = GetSystemMetrics(SM_CXSIZE);
            int HBoutonType = GetSystemMetrics(SM_CYSIZE);
            int PosTop = 6;
    //
            if (!BorderIcons.Contains(biSystemMenu))
            {
                    PosLeft = WBordure - WBoutonType - 6;
            }
            else
            {
            nbButtons = 2;
            nbEspace = 2;
                    if (BorderIcons.Contains(biHelp)){ nbButtons ++; }
                    if (BorderIcons.Contains(biMaximize)){ nbButtons ++; }else { nbEspace = 4; }
                    if (BorderIcons.Contains(biMinimize)){ nbButtons ++; }else { nbEspace = 4; }
                    PosLeft = WBordure - (nbButtons * WBoutonType)- nbEspace;
            }
            pRect->left = PosLeft;
            pRect->right = PosLeft + WBoutonType;
            pRect->top = PosTop;
            pRect->bottom = PosTop + HBoutonType - 4;
    //
    }
    //---------------------------------------------------------------------------
    void __fastcall TfrmSkin::FormPaint(TObject *Sender)
    {
    DessinBouton(0);
    }
    //---------------------------------------------------------------------------
    void __fastcall TfrmSkin::FormResize(TObject *Sender)
    {
    DessinBouton(0);
    }
    //---------------------------------------------------------------------------
    void __fastcall TfrmSkin::OnNCLBUTTONDOWN(TMessage& msg)
    {
    tagPOINT point;
    point.x = msg.LParamLo;
    point.y = msg.LParamHi;
    tagPOINT apoint = ScreenToClient(point);
    point.x = apoint.x;
    if (point.x > StockRect.left && point.x < StockRect.right)
    {
            DessinBouton(1);
    }
    else
    {
            DessinBouton(0);
            DefaultHandler(&msg);
    }
    }
    //---------------------------------------------------------------------------
    void __fastcall TfrmSkin::OnNCLBUTTONUP(TMessage& msg)
    {
    tagPOINT point;
    point.x = msg.LParamLo;
    point.y = msg.LParamHi;
    tagPOINT apoint = ScreenToClient(point);
    point.x = apoint.x;
    if (point.x > StockRect.left && point.x < StockRect.right)
    {
            DessinBouton(0);
    }
    else
    {
            DefaultHandler(&msg);
    }
    }
    //---------------------------------------------------------------------------
    void __fastcall TfrmSkin::OnNCMOUSEMOVE(TMessage& msg)
    {
    tagPOINT point;
    point.x = msg.LParamLo;
    point.y = msg.LParamHi;
    tagPOINT apoint = ScreenToClient(point);
    point.x = apoint.x;
    if ( (point.x < StockRect.left || point.x > StockRect.right) )
    {
            DessinBouton(0);
    }
            DefaultHandler(&msg);
    }
    //---------------------------------------------------------------------------
    void __fastcall TfrmSkin::FormMouseMove(TObject *Sender, TShiftState Shift,
          int X, int Y)
    {
    DessinBouton(0);
    }
    //---------------------------------------------------------------------------
    Ce qui serait sympa, éventuellement, c'est que quelqu'un teste et vois si il y a quelquechose qui flanche, autre que le point que j'ai cité.
    Il reste aussi le dessin dans le bouton a améliorer...

    @+
    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 actif Avatar de cfdev
    Homme Profil pro
    Passionné
    Inscrit en
    Octobre 2004
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Passionné

    Informations forums :
    Inscription : Octobre 2004
    Messages : 220
    Points : 210
    Points
    210
    Par défaut
    pas mal ca m"interesse aussi !!
    dés que j'ai un peu de temps, je test ca...

    ++
    mcercle facturation - Logiciel de facturation Win/Mac/Linux

  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 encore un petit progrès
    Une petite modif, sur le positionnement du bouton en fonction de la propriété BorderStyle :
    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
     
    void __fastcall TfrmSkin::CalculTailleCB(HWND aH, tagRECT *pRect)
    {
            int PosLeft, PosTop, WBoutonType, HBoutonType;
            GetWindowRect(aH, pRect);
            int WBordure = pRect->right - pRect->left;
            if (this->BorderStyle == bsToolWindow)
            {
            WBoutonType = GetSystemMetrics(SM_CXSMSIZE);
            HBoutonType = GetSystemMetrics(SM_CYSMSIZE);
            }
            if (this->BorderStyle == bsSizeToolWin)
            {
            WBoutonType = GetSystemMetrics(SM_CXSMSIZE);
            HBoutonType = GetSystemMetrics(SM_CYSMSIZE);
            }
            if (this->BorderStyle == bsSingle || this->BorderStyle == bsSizeable || this->BorderStyle == bsDialog)
            {
            WBoutonType = GetSystemMetrics(SM_CXSIZE);
            HBoutonType = GetSystemMetrics(SM_CYSIZE);
            }
            if (this->BorderStyle == bsToolWindow) { PosTop = 5; }
            if (this->BorderStyle == bsSizeToolWin) { PosTop = 6; }
            if (this->BorderStyle == bsSingle || this->BorderStyle == bsDialog) { PosTop = 5; }
            if (this->BorderStyle == bsSizeable) { PosTop = 6; }
     
    //
            if (!BorderIcons.Contains(biSystemMenu))
            {
                    PosLeft = WBordure - WBoutonType - 6;
            }
            else
            {
            nbButtons = 2;
            nbEspace = 2;
            if (this->BorderStyle == bsDialog)
            {
                    PosLeft = WBordure - (nbButtons * WBoutonType)- 4;
            }
            if (this->BorderStyle == bsToolWindow)
            {
                    PosLeft = WBordure - (nbButtons * WBoutonType)- 5;
            }
            if (this->BorderStyle == bsSizeToolWin)
            {
                    PosLeft = WBordure - (nbButtons * WBoutonType)- 6;
            }
            if (this->BorderStyle == bsSizeable || this->BorderStyle == bsSingle)
            {
                    if (BorderIcons.Contains(biHelp)){ nbButtons ++; }
                    if (BorderIcons.Contains(biMaximize)){ nbButtons ++; }else { nbEspace = 4; }
                    if (BorderIcons.Contains(biMinimize)){ nbButtons ++; }else { nbEspace = 4; }
                    PosLeft = WBordure - (nbButtons * WBoutonType)- nbEspace;
            }
            }
            pRect->left = PosLeft;
            pRect->right = PosLeft + WBoutonType;
            pRect->top = PosTop;
            pRect->bottom = PosTop + HBoutonType - 4;
    //
    }
    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

  9. #9
    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
    Bon, j'ai fait quelques tests pour ce qui est du 'dessin' dans le bouton....

    Je pense qu'il est envisageable de garder les méthodes avec DrawEdge(...), afin d'obtenir des structures d'effet 3D grisées et de complémenter avec par exemple :
    .dans le .h, ajout de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void __fastcall DessinDeco(HWND aH, tagRECT *pRect);
    et dans le .cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void __fastcall TfrmSkin::DessinDeco(HDC aHDC, tagRECT *pRect)
    {
            for (int i = pRect->top + 1; i < pRect->bottom - 1; i ++)
            {
                    MoveToEx(aHDC, pRect->left + 5, i, NULL);
                    LineTo(aHDC, pRect->right, i);
            }
    }
    puis, on remplace un des deux appels a DrawEdge(...) par cette fonction en lui fournissant les coordonnées a remplir par la surface représentée par une des deux structures de type tagRect, pour cette exemple : bottomRect.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            DrawEdge(hdc, &topRect, BDR_SUNKENINNER, BF_TOPLEFT);
            //DrawEdge(hdc, &bottomRect, BDR_SUNKENINNER, BF_TOPLEFT);
    ->     //on remplace par : 
            DessinDeco(hdc, &bottomRect);
    Après ...hé bien c'est au choix et en fonction des besoins pour travailler avec MoveToEx et LineTo afin de faire ce que l'on a besoin d'afficher...
    (bon, on peut dire que je me les casses pas trop la, mais je suis déja assez content d'être arrivé ici... )

    Important :
    Il faut remplacer dans la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void __fastcall TfrmSkin::CalculTailleCB(HWND aH, tagRECT *pRect)
    la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (BorderIcons.Contains(biHelp)){ nbButtons ++; }
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (BorderIcons.Contains(biHelp) && (!BorderIcons.Contains(biMaximize)&&!BorderIcons.Contains(biMinimize)) ){ nbButtons ++; }
    Voili, voilou...

    En espérant que cela plaise...

    @ +


    //EDIT :
    You know what ?....I'm happy....lol
    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

  10. #10
    Membre actif Avatar de cfdev
    Homme Profil pro
    Passionné
    Inscrit en
    Octobre 2004
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Passionné

    Informations forums :
    Inscription : Octobre 2004
    Messages : 220
    Points : 210
    Points
    210
    Par défaut
    Testé !

    Alors Bravo ca marche impec il faudra juste améliorer le design pas la suite mais c'est super !

    ++
    Images attachées Images attachées  
    mcercle facturation - Logiciel de facturation Win/Mac/Linux

  11. #11
    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 virtuA
    Testé !

    Alors Bravo ca marche impec il faudra juste améliorer le design pas la suite mais c'est super !

    ++

    Merci...c'est cool.
    Il faut effectivement - je pense - jongler entre DrawEdge et le code dans 'DessinDeco(...)' afin d'obtenir ce qu'on veut comme dessin sur le bouton.
    A moins que quelqu'un n'ait la 'vrai' solution ? ....

    @ +
    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. ajouter des boutons dans la barre des boutons
    Par kespy13 dans le forum Eclipse Platform
    Réponses: 1
    Dernier message: 08/04/2008, 15h54
  2. Quatrième bouton sur la barre de titre d'une fenêtre
    Par Yacine95000 dans le forum MFC
    Réponses: 8
    Dernier message: 02/06/2004, 18h54

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