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 mettre un TEdit dans un PopupMenu [Sources]


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Par défaut
    Je ne sais pas si ca peux t'aider, mais moi j'ai ce code dans le dessin du popup:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
        ACanvas->Brush->Color = clWhite;
        ACanvas->Rectangle(ARect.Left+2,ARect.Top+2,ARect.Right-2,ARect.Bottom-2);
        ACanvas->TextOutA(ARect.Left+4,ARect.Top+3,N11->Caption);
     
        int length;
        AnsiString text = PopupHook->Items->Items[0]->Caption.SubString(1,PosCurseur);
        length = ACanvas->TextWidth(text);
        PopupHook->Items->Items[2]->Caption = text;
        PopupHook->Items->Items[3]->Caption = IntToStr(length);
     
        ACanvas->Pen->Color = clBlack;
        ACanvas->MoveTo(ARect.Left+3+length,ARect.Top+5);
        ACanvas->LineTo(ARect.Left+3+length,ARect.Bottom-5);
    Et je n'ai pas de problème de positionnement du curseur...

    Pour le scintillement, il vient surement du fait que tu dois redessiner le carré puis le carret maison alors qu'ils ne devrai rien faire.( c'est juste une hypothèse)

  2. #2
    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,

    Et ben ... je me demande ya pas une petite poupée avec des épingles piquées partout dedans, parceque j'ai essayé pleins de choses diverses et je ne trouve pas 'mieux' que la solution utilisée avec ma petite fonction 'CalculPos' et le coefficient 'mystérieux' ( *1.28 ).
    J'ai juste modifié une tout petite chose dans le OnAdvancedDrawItem, afin de répondre au positionnement du texte lors du TextRect:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CurPos = CalculPos(ACanvas, Index) + 3;
    C'est pas très glorieux finalement comme truc, j'ai trouvé cela plus a force de tests laborieux qu'autre chose.

    Je ne sais pas pas pourquoi ton code ne fonctionne pas tout a fait sur mon pc, bandit boy

    Eventuellement, si qqu'un est très patient et peut tester, histoire de ...

    Merci,
    @ +

  3. #3
    Membre éclairé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Par défaut
    Bonjour,

    Je sais que cela est un vieux post, mais ma question est en rapport direct avec le problème soulevé ici.

    Je voudrais utiliser un popup menu avec des control à l'intérieur mais ne pas me limiter à un pseudo TEdit refait à la main.

    J'ai alors utilisé la méthode PaintTo pour affiché mes controls à l'écran mais j'ai un problème au niveau du hook. Le programme récupère bien le hook mais rien ne se passe quand j'essaie de renvoyer le message au control. En affichant les messages réceptionné, j'ai vu que lParam est différent suivant que l'on scrute un popupmenu ou un TEdit.

    Voici ce que j'obtient avec mon popup menu (le rafraichissement n'est pas encore codé).



    Je n'ai pas utilisé de DLL et ce code est directement dans le fichier cpp de ma TForm. Je n'ai mis que la partie du code qui me semble utile car le code fait partie d'une application et n'est pas testé sur une fiche spécial.
    Le HOOK:
    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
    //struct pour le hook
    typedef struct _TDataHook
    {
            HHOOK KeyHookHandle;   // handle du hook clavier
            HHOOK CBTHookHandle;   // handle du hook CBT
            HWND hDestWindow;
    } TDataHook;
     
    //variables pour le hook
    HANDLE MemPartagee;            // handle de la zone de mémoire partagée
    TDataHook *VueDonnees;         // pointeur vers la zone de mémoire
    HINSTANCE HInst;               // handle d'instance de la DLL
    DWORD ThId;                    // récupération de l'ID du thread 'appellant'
     
    //Déclaration des fonctions de la DLL
    LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam); // fonction hook du clavier
    LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam); // fonction hook de destruction de control
                     int __stdcall InitHook(HWND hDest); // fonction initialisant le hook
                     int __stdcall EndHook(); // fonction mettant fin au hook
     
    #pragma argsused
    //---------------------------------------------------------------------------
    int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
    {
    HInst = hinst;
    switch (reason)
           {
           case DLL_PROCESS_ATTACH : // à la création de l'instance de la DLL
    		  // Attachement d'une zone de mémoire partagée (notez le cast)
                MemPartagee = CreateFileMapping((HANDLE)0xFFFFFFFF, // On map un espace mémoire
                                                NULL, // Pas d'informations de sécurité
                                                PAGE_READWRITE, // Partage en lecture/écriture
                                                0, // Taille de la zone réservée sur 64 bits (32 bits de poid fort)
                                                sizeof(TDataHook), // 32 bits de poids faible
                                                "HookPopup"); // Nom de la zone réservée
     
                      // Création d'une vue pour pouvoir accéder à la zone de mémoire partagée (notez le cast)
                VueDonnees = (TDataHook *)(MapViewOfFile((HANDLE)MemPartagee, // Zone sur laquelle créer la vue
                                           FILE_MAP_WRITE, // Mode d'accès en lecture/écriture
                                           0, 0, // Offset de début de la vue sur 64 bits
                                           0)); // Taille de la vue (0 = tout)
                break;
           case DLL_PROCESS_DETACH :
                UnmapViewOfFile((LPVOID)VueDonnees);
                CloseHandle(MemPartagee);
                break;
           default : break;
           }
    return 1;
    }
    //---------------------------------------------------------------------------
    LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
    {
    PostMessage(VueDonnees->hDestWindow, WMAP_SENDSMSG, wParam, lParam); // envoie du message vers la fonction de réception de l'application
    return CallNextHookEx(VueDonnees->KeyHookHandle,nCode, wParam, lParam); // envoie le message au prochain hook présent dans la chaine
    }
    //---------------------------------------------------------------------------
    LRESULT CALLBACK CBTProc(int nCode,WPARAM wParam,LPARAM lParam)
    {
    if (nCode == HCBT_DESTROYWND) // si on change de control, on arrête le hook
       {
       PostMessage(VueDonnees->hDestWindow, WMAP_INITHOOKMSG, 0, 0); // on prévient l'application de la fin du hook
       EndHook(); // le hook est stoppé
       }
    return CallNextHookEx(VueDonnees->CBTHookHandle, nCode, wParam, lParam);
    }
    //---------------------------------------------------------------------------
    int __stdcall InitHook(HWND hDest)
    {
    if (VueDonnees == NULL) // si aucun hook n'existe
       {
       VueDonnees = new _TDataHook(); // on crée une nouvelle structure
       }
    int Result;
    try {
        ThId = GetCurrentThreadId(); // on garde une trace du thread responsable du hook
        VueDonnees->KeyHookHandle = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProc,NULL, ThId); // on utilise le hook clavier pour récupérer les commandes
        VueDonnees->CBTHookHandle = SetWindowsHookEx(WH_CBT,(HOOKPROC)CBTProc,NULL, ThId); // on utilise le hook permettant de vérifier le changement de control actif
        VueDonnees->hDestWindow = hDest; // on stocke l'initiateur de la demande
        PostMessage(VueDonnees->hDestWindow, WMAP_INITHOOKMSG, 0, 0); // informe l'application que le hook est initialisé
        Result = 0;
        }
    catch (...)
          {
          Result = 1;
          }
    return Result;
    }
    //---------------------------------------------------------------------------
    int __stdcall EndHook()
    {
       UnhookWindowsHookEx(VueDonnees->KeyHookHandle); // on arrête les 2 hooks
       UnhookWindowsHookEx(VueDonnees->CBTHookHandle);
    return 0;
    }
    Le .hpp
    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
    #define WMAP_INITHOOKMSG WM_APP + 1
    #define WMAP_SENDSMSG WM_APP + 2
    class TForm1 : public TForm
    {
    __published:	// Composants gérés par l'EDI
     
    ...
     
    private:	// Déclarations de l'utilisateur
            void __fastcall LanceHook(TWMNoParams &p);
            void __fastcall RecepMessHook(TMessage &msg);
    // Déclaration des fonctions de la DLL
            BEGIN_MESSAGE_MAP
                            MESSAGE_HANDLER(WMAP_INITHOOKMSG, TWMNoParams, LanceHook)
                            MESSAGE_HANDLER(WMAP_SENDSMSG, TMessage, RecepMessHook)
            END_MESSAGE_MAP(TForm)
     
            bool HookLance;
            TWinControl *ControlActif;
    public:		// Déclarations de l'utilisateur
    	__fastcall TForm1(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    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
    //---------------------------------------------------------------------------
    void __fastcall TForm1::LanceHook(TWMNoParams &p)
    {
    if (HookLance) // permet de commuter l'état du hook
       {
       HookLance = false;
       }
    else {
         HookLance = true;
         }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::RecepMessHook(TMessage &msg)
    {
    ControlActif->Perform(WM_KEYDOWN, msg.WParam, msg.LParam); // renvoie des messages clavier vers le control concerné
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::PopupMenu1Popup(TObject *Sender)
    {
    if (HookLance != true) // si le hook est arrêté
       {
       InitHook(Form1->Handle); // on l'initialise
       }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::N2MeasureItem(TObject *Sender, TCanvas *ACanvas,
          int &Width, int &Height)
    {
    TWinControl *tempcontrol = (TWinControl *)CompList->Items[((TMenuItem *)Sender)->Tag];
    ControlActif = tempcontrol;
    Width = tempcontrol->Width - 10; // on donne la taille du control dessiné au menuitem
    Height = tempcontrol->Height;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::N2AdvancedDrawItem(TObject *Sender, TCanvas *ACanvas,
          TRect &ARect, TOwnerDrawState State)
    {
    if (HookLance != true) // si le hook est arrêté
       {
       InitHook(Form1->Handle); // on l'initialise
       }
    TWinControl *tempcontrol = (TWinControl *)CompList->Items[((TMenuItem *)Sender)->Tag];
    ControlActif = tempcontrol;
    ACanvas->Lock();
    tempcontrol->PaintTo(ACanvas, 0, 0);
    ACanvas->Unlock();
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::N2DrawItem(TObject *Sender, TCanvas *ACanvas,
          TRect &ARect, bool Selected)
    {
    if (HookLance != true) // si le hook est arrêté
       {
       InitHook(Form1->Handle); // on l'initialise
       }
    TWinControl *tempcontrol = (TWinControl *)CompList->Items[((TMenuItem *)Sender)->Tag];
    ControlActif = (TWinControl *)tempcontrol;
    ACanvas->Lock();
    tempcontrol->PaintTo(ACanvas, 0, 0);
    ACanvas->Unlock();
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
    {
    if (HookLance == true)
       {
       EndHook(); // on arrête le hook si on ferme l'application
       }
    delete CompList;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::PopupMenu1Popup(TObject *Sender)
    {
    if (HookLance != true) // si le hook est arrêté
       {
       InitHook(Form1->Handle); // on l'initialise
       }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
    CompList = new TList();
    // initialisation des variables
    HookLance = false; // le hook n'est pas encore actif
    CompList->Add(NULL); // L'item 0 ne comporte pas de composant pour que tag = index
    CompList->Add(CurrencyEdit1);  //1
    CompList->Add(CurrencyEdit2);  //2
    CompList->Add(Edit1);          //3
    CompList->Add(CurrencyEdit3);  //4
    CompList->Add(CurrencyEdit4);  //5
    CompList->Add(CurrencyEdit5);  //6
    CompList->Add(ColorBox1);      //7
    CompList->Add(ColorBox2);      //8
    CompList->Add(ColorBox3);      //9
    CompList->Add(ColorBox4);      //10
    CompList->Add(CurrencyEdit6);  //11
    CompList->Add(CurrencyEdit7);  //12
    CompList->Add(Edit2);          //13
    CompList->Add(CurrencyEdit8);  //14
    CompList->Add(CurrencyEdit9);  //15
    CompList->Add(ComboBox1);      //16
    CompList->Add(ColorBox5);      //17
    CompList->Add(ColorBox6);      //18
    CompList->Add(ComboBox2);      //19
    CompList->Add(Edit3);          //20
    CompList->Add(Edit4);          //21
    CompList->Add(CurrencyEdit10); //22
    CompList->Add(CurrencyEdit11); //23
    CompList->Add(CurrencyEdit12); //24
    CompList->Add(ColorBox7);      //25
    CompList->Add(CurrencyEdit13); //26
    CompList->Add(CurrencyEdit14); //27
    CompList->Add(Edit5);          //28
    CompList->Add(Edit6);          //29
    CompList->Add(CurrencyEdit15); //30
    CompList->Add(Edit7);          //31
    CompList->Add(Edit8);          //32
    CompList->Add(Edit9);          //33
    CompList->Add(ComboBox3);      //34
    CompList->Add(ComboBox4);      //35
    CompList->Add(ComboBox5);      //36
    CompList->Add(ComboBox6);      //37
    CompList->Add(CurrencyEdit16); //38
    CompList->Add(CurrencyEdit17); //39
    CompList->Add(Edit10);         //40
    CompList->Add(Edit11);         //41
    }
    Quelqu'un a une solution? Dans quels cours puis-je trouver une réponse?

    Merci

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Réponses: 13
    Dernier message: 03/10/2007, 11h25
  2. Comment mettre un GIF dans un composant RxrichEdit ?
    Par seb_homme_parfait dans le forum Composants VCL
    Réponses: 20
    Dernier message: 24/04/2006, 21h12
  3. Réponses: 13
    Dernier message: 26/08/2005, 16h34
  4. Comment mettre une icone dans un bouton ?
    Par Hokagge dans le forum MFC
    Réponses: 7
    Dernier message: 29/06/2005, 20h28
  5. COMMENT METTRE 2 CHAMPS DANS LE MEME DBLOOKUPCOMBOBOX
    Par ledevelopeur dans le forum Bases de données
    Réponses: 2
    Dernier message: 27/07/2004, 15h15

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