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 Comment mettre un TEdit dans un PopupMenu
    Tout est dans le titre, j'aimerais donner la possibilité à l'utilisateur de saisir un texte dans un PopupMenu.

    J'ai tenté de modifier la propriété Parent d'un TEdit, mais le TPopupMenu et le TMenuItem ne sont pas des composants permettant de contenir d'autres composants.

    Est ce que quelqun connait un moyen de contourner ce problème ou d'obtenir une zone de saisie dans un pop up.

    Merci

  2. #2
    Membre Expert
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Par défaut
    Bonsoir,

    j'avais tenté la même chôse un jour, mais pas avec un TPopUpMenu, j'ai dû construir un nouveau composant.

    J'ai créé un nouvelle form, j'ai ajouter des TLabels et j'ai fais ceci.

  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
    Citation Envoyé par bandit boy
    Est ce que quelqun connait un moyen de contourner ce problème ou d'obtenir une zone de saisie dans un pop up.
    Bonsoir,

    J'ai essayé, pour 'jouer', de contourner avec un Hook afin de capter la saisie de l'utilisateur tout en gardant le PopupMenu 'deroulé' ... ce n'est pas encore tout a fait au point
    La saisie s'affiche dans le caption du PopupMenu mais a chaque lettre saisie, il me quadruple (au moins) le caractère saisi.
    De plus, il faudrait stopper le Hook clavier dès que le Popup est fermé, ce qui n'est pas encore le cas la.
    Je poste tout de même le code, même si c'est loin d'être parfait. Ca permettra peut être d'avancer ...
    . côté 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
    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
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
     
    //---------------------------------------------------------------------------
     
    #include <vcl.h>
    #include <windows.h>
    #pragma hdrstop
    //---------------------------------------------------------------------------
     
    //---------------------------------------------------------------------------
    //struct pour le hook
    typedef struct _TDataHook
    {
    	 HHOOK KeyHookHandle;   // Handle du hook clavier
    	 HWND hDestWindow;    // Handle de la fenêtre
    } 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'intance de la DLL
    DWORD ThId;           //  Recupération de l'ID du thread 'appellant'
     
    // Déclaration des fonctions de la DLL
    LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam);
     
    //fonction a appeller depuis les fiches
    extern "C" __declspec(dllexport) __stdcall int InitHook(HWND hDest, TPopupMenu* aMenu);
    extern "C" __declspec(dllexport) __stdcall int EndHook();
     
    //var
    TPopupMenu* baseMenu;
    String nCaption;
    int PosX, PosY;
     
    #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)
    {
    String S;
    	switch (wParam)
    	{
    	case VK_ESCAPE:
     
    	break;
    	case VK_RETURN:
    		//baseMenu->Popup(PosX, PosY);
    		//baseMenu->Items->Items[0]->Caption = nCaption;
    	break;
    	default:
    		switch (wParam)
    		{
    		case 'A':
    			S = "a";
    		break;
    		case 'B':
    			S = "b";
    		break;
    		case 'C':
    			S = "c";
    		break;
    		case 'D':
    			S = "d";
    		break;
    		case 'E':
    			S = "e";
    		break;
    		case 'F':
    			S = "f";
    		break;
    		case 'G':
    			S = "g";
    		break;
    		case 'H':
    			S = "h";
    		break;
    		case 'I':
    			S = "i";
    		break;
    		case 'J':
    			S = "j";
    		break;
    		case 'K':
    			S = "k";
    		break;
    		case 'L':
    			S = "l";
    		break;
    		case 'M':
    			S = "m";
    		break;
    		case 'N':
    			S = "n";
    		break;
    		case 'O':
    			S = "o";
    		break;
    		case 'P':
    			S = "p";
    		break;
    		case 'Q':
    			S = "q";
    		break;
    		case 'R':
    			S = "r";
    		break;
    		case 'S':
    			S = "s";
    		break;
    		case 'T':
    			S = "t";
    		break;
    		case 'U':
    			S = "u";
    		break;
    		case 'V':
    			S = "v";
    		break;
    		case 'W':
    			S = "w";
    		break;
    		case 'X':
    			S = "x";
    		break;
    		case 'Y':
    			S = "y";
    		break;
    		case 'Z':
    			S = "z";
    		break;
    		default:
    			;
    		}
    		if (nCaption != NULL)
    		{
    			nCaption = nCaption + S;
    		}
    		else
    		{
    			nCaption = S;
    		}
    		baseMenu->Items->Items[0]->Caption = nCaption;
    	break;
    	}
    return CallNextHookEx(VueDonnees->KeyHookHandle,nCode,wParam,lParam);
    }
    //---------------------------------------------------------------------------
    int __stdcall InitHook(HWND hDest, TPopupMenu* aMenu)
    {
    int Result;
    try
    {
    baseMenu = aMenu;
    PosX = baseMenu->PopupPoint.x;
    PosY = baseMenu->PopupPoint.y;
     
    ThId = GetCurrentThreadId();
    	 VueDonnees->KeyHookHandle = SetWindowsHookEx(WH_KEYBOARD,
    											 (HOOKPROC)KeyboardProc,
    												 NULL,
    											 ThId);
    	 VueDonnees->hDestWindow = hDest;
    	 Result = 0;
    }
    catch(...)
    {
    	Result = 1;
    }
    return Result;
    }
    //---------------------------------------------------------------------------
    int __stdcall EndHook()
    {
    	nCaption = "";
    	UnhookWindowsHookEx(VueDonnees->KeyHookHandle);
    return 0;
    }
    //---------------------------------------------------------------------------
    .côté fiche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    extern "C" __declspec(dllimport) __stdcall int InitHook(HWND hDest, TPopupMenu* aMenu);
    extern "C" __declspec(dllimport) __stdcall int EndHook();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void __fastcall TForm2::PopupMenuPopup(TObject *Sender)
    {
    InitHook(Form2->Handle, Form2->PopupMenu);
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm2::FormClose(TObject *Sender, TCloseAction &Action)
    {
    EndHook();	
    }
    Pour l'aspect 'extérieur' du TMenuItem, on peut imaginer travailler dans le OnDrawItem de l'élément (avec, pourquoi pas DrawEdge(...)).
    Je verrais ça plus tard,

    En espérant t'aider,
    @+

  4. #4
    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
    Bonjour et merci à tous les deux. J'ai testé vos solutions.

    Pour la solution de kmaniche c'est une idée de détourner le problème qui est sympa mais par contre, elle nécessite pas mal de travail pour retrouver la convivialité d'un vrai Popup avec les items en surbrillance et les sous-menu, mais l'idée est bonne.

    Pour la solution de Sunchaser, j'ai des problèmes d'exceptions générés lors de l'exécution et la pose du try/catch ne me permet pas de voir le fonctionnement en pas à pas. En fait, lorsque je clic droit sur ma Form2, mon Popup apparaît mais dès que je saisie une lettre, j'ai une exception et le systême se bloque. L'idée me permetterai de garder le Popup et avec un peu de mise en forme ferait croire à un TEdit.

    Les deux idées sont à développez, par contre je ne voit pas où le hook génère l'erreur, si tu as une idée Sunchaser.

  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
    Salut,

    Non, a priori, je ne sais pas cela peut bloquer.
    Néanmoins, vu que j'ai fait tourner chez moi, je n'ai pas d'erreur ...
    Je ne pourrais regarder sereinement que chez moi ce soir, désolé.
    (puisque je n'ai pas la joie de pouvoir m'occuper de programmation durant mon activité salariée ...)

    @ +

  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
    Bonsoir,

    J'ai fait qq changements, le 'truc' est plus stable en quelquesorte.
    Le problème est que, en travaillant sur la valeur retournée par LRESULT CALLBACK KeyboardProc, j'ai un réduit le 'bug' lors de la saisie ... mais pas totalement : les lettres sont doublées.


    Surement mon manque de connaissances théoriques, qui me fait passer a côté de quelquechose.
    Encore un p'tit effort a faire quoi.

    @ +

  7. #7
    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
    J'ai mis le code du hook dans mon .cpp, la déclaration dans le .h et déclaré les évènements comme il faut pour lancer le InitHook, mais j'ai une erreur lorsque j'appuie sur une touche.

    Lorsque je fais clic droit, le popup apparaît bien avec mes Items, mais quand j'appuie sur une touche, le popup affiché, j'ai une exception "Lecture à l'adresse 0".

  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
    Bonsoir,

    J'ai ajouter une petite chose dans le hook, afin d'intercepter la fermeture du popup et de lancer EndHook() ...ça donnerais 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
    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
     
    #include <vcl.h>
    #include <windows.h>
    #pragma hdrstop
    //---------------------------------------------------------------------------
     
    //---------------------------------------------------------------------------
    //struct pour le hook
    typedef struct _TDataHook
    {
    	 HHOOK KeyHookHandle;   // Handle du hook clavier
    	 HHOOK CBTHookHandle;   // handle du hook CBT
    	 HWND hDestWindow;    // Handle de la fenêtre
    } 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'intance de la DLL
    DWORD ThId;           //  Recupération de l'ID du thread 'appellant'
     
    // Déclaration des fonctions de la DLL
    LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam);
    LRESULT CALLBACK CBTProc(int nCode,WPARAM wParam,LPARAM lParam);
    //fonction a appeller depuis les fiches
    extern "C" __declspec(dllexport) __stdcall int InitHook(HWND hDest);
    extern "C" __declspec(dllexport) __stdcall int EndHook();
     
    #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;
    }
    //---------------------------------------------------------------------------
    #define WMAP_INITHOOKMSG WM_APP + 1
    #define WMAP_SENDSMSG WM_APP + 2
    LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
    {
    	switch (wParam)
    	{
    	case VK_ESCAPE:
    	case VK_RETURN:
    	PostMessage(VueDonnees->hDestWindow, WMAP_INITHOOKMSG, 0, 0);
    	EndHook();
    	break;
    	default:
    		PostMessage(VueDonnees->hDestWindow, WMAP_SENDSMSG, wParam, 0);
    	   //	return 1;
    	break;
    	}
    }
    //---------------------------------------------------------------------------
    LRESULT CALLBACK CBTProc(int nCode,WPARAM wParam,LPARAM lParam)
    {
    	if (nCode == HCBT_DESTROYWND)
    	{
    		PostMessage(VueDonnees->hDestWindow, WMAP_INITHOOKMSG, 0, 0);
    		EndHook();
    	}
    return CallNextHookEx(VueDonnees->CBTHookHandle, nCode, wParam, lParam);
    }
    //---------------------------------------------------------------------------
    int __stdcall InitHook(HWND hDest)
    {
    int Result;
    try
    {
    ThId = GetCurrentThreadId();
    VueDonnees->KeyHookHandle = SetWindowsHookEx(WH_KEYBOARD,		(HOOKPROC)KeyboardProc,
    NULL,
    ThId);
    VueDonnees->CBTHookHandle = SetWindowsHookEx(WH_CBT,				(HOOKPROC)CBTProc,
    NULL,
    ThId);
    	 VueDonnees->hDestWindow = hDest;
    	 PostMessage(VueDonnees->hDestWindow, WMAP_INITHOOKMSG, 0, 0);
    	 Result = 0;
    }
    catch(...)
    {
    	Result = 1;
    }
    return Result;
    }
    //---------------------------------------------------------------------------
    int __stdcall EndHook()
    {
    	UnhookWindowsHookEx(VueDonnees->KeyHookHandle);
    	UnhookWindowsHookEx(VueDonnees->CBTHookHandle);
    return 0;
    }
    //---------------------------------------------------------------------------
    Et pour le dessin, on pourrais penser a:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void __fastcall TForm2::Essaifrappe1AdvancedDrawItem(TObject *Sender,
    	  TCanvas *ACanvas, TRect &ARect, TOwnerDrawState State)
    {
    DrawEdge(ACanvas->Handle, &ARect, EDGE_SUNKEN, BF_RECT	);
    TRect pRect;
    pRect.top = ARect.top + 4;
    pRect.left = ARect.left;
    pRect.bottom = ARect.bottom;
    pRect.right = ARect.right;
    DrawText(ACanvas->Handle, ((TMenuItem*)Sender)->Caption.c_str(), ((TMenuItem*)Sender)->Caption.Length(), &pRect, DT_CENTER | DT_VCENTER);
    }
    //---------------------------------------------------------------------------
    dans le OnAdvancedDrawItem de l'objet, avec la propriété OwnerDraw a true.
    (a améliorer et retravailler bien évidemment, au niveau 'esthétique').

    Néanmoins ... dois-je l'avouer ... ben je n'ai pas encore reglé le problème du bégaiement de mon code

    Et pis, ça, ça m'enerve ...
    J'ai toujours deux lettres quand j'en tape une !

    Bon, comme on dis dans un jeu célèbre : je fais appel au vote du public.
    Ceux qui savent, zavez le droit de m'aider ...

    @ +

  9. #9
    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
    Il y a des choses que je ne piges pas dans ton code. Je l'ai copié/collé dans ma fiche, mais j'ai des erreurs sur des fonctions non déclarés ou des des objets non déclarés .

    PopupHookPopup() et PopupHook.

    Et je dois avouer que du coup, j'ai plein de code dans tous les sens et j'ai du mal à m'y retrouver .

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

    Effectivement ...PopupHook est le nom (peut être pas tres bien choisi) du TPopupMenu sur lequel je travaille.
    Et vu que je travaille sur l'évènement OnPopup du TPopupMenu, on a donc une 'fonction' qui s'appelle :
    PopupHookPopup

    ...
    Il faut comprendre que je suis dans un projet incroyablement bordelique ( , il faut le voir pour le croire), puisque c'est la ou je 'travaille' sur tout les sujets que je trouve sur dvp.
    Un fourre-tout de code, d'essai divers et variés; et maintenant, avec le BDS, j'ai la même avec Delphi
    Donc j'évite de laisser PopupMenu1 par exemple en nom d'objet.

    @ +

  11. #11
    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
    J'ai toujours deux lettres quand j'en tape une !
    Bonjour,

    Ben, j'ai toujours pas résolu ce problème.
    Le caractère récupéré est bien le bon, c.a.d que j'ai bien une lettre et une seule suite a la saisie au clavier.
    Mais, c'est lors de l'ajout de ce caractère a la valeur du caption que la lettre est doublée !

    J'ai vraimment essayé un paquet de truc (que je vais peut être pas poster ici tout de même), mais je suis surement passé a côté de l'essentiel (?).

    Je sais plus trop quoi faire...

    Quelqu'un pour me donner un petit cours ?

    Merci d'avance,
    @ +

  12. #12
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349

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

    Effectivement, tres heureux d'avoir une réponse sur ce sujet, je n'imaginais pas a priori qq chose comme cela ...
    Je teste cela dès que possible.

    Merci
    @ +

  14. #14
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Par défaut
    Une autre remarque, quand on installe un filtre clavier, on doit gérer soit même l'appui sur les touches SHIFT, ALT, CTRL, de manière par exemple, à retranscrire l'appui sur la touche '2' en '2, 'é' ou '~' selon les cas.
    Tu peux mémoriser l'état enfoncé ou non de ces trois touches à chaque fois qu'elles sont sollicitées (dans ta fonction de hook) ou plus sûr, utiliser la fonction ::GetKeyState() de l'API Windows.

  15. #15
    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,
    J'ajoute ici (je me permet...)une de mes interrogations postée précédemement du côté de a FAQ. Il y a moins de 'passages' de ce côté que dans le forum C++Builder directement, c'est pourquoi je tente ce doublon:
    Bonsoir,

    Pour 'peaufiner' un peu le truc, comme suggéré aussi par bandit boy, j'ai essayé de répondre aux touches VK_LEFT et VK_RIGHT; ceci dans l'idée de déplacer un curseur dans le texte que l'on est en train de saisir, a la manière de ce qui se fait dans une zone de saisie classique.
    J'ai donc essayé d'afficher un 'curseur' identique a celui d'un TEdit, avec CreateCaret(...), SetCaretPos(...), ShowCaret(...), etc... mais je commence a penser que c'était une vaine initiative et que l'objet de destination - le TMenuItem - ne peut pas supporter cela.

    Est ce effectivement impossible ?

    Merci d'avance,
    @ +
    Pour résumer, peut on agir dans le cas présenté par ce sujet avec CreateCaret (etc...) sur un TMenuItem ?

    Merci d'avance pour vos avis éclairés,

  16. #16
    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
    Salut Sunchaser,
    Je suis parti du dernier code que tu as fait et j'ai modifié l'affichage pour simuler un TEdit dans la zone du popup avec le curseur.

    Pour la gestion de la saisie et de la position du curseur
    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
     
    //---------------------------------------------------------------------------
    void __fastcall TForm2::RecepS(TMessage &msg)
    {
     
        char c = msg.WParam;
        int i = msg.LParam;
     
        if(c != VK_BACK     //Backspace key
        && c != VK_TAB      //Tab key
        && c != VK_CLEAR	//Clear key
        && c != VK_RETURN   //Enter key
        && c != VK_SHIFT	//Shift key
        && c != VK_CONTROL  //Ctrl key
        && c != VK_MENU	//Alt key
        && c != VK_CAPITAL  //Caps Lock key
        && c != VK_LEFT	//Left Arrow key
        && c != VK_UP	//Up Arrow key
        && c != VK_RIGHT	//Right Arrow key
        && c != VK_DOWN	//Down Arrow key
        && c != VK_DELETE	//Delete key
        )
        {
            PosCurseur++;
            switch (i)
            {
    	    case 0:
    	       	PopupHook->Items->Items[0]->Caption = PopupHook->Items->Items[0]->Caption.Insert(LowerCase(c),PosCurseur);
         	        break;
    	    case 1:
    		PopupHook->Items->Items[0]->Caption = PopupHook->Items->Items[0]->Caption.Insert(c,PosCurseur);
    	        break;
    	    default:
    	        break;
            }
       }
       if(c == VK_BACK) //Backspace key
       {
           AnsiString Txt = PopupHook->Items->Items[0]->Caption;
           Txt.Delete(PosCurseur,1);
           PopupHook->Items->Items[0]->Caption = Txt;
           PosCurseur--;
       }
       else if(c == VK_LEFT) //Left Arrow key
       {
           if(PosCurseur > 0)
               PosCurseur --;
       }
       else if(c == VK_RIGHT) //Right Arrow key
       {
           if(PosCurseur < PopupHook->Items->Items[0]->Caption.Length())
               PosCurseur ++;
       }
       else if(c == VK_DELETE)
       {
           AnsiString Txt = PopupHook->Items->Items[0]->Caption;
           Txt.Delete(PosCurseur+1,1);
           PopupHook->Items->Items[0]->Caption = Txt;
       }
     
       PopupHook->Items->Items[1]->Caption = "Pos = " + IntToStr(PosCurseur);
    }
    pour le dessin
    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
     
    //---------------------------------------------------------------------------
    void __fastcall TForm2::N11DrawItem(TObject *Sender, TCanvas *ACanvas,
          TRect &ARect, bool Selected)
    {
     
        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);
    }
    //---------------------------------------------------------------------------

    L'ennuie c'est que ca reste du dessin et que je fais un trait pour dessiner le curseur, mais l'item n'étant pas rafraichi, je ne le fait pas clignoté comme un vrai TEdit.

    Si tu as une idée...

  17. #17
    Expert confirmé

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Par défaut
    Mais ou va-t-il chercher tout ca !!!



    T'es le roi Sunchaser

  18. #18
    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
    Salut,
    Pour gérer le déplacement j'étais parti sur cette solution:
    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 TForm2::RecepS(TMessage &msg)
    {
     
        char c = msg.WParam;
        int i = msg.LParam;
     
        if(c != VK_BACK     //Backspace key
        && c != VK_TAB      //Tab key
        && c != VK_CLEAR	//Clear key
        && c != VK_RETURN   //Enter key
        && c != VK_SHIFT	//Shift key
        && c != VK_CONTROL  //Ctrl key
        && c != VK_MENU	//Alt key
        && c != VK_CAPITAL  //Caps Lock key
        && c != VK_LEFT	//Left Arrow key
        && c != VK_UP	//Up Arrow key
        && c != VK_RIGHT	//Right Arrow key
        && c != VK_DOWN	//Down Arrow key
        && c != VK_DELETE	//Delete key
        )
        {
            PosCurseur++;
            switch (i)
            {
    	    case 0:
    	       	PopupHook->Items->Items[0]->Caption = PopupHook->Items->Items[0]->Caption.Insert(LowerCase(c),PosCurseur);
         	        break;
    	    case 1:
    		PopupHook->Items->Items[0]->Caption = PopupHook->Items->Items[0]->Caption.Insert(c,PosCurseur);
    	        break;
    	    default:
    	        break;
            }
       }
       if(c == VK_BACK) //Backspace key
       {
           AnsiString Txt = PopupHook->Items->Items[0]->Caption;
           Txt.Delete(PosCurseur,1);
           PopupHook->Items->Items[0]->Caption = Txt;
           PosCurseur--;
       }
       else if(c == VK_LEFT) //Left Arrow key
       {
           if(PosCurseur > 0)
               PosCurseur --;
       }
       else if(c == VK_RIGHT) //Right Arrow key
       {
           if(PosCurseur < PopupHook->Items->Items[0]->Caption.Length())
               PosCurseur ++;
       }
       else if(c == VK_DELETE)
       {
           AnsiString Txt = PopupHook->Items->Items[0]->Caption;
           Txt.Delete(PosCurseur+1,1);
           PopupHook->Items->Items[0]->Caption = Txt;
       }
     
       PopupHook->Items->Items[1]->Caption = "Pos = " + IntToStr(PosCurseur);
    }
    Tester la touche saisie et insérer ou supprimer.

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

    Oui effectivement, merci bandit boy, j'ai déja honteusement plagié cette idée dans ton code pour le déplacement ...
    Reste que j'ai toujours du mal a positionner le curseur, en tout cas dans la situation dans laquelle je me trouve; ça serait plus clair si je postais je code ... je sais.
    Mais la ça ressemble a un champs de bataille, alors je vais attendre d'avoir fait un peu le ménage

    @ +

  20. #20
    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 pottiez
    T'es le roi Sunchaser
    Bonsoir,
    Merci bien pottiez ... c'est trop gentil ... mais je crois qu'en ce moment je suis plutôt le roi des galériens : impossible de positionner le 'caret maison' tout a fait correctement.
    En plus de ça, la méthode que j'ai adopté me provoque un scintillement plus ou moins prononcé. Je croyais pouvoir régler cela d'ailleurs.
    J'ai la désagréable sensation d'être tout proche du résultat cherché, sans jamais pouvoir l'obtenir.
    Un bout de code malgré tout :
    La Fiche
    .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
    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
     
    //---------------------------------------------------------------------------
     
    #ifndef UnitMFormH
    #define UnitMFormH
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <Menus.hpp>
    #include <ComCtrls.hpp>
    #include <ExtCtrls.hpp>
    //---------------------------------------------------------------------------
    #define WMAP_INITHOOKMSG WM_APP + 1
    #define WMAP_SENDSMSG WM_APP + 2
    //---------------------------------------------------------------------------
    class TMForm : public TForm
    {
    __published:	// Composants gérés par l'EDI
    	TPopupMenu *PopupHook;
    	TMenuItem *MMenuItem;
    	TStaticText *StaticText1;
    	TStatusBar *StatusBar1;
    	TEdit *Edit1;
    	TStaticText *StaticText2;
    	void __fastcall FormCreate(TObject *Sender);
    	void __fastcall MMenuItemClick(TObject *Sender);
    	void __fastcall MMenuItemAdvancedDrawItem(TObject *Sender, TCanvas *ACanvas,
              TRect &ARect, TOwnerDrawState State);
    	void __fastcall MMenuItemMeasureItem(TObject *Sender, TCanvas *ACanvas,
              int &Width, int &Height);
    	void __fastcall PopupHookPopup(TObject *Sender);
    	void __fastcall FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift);
    private:	// Déclarations de l'utilisateur
    		void __fastcall LanceHook(TWMNoParams &p);
    		void __fastcall RecepMessHook(TMessage &msg);
    		void __fastcall SwichCaption(TMenuItem *AMenuItem);
    		int __fastcall CalculPos(TCanvas *Canva, int Index);
     
     
     
    		BEGIN_MESSAGE_MAP
    				MESSAGE_HANDLER(WMAP_INITHOOKMSG, TWMNoParams, LanceHook)
    				MESSAGE_HANDLER(WMAP_SENDSMSG, TMessage, RecepMessHook)
    		END_MESSAGE_MAP(TForm)
     
    		bool HookLance;
    		bool Dessin;
    		int CurPos;
    		int Index;
     
    public:		// Déclarations de l'utilisateur
    	__fastcall TMForm(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TMForm *MForm;
    //---------------------------------------------------------------------------
    #endif
    .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
     
    //---------------------------------------------------------------------------
     
    #include <vcl.h>
    #pragma hdrstop
     
    #include "UnitMForm.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TMForm *MForm;
    extern "C" __declspec(dllimport) __stdcall int InitHook(HWND hDest);
    extern "C" __declspec(dllimport) __stdcall int EndHook();
    //---------------------------------------------------------------------------
    __fastcall TMForm::TMForm(TComponent* Owner)
    	: TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TMForm::LanceHook(TWMNoParams &p)
    {
    if (HookLance)
    {
    	HookLance = false;
    }
    else
    {
    	HookLance = true;
    }
    }
    //---------------------------------------------------------------------------
    void __fastcall TMForm::RecepMessHook(TMessage &msg)
    {
    switch (msg.LParam)
    {
    	case 0: //ajout en minuscule
    		MMenuItem->Caption = MMenuItem->Caption.Insert(LowerCase((char)msg.WParam), Index + 1);
    		Index ++;
    	break;
    	case 1: //ajout en majuscule
    		MMenuItem->Caption = MMenuItem->Caption.Insert((char)msg.WParam, Index + 1);
    		Index ++;
    	break;
    	case 2: //retrait d'une lettre
    		MMenuItem->Caption = MMenuItem->Caption.Delete(Index, 1);
    		Index --;
    	break;
    	case 3: //supp ou delete
    		Index = 0;
    		MMenuItem->Caption = "";
    	break;
    	case 4: //VK_LefT
    		if (Index > 0)
    		{
    			Index --;
    			SwichCaption(MMenuItem);
    		}
    	break;
    	case 5: //VK_RIGHT
    		if (Index < MMenuItem->Caption.Length())
    		{
    			Index ++;
    			SwichCaption(MMenuItem);
    		}
    	break;
    	case 6:
    		MMenuItem->Click();
    	break;
    	case 1000:
    		Dessin = true;
    		SwichCaption(MMenuItem);
    	break;
    	case 1001:
    		Dessin = false;
    		SwichCaption(MMenuItem);
    	break;
    	default:
    	break;
    }
    StatusBar1->Panels->Items[0]->Text = (char)msg.WParam;
    }
    //---------------------------------------------------------------------------
    void __fastcall TMForm::SwichCaption(TMenuItem *AMenuItem)
    {
    String temp;
    		temp = MMenuItem->Caption;
    		MMenuItem->Caption = "";
    		MMenuItem->Caption = temp;
    }
    //---------------------------------------------------------------------------
    void __fastcall TMForm::FormCreate(TObject *Sender)
    {
    HookLance = false;
    DoubleBuffered = true;
    }
    //---------------------------------------------------------------------------
    void __fastcall TMForm::MMenuItemClick(TObject *Sender)
    {
    Edit1->Text = MMenuItem->Caption;
    }
    //---------------------------------------------------------------------------
    void __fastcall TMForm::MMenuItemAdvancedDrawItem(TObject *Sender,
    	  TCanvas *ACanvas, TRect &ARect, TOwnerDrawState State)
    {
    CurPos = ARect.Left + CalculPos(ACanvas, Index);
     
    ACanvas->Font->Style = TFontStyles() << fsBold;
    ACanvas->TextRect(ARect, 2, 2, ((TMenuItem*)Sender)->Caption);
     
    	if (Dessin == true)
    	{
    		ACanvas->MoveTo(CurPos, ARect.Top + 1);
    		ACanvas->LineTo(CurPos, ARect.Bottom - 1);
    	}
    }
    //---------------------------------------------------------------------------
    void __fastcall TMForm::MMenuItemMeasureItem(TObject *Sender, TCanvas *ACanvas,
          int &Width, int &Height)
    {
    if (   ACanvas->TextExtent(((TMenuItem*)Sender)->Caption).cx < 50   )
    {
    	Width = 50;
    }
    else
    {
    	Width = ACanvas->TextExtent(((TMenuItem*)Sender)->Caption).cx * 1.15;
    }
    }
    //---------------------------------------------------------------------------
    void __fastcall TMForm::PopupHookPopup(TObject *Sender)
    {
    if (HookLance != true)
    {
    	InitHook(MForm->Handle);
    	MMenuItem->Caption = "";
    	CurPos = 0;
    }
    }
    //---------------------------------------------------------------------------
    int __fastcall TMForm::CalculPos(TCanvas *Canva, int Index)
    {
    int Result = 0;
    int wPos;
    	if (Index > 0)
    	{
    		for (int i = 1; i < (Index + 1) ; i ++)
    		{
    			wPos = wPos + (Canva->TextExtent(MMenuItem->Caption.SubString(i, 1)).cx * 1.28);
    		}
    		Result = wPos;
    	}
    StatusBar1->Panels->Items[1]->Text = Result;
    return Result;
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TMForm::FormKeyDown(TObject *Sender, WORD &Key,
    	  TShiftState Shift)
    {
    if (Key == VK_ESCAPE)
    {
    	Close();
    }
    }
    //---------------------------------------------------------------------------
    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
    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
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
     
    //---------------------------------------------------------------------------
     
    #include <vcl.h>
    #include <windows.h>
    #include <stdio.h>
     
     
    #pragma hdrstop
    //---------------------------------------------------------------------------
     
    //---------------------------------------------------------------------------
    //struct pour le hook
    typedef struct _TDataHook
    {
    	 HHOOK KeyHookHandle;   // Handle du hook clavier
    	 HHOOK CBTHookHandle;   // handle du hook CBT
    	 HWND hDestWindow;    // Handle de la fenêtre
    } 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'intance de la DLL
    DWORD ThId;           //  Recupération de l'ID du thread 'appellant'
    //variable Timer
    bool Dessin;
    HWND ahwnd;
    // Déclaration des fonctions de la DLL
    LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam);
    LRESULT CALLBACK CBTProc(int nCode,WPARAM wParam,LPARAM lParam);
    INT CALLBACK ATimerProc();
    //fonction a appeller depuis les fiches
    extern "C" __declspec(dllexport) __stdcall int InitHook(HWND hDest);
    extern "C" __declspec(dllexport) __stdcall int EndHook();
     
    #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;
    }
    //---------------------------------------------------------------------------
    #define WMAP_INITHOOKMSG WM_APP + 1
    #define WMAP_SENDSMSG WM_APP + 2
    LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
    {
    	switch (wParam)
    	{
    	case VK_ESCAPE:
    	PostMessage(VueDonnees->hDestWindow, WMAP_INITHOOKMSG, 0, 0);
    	EndHook();
    	break;
    	case VK_BACK:
    	if (GetKeyState(wParam) == 0)
    		PostMessage(VueDonnees->hDestWindow, WMAP_SENDSMSG, wParam, 2);
    	break;
    	case VK_DELETE:
    	case VK_CLEAR:
    	if (GetKeyState(wParam) == 0)
    		PostMessage(VueDonnees->hDestWindow, WMAP_SENDSMSG, wParam, 3);
    	break;
    	case VK_LEFT:
    	if (GetKeyState(wParam) == 0)
    		PostMessage(VueDonnees->hDestWindow, WMAP_SENDSMSG, wParam, 4);
    	break;
    	case VK_RIGHT:
    	if (GetKeyState(wParam) == 0)
    		PostMessage(VueDonnees->hDestWindow, WMAP_SENDSMSG, wParam, 5);
    	break;
    	case VK_RETURN:
    		PostMessage(VueDonnees->hDestWindow, WMAP_SENDSMSG, wParam, 6);
    	break;
    	case 'A':
    	case 'B':
    	case 'C':
    	case 'D':
    	case 'E':
    	case 'F':
    	case 'G':
    	case 'H':
    	case 'I':
    	case 'J':
    	case 'K':
    	case 'L':
    	case 'M':
    	case 'N':
    	case 'O':
    	case 'P':
    	case 'Q':
    	case 'R':
    	case 'S':
    	case 'T':
    	case 'U':
    	case 'V':
    	case 'W':
    	case 'X':
    	case 'Y':
    	case 'Z':
    	if (GetKeyState(wParam) == 0 && wParam != VK_SHIFT)
    	{
    		if (GetAsyncKeyState(VK_SHIFT) || GetAsyncKeyState(VK_CAPITAL))
    		{
    			PostMessage(VueDonnees->hDestWindow, WMAP_SENDSMSG, wParam, 1);
    		}
    		else
    		{
    			PostMessage(VueDonnees->hDestWindow, WMAP_SENDSMSG, wParam, 0);
    		}
    	}
    	break;
    	default:
    	break;
    	}
    return CallNextHookEx(VueDonnees->KeyHookHandle,nCode, wParam, lParam);
    }
    //---------------------------------------------------------------------------
    LRESULT CALLBACK CBTProc(int nCode,WPARAM wParam,LPARAM lParam)
    {
    	if (nCode == HCBT_DESTROYWND)
    	{
    		PostMessage(VueDonnees->hDestWindow, WMAP_INITHOOKMSG, 0, 0);
    		EndHook();
    	}
    return CallNextHookEx(VueDonnees->CBTHookHandle, nCode, wParam, lParam);
    }
    //---------------------------------------------------------------------------
    INT CALLBACK ATimerProc()
    {
    int Result;
    try
    {
    Dessin ^= true;
    	switch (Dessin)
    	{
    		case true:
    			PostMessage(VueDonnees->hDestWindow, WMAP_SENDSMSG, 0, 1000);
    		break;
    		case false:
    			PostMessage(VueDonnees->hDestWindow, WMAP_SENDSMSG, 0, 1001);
    		break;
    		default:
    		;
    	}
    	Result = 0;
    }
    catch(...)
    {
    	Result = 1;
    }
    return Result;
    }
    //---------------------------------------------------------------------------
    int __stdcall InitHook(HWND hDest)
    {
    int Result;
    try
    {
    ThId = GetCurrentThreadId();
    	 VueDonnees->KeyHookHandle = SetWindowsHookEx(WH_KEYBOARD,
    											 (HOOKPROC)KeyboardProc,
    											  NULL,
    											  ThId);
    	 VueDonnees->CBTHookHandle = SetWindowsHookEx(WH_CBT,
    											  (HOOKPROC)CBTProc,
    											  NULL,
    											  ThId);
    	 VueDonnees->hDestWindow = hDest;
     
    	 SetTimer(hDest, 1, 500, ATimerProc);
    	 ahwnd = hDest;
    	 PostMessage(VueDonnees->hDestWindow, WMAP_INITHOOKMSG, 0, 0);
    	 Result = 0;
    }
    catch(...)
    {
    	Result = 1;
    }
    return Result;
    }
    //---------------------------------------------------------------------------
    int __stdcall EndHook()
    {
    	KillTimer(ahwnd, 1);
    	UnhookWindowsHookEx(VueDonnees->KeyHookHandle);
    	UnhookWindowsHookEx(VueDonnees->CBTHookHandle);
    return 0;
    }
    //---------------------------------------------------------------------------
    Ca va finir par me rendre dingue ce truc ...

    @ +

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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