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 :

Créer un composant mimant le menu de sélection de couleur de microsoft Excel


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    Par défaut Créer un composant mimant le menu de sélection de couleur de microsoft Excel
    Bonjour,

    Je souhaiterais créer un composant mimant le menu de sélection de couleur de microsoft Excel: un bouton qui lorsqu'on clique dessus, affiche une matrice de 8x5 couleurs. J'ai déjà développé quelques composants en VCL en surchargeant TGraphicControl mais ici je ne sais pas si c'est le bon choix... Je ne vois pas comment lorsque je clique sur bouton afficher un menu au-dessus... Vous voyez ça me turlupine au niveau du canvas si vous me permettez l'expression
    Pourriez-vous éclairer mes pensées obscures, svp?

    Merci!
    Cordialement,
    Rodrigue

  2. #2
    Membre éclairé Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    Par défaut
    Personne ne voit comment faire ?
    En fait, il faudrait que j'affiche un popup lorsque je clique sur un bouton. Le popup serait le menu d'Excel que j'ai déjà créé...
    En gros un bouton dont je redessine le canvas -> pas très compliqué
    lorsque je clique sur ce bouton je dois afficher un menu popup mimant le menu de couleur d'Excel, j'ai besoin des évènements: OnMouseMove, OnMouseLeave, OnMouseClick ou OnMouseDown -> je bloque vraiment sur cette partie

  3. #3
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Dans quel sens "créér un composant" ?

    Peut-être qu'une form peut convenir pour cette histoire de boîte de couleurs.
    Soit en rajoutant (au plus simple) une fiche supplémentaire, soit en dérivant de TCustomForm.
    L'exploiter probablement avec :
    - BorderStyle = bsToolWindow // ou bsNone et là.....!
    - FormStyle = fsStayOnTop.

    Est-ce qu'elle doit se fermer automatiquement sur un clic et lorsque la souris sort de la zone client (donc si BorderStyle = bsNone) ?

    Sinon avec un TCustomControl... ou TGraphicControl
    - Parent = Form
    - BringToFront()
    - Objet->Visible = true

    Hélas ma version BCB3 Pro je n'ai pas OnMouseLeave... donc je suis obligé localement d'exploiter les OnMouseMove pour tester si l'objet est visible...

    A plus !

  4. #4
    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 Rodrigue
    Personne ne voit comment faire ?
    En fait, il faudrait que j'affiche un popup lorsque je clique sur un bouton. Le popup serait le menu d'Excel que j'ai déjà créé...
    En gros un bouton dont je redessine le canvas -> pas très compliqué
    lorsque je clique sur ce bouton je dois afficher un menu popup mimant le menu de couleur d'Excel, j'ai besoin des évènements: OnMouseMove, OnMouseLeave, OnMouseClick ou OnMouseDown -> je bloque vraiment sur cette partie
    Il y a quelquechose que je ne comprends pas...tu as déja crée le 'composant' et tu cherches a l'associer a l'élément de menu ? Ou c'est la création de cet éléme nt qui 'bloque' ?

  5. #5
    Membre éclairé Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    Par défaut
    Bonjour,

    Merci pour vos réponses !
    henderson, j'ai également eu l'idée de fiche. Tout fonctionne impeccablement! Le seul problème est que lorsque je clique sur mon bouton, celui m'ouvre la form (contenant la palette de couleur) et donc, ma form principale perd le focus donc son titre se change en gris ... Il faut le voir mais quand on le sait, on se rend compte qu'il y a quelque chose qui cloche !

    Donc question, y-a-t'il moyen d'ouvrir une fiche secondaire sans faire perdre le focus à la fiche principale ou en tout cas qu'on le voit pas ?
    Sinon, je vais essayer d'afficher mon composant palette sur la fiche parent de mon composant bouton ... Je ne connaissais pas la fonction BringToFront(), cela devrait fonctionner aussi mais alors je n'ai plus à ma disposition, la méthode DeActivate pour fermer automatiquement le composant, il va falloir que je passe par d'autres fonctions, p-e OnEnter ou OnExit our alors faire un MESSAGE_MAP pour voir les messages lorsque on sort du composant ...

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Avec ma version BCB3 Pro je suis assez limité.

    Cela dit, s'il s'agit effectivement d'un composant, il doit présenter une certaine autonomie.

    Si on suppose que ce composant fait partie d'une palette de composants, que l'utilisateur va pouvoir placer n'importe où sur la fiche (donc aussi sur un composant enfant de la fiche), il va falloir controler son parent pour que ce dernier soit toujours la fiche. Voici la classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class jColorPanel : public TCustomControl
    {
    public :
        __fastcall jColorPanel(TComponent *Owner);
        __fastcall ~jColorPanel();
        void __fastcall Paint();
     
        //Cette méthode aveugle jColorPanel::Show() héritée de TCustomControl
        //Par contre TCustomControl::Show() reste accessible depuis jColorPanel
        //Le paramètre sert à se positionner par rapport à l'objet depuis lequel
        //l'ouverture de la boite est commandée 
        void __fastcall Show(TWinControl *W);
    };

    Voici les méthodes :

    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
    __fastcall jColorPanel::jColorPanel(TComponent *Owner)
        : TCustomControl(Owner)
    {
    //Pour la construction
    if(Owner->InheritsFrom(__classid(TWinControl))) Parent = (TWinControl*)Owner;
    SetBounds(0,0, 60,200);
    }
     
    __fastcall jColorPanel::~jColorPanel()
    {
    }
     
    void __fastcall jColorPanel::Show(TWinControl *W)
    {
    //Pour obliger le composant à se dessiner au dessus des autres
    //On commence par s'assurer d'avoir le bon Parent
    while(Parent->InheritsFrom(__classid(TForm)) == false)
        {
        Parent = Parent->Parent;
        }
    //Par dessus les autres objets
    BringToFront();
     
    //Calcul du positionnement (peut-être qu'il y a plus simple ???)
    TWinControl *Pa = W->Parent;
    int left = W->Left;
    int top = W->Top;
    while(Pa->InheritsFrom(__classid(TForm)) == false)
        {
        left = left + Pa->Left;
        top = top + Pa->Top;
        Pa = Pa->Parent;
        }
    SetBounds(left + W->Width, top, 60, 200);
     
    //ici, on va faire une pierre deux coups en sollicitant la méthode Show() héritée de TCustomControl
    //- Visible devient true
    //- Paint est sollicité
    TCustomControl::Show();
    }
     
    void __fastcall jColorPanel::Paint()
    {
    //Le dessin pour les couleurs
    //Ici c'est juste pour la démo
    Canvas->Brush->Color = (TColor)0x00FFEFDF;
    Canvas->FillRect(Rect(0,0,Width,Height));
    }
    J'ai testé (avec toolbar, plusieurs panels et 3 boutons) en essayant, en particulier, de pièger le raisonnement :

    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
    jColorPanel *ColorPanel;
     
    //--
    __fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
    {
    ColorPanel = new jColorPanel(this);
    ColorPanel->Hide();
    //Petite tentative pour piéger le Parent
    ColorPanel->Parent = ToolBar1; //En fait c'est un coup d'épée dans l'eau
    }
     
    //--Ce bouton est sur une toolbar
    void __fastcall TForm1::SpeedButton1MouseDown(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
    ColorPanel->Show((TWinControl*)Sender);
    }
     
    //--Ce bouton est posé sur la fiche
    void __fastcall TForm1::SpeedButton2MouseDown(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
    ColorPanel->Show((TWinControl*)Sender);
    }
     
    //--Ce bouton est au somment d'un empilement de panels
    void __fastcall TForm1::SpeedButton3MouseDown(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
    ColorPanel->Show((TWinControl*)Sender);
    }
    //--
    Voilà donc ce qui fonctionne. Pour le reste, il suffirait de faire :

    depuis le composant lui-même : Hide();
    à partir d'autres composants : ColorPanel->Hide();

    Probablement que l'on peut modifier le raisonnement. Ce n'est qu'un exemple en espérant que celà puisse être un bon début de solution !

    A plus !

  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
    Bonjour vous deux....(et aux autres aussi )

    J'ai une proposition presque sérieuse a faire....
    Je pars d'un TToolButton, dans une TToolBar, pour lequel j'ai mis la propriété Style a tbsDropDown.
    J'affecte un TPopupMenu a la TToolBar, pour lequel je met la propriété OwnerDraw a true.
    Je ne met qu'un seul TMenuItem pour ce PopupMenu.

    Voila en gros pour ' l'environnement '...

    On lui affecte une taille de manière 'arbitraire', dans le OnMeasureItem :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void __fastcall TForm2::colorITMeasureItem(TObject *Sender,
          TCanvas *ACanvas, int &Width, int &Height)
    {
    Width = 100;
    Height = 100;
    }
    Dans le OnAdvancedDrawItem du TMenuItem, on peut imaginer dessiner des 'boutons' comme pour l'ajout d'un bouton dans la barre de titre d'une fenêtre...
    Cela donnerait :
    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
     
    tagRECT prect;
    //
    prect.left = ARect.left;
    prect.top = ARect.top;
    prect.right = ARect.right - 90;
    prect.bottom = ARect.bottom - 80;
            DrawFrameControl(ACanvas->Handle, &prect, DFC_BUTTON, DFCS_BUTTONPUSH);
    //
    prect.left = ARect.left + 24;
    prect.top = ARect.top;
    prect.right = ARect.right - 66;
    prect.bottom = ARect.bottom - 80;
            DrawFrameControl(ACanvas->Handle, &prect, DFC_BUTTON, DFCS_BUTTONPUSH);
    //
    //etc, etc....
    Après il faut repèrer la position de la souris au moment du click sur le TMenuItem, mais peut être peut on imaginer utiliser quelquechose comme
    PtInRect(...) si toutes les coordonées délimitants les carrés de couleur sont correctement renseignées; on pourra renseigner les paramètre 'RECT' de la fonction et savoir quelle zone du TMenuItem a été cliquée...

    Bon, je vais appronfondir cette idée, en espérant sortir qqchose de bon.
    D'ici, on aura peut être tous des cheveux blancs mais bon...

    @ +

Discussions similaires

  1. Menu de sélection de couleur
    Par Mythrandil dans le forum Windows Presentation Foundation
    Réponses: 9
    Dernier message: 19/08/2009, 15h32
  2. [List] Créer mon composant
    Par soad dans le forum Composants
    Réponses: 3
    Dernier message: 02/12/2005, 08h00
  3. Quel est le composant sélectionné /DBGrid et multi sélection
    Par lol_adele dans le forum Composants VCL
    Réponses: 17
    Dernier message: 02/09/2005, 09h27
  4. [vb.net] Impossible de créer le composant ActiveX [win98]
    Par arnolem dans le forum Windows Forms
    Réponses: 10
    Dernier message: 12/07/2005, 12h09
  5. Intercepter un Message Windows ? Créer un Composant Grille !
    Par TOTO32 dans le forum Composants VCL
    Réponses: 6
    Dernier message: 21/07/2004, 13h41

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