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

Delphi Discussion :

Modifier position BorderIcons


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Juillet 2005
    Messages
    479
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Juillet 2005
    Messages : 479
    Par défaut Modifier position BorderIcons
    bonjour
    je cherche si possible de modifier la position des 'bordericons', c'est à dire au lieu de les afficher au coin haut droit on les affiches au coin haut gauche.
    merci

  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,
    C'est surement possible ... a condition de dessiner et gerer soit même les boutons, a mon humble avis.
    Cela veut dire dessiner avec, entre autres, DrawFrameControl
    (voir les différentes valeurs a donner aux variables :
    . a mon avis frame-control type doit être DFC_CAPTION
    . et uState, une des valeurs de type DFCS_CAPTIONCLOSE, etc ... )
    et surtout gérer le actions de l'utilisateur dans la zone non cliente de la fenêtre (click, mousemove, etc)

    Si tout va bien, je devrais pouvoir te proposer qqchose dans ce sens.
    Mais je promets rien ...

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

    Me revoici ....j'ai mis en pièce jointe une petite DLL, en espérant que cela passe.
    C'est du C++Builder, monté avec le BDS 2006.
    Je joint le code de celle ci et une proposition pour appeller la fonction principale depuis une fiche Delphi :
    .code dll :
    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
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
     
    #include <vcl.h>
    #include <windows.h>
    #pragma hdrstop
    //---------------------------------------------------------------------------
    //struct pour le hook
    typedef struct _TDataHook
    {
    	 HHOOK MouseHookHandle; // Handle du hook de la souris
    	 HHOOK GMHookHandle;   // Handle du hook sur GetMessage
    	 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'
     
    //pour recuperer les fonctions passées en paramètres
    //bouton close
    typedef int _stdcall (*bClose)(void);
    bClose adFonctionClose;
    //bouton maximize
    typedef int _stdcall (*bMaxi)(void);
    bMaxi adFonctionMaxi;
    //bouton minimize
    typedef int _stdcall (*bMini)(void);
    bMini adFonctionMini;
     
     
    // Déclaration des fonctions de la DLL
    int _stdcall InitHook(HWND hDest);
    LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam,LPARAM lParam);
    LRESULT CALLBACK GetMsgProc(int code, WPARAM wParam, LPARAM lParam);
     
    //fonction a appeller depuis les fiches
    extern "C" __declspec(dllexport) __stdcall int AddButton(TForm* aForm, int _stdcall ReponseClose(), int _stdcall ReponseMaxi(), int _stdcall ReponseMini());
    extern "C" __declspec(dllexport) __stdcall int EndHook();
     
    //dessin du bouton
    void __fastcall CalculTailleCB(HWND aH, tagRECT *pRect, int Index);
    void __fastcall DessinBouton(int AState);
     
    //variable pour les boutons
    tagRECT bCloseRect; //bouton fermer
    tagRECT bMaxRect; //bouton maximize
    tagRECT bMinRect; //bouton minimize
     
    //variables positionnement
    int nbButtons, nbEspace, PosLeft, PosTop, WBoutonType, HBoutonType;
     
    //
    TForm* baseForm;
     
    //
    #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
    										"NclButtonGauche"); // 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;
    }
    //---------------------------------------------------------------------------
     
    int __stdcall AddButton(TForm* aForm, int _stdcall ReponseClose(), int _stdcall ReponseMaxi(), int _stdcall ReponseMini())
    {
    int result;
    try
    {
    	baseForm = aForm;
    	adFonctionClose = ReponseClose;
    	adFonctionMaxi = ReponseMaxi;
    	adFonctionMini = ReponseMini;
    	InitHook(baseForm->Handle);
    	result = 0;
    }
    catch (...)
    {
    	result = 1;
    }
    return result;
    }
    //---------------------------------------------------------------------------
    void __fastcall DessinBouton(int AState)
    {
            HDC hdc;
    		HWND whdc;
    		whdc = baseForm->Handle;
    		//
    		// On détermine les coordonnées auxquelles on veut dessiner les
    		//boutons :
    		CalculTailleCB(whdc, &bCloseRect, 0);
    		CalculTailleCB(whdc, &bMaxRect, 1);
    		CalculTailleCB(whdc, &bMinRect, 2);
            //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 (AState)
            {
                    case 0:
    				DrawFrameControl(hdc, &bCloseRect, DFC_CAPTION, DFCS_CAPTIONCLOSE);
    				DrawFrameControl(hdc, &bMaxRect, DFC_CAPTION, DFCS_CAPTIONMAX);
    				DrawFrameControl(hdc, &bMinRect, DFC_CAPTION, DFCS_CAPTIONMIN);
    				break;
    				case 1:
    				DrawFrameControl(hdc, &bCloseRect, DFC_CAPTION, DFCS_CAPTIONCLOSE | DFCS_PUSHED);
    				DrawFrameControl(hdc, &bMaxRect, DFC_CAPTION, DFCS_CAPTIONMAX);
    				DrawFrameControl(hdc, &bMinRect, DFC_CAPTION, DFCS_CAPTIONMIN);
    				break;
    				case 2:
    				DrawFrameControl(hdc, &bCloseRect, DFC_CAPTION, DFCS_CAPTIONCLOSE);
    				DrawFrameControl(hdc, &bMaxRect, DFC_CAPTION, DFCS_CAPTIONMAX | DFCS_PUSHED);
    				DrawFrameControl(hdc, &bMinRect, DFC_CAPTION, DFCS_CAPTIONMIN);
    				break;
    				case 3:
    				DrawFrameControl(hdc, &bCloseRect, DFC_CAPTION, DFCS_CAPTIONCLOSE);
    				DrawFrameControl(hdc, &bMaxRect, DFC_CAPTION, DFCS_CAPTIONMAX);
    				DrawFrameControl(hdc, &bMinRect, DFC_CAPTION, DFCS_CAPTIONMIN | DFCS_PUSHED);
    				break;
    		}
    		//
    		ReleaseDC(hdc, whdc);
    }
    //----------------------------------------------------------------------------
    void __fastcall CalculTailleCB(HWND aH, tagRECT *pRect, int Index)
    {
            GetWindowRect(aH, pRect);
            int WBordure = pRect->right - pRect->left;
    		if (baseForm->BorderStyle == bsToolWindow)
            {
    		WBoutonType = GetSystemMetrics(SM_CXSMSIZE);
    		HBoutonType = GetSystemMetrics(SM_CYSMSIZE);
            }
    		if (baseForm->BorderStyle == bsSizeToolWin)
            {
            WBoutonType = GetSystemMetrics(SM_CXSMSIZE);
            HBoutonType = GetSystemMetrics(SM_CYSMSIZE);
            }
    		if (baseForm->BorderStyle == bsSingle || baseForm->BorderStyle == bsSizeable
    			|| baseForm->BorderStyle == bsDialog)
            {
            WBoutonType = GetSystemMetrics(SM_CXSIZE);
            HBoutonType = GetSystemMetrics(SM_CYSIZE);
            }
    		if (baseForm->BorderStyle == bsToolWindow) { PosTop = 5; }
    		if (baseForm->BorderStyle == bsSizeToolWin) { PosTop = 6; }
    		if (baseForm->BorderStyle == bsSingle || baseForm->BorderStyle == bsDialog) { PosTop = 5; }
    		if (baseForm->BorderStyle == bsSizeable) { PosTop = 6; }
    //
    		switch (Index)
    		{
    			case 0:
    				PosLeft = 22;
    			break;
    			case 1:
    				PosLeft = 22 + (WBoutonType*Index);
    			break;
    			case 2:
    				PosLeft = 22 + (WBoutonType*Index);
    			break;
    			default:
    			break;
    		}
            pRect->left = PosLeft;
    		pRect->right = PosLeft + WBoutonType;
            pRect->top = PosTop;
            pRect->bottom = PosTop + HBoutonType - 4;
    //
    }
    //----------------------------------------------------------------------------
     
     
    //HOOK
    int _stdcall InitHook(HWND hDest)
    {
    ThId = GetCurrentThreadId();
    	 VueDonnees->MouseHookHandle = SetWindowsHookEx(WH_MOUSE,
    											 (HOOKPROC)MouseProc,
    											 NULL,
    											 ThId);
    	 VueDonnees->GMHookHandle = SetWindowsHookEx(WH_GETMESSAGE,
    											 (HOOKPROC)GetMsgProc,
    												 NULL,
    											 ThId);									
    	 VueDonnees->hDestWindow = hDest;
    return 0;
    }
    //----------------------------------------------------------------------------
    int _stdcall EndHook()
    {
    	 UnhookWindowsHookEx(VueDonnees->MouseHookHandle);
    	 UnhookWindowsHookEx(VueDonnees->GMHookHandle);
    return 0;
    }
    //----------------------------------------------------------------------------
    LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam,LPARAM lParam)
    {
    MOUSEHOOKSTRUCT *mousepos = (MOUSEHOOKSTRUCT*)lParam;
    switch (wParam)
    {
    	case WM_NCLBUTTONDOWN:
    		ScreenToClient(baseForm->Handle, &mousepos->pt);
    		if (mousepos->pt.x > bCloseRect.left && mousepos->pt.x < bCloseRect.right)
    		{
    			DessinBouton(1);
    			adFonctionClose();
    		}
    		else
    		{
    			if (mousepos->pt.x > bMaxRect.left && mousepos->pt.x < bMaxRect.right)
    			{
    				DessinBouton(2);
    				adFonctionMaxi();
    			}
    			else
    			{
    				if (mousepos->pt.x > bMinRect.left && mousepos->pt.x < bMinRect.right)
    				{
    					DessinBouton(3);
    					adFonctionMini();
    				}
    				else
    				{
    					DessinBouton(0);
    					baseForm->DefaultHandler(&wParam) ;
    				}
    			}
    		}
    	break;
    	default:
    			DessinBouton(0);
    	break;
    }
    return CallNextHookEx(VueDonnees->MouseHookHandle,nCode,wParam,lParam);
    }
    //----------------------------------------------------------------------------
    LRESULT CALLBACK GetMsgProc(int code, WPARAM wParam, LPARAM lParam)
    {
    if (code < 0)
    {
    	return CallNextHookEx(VueDonnees->GMHookHandle,code,wParam,lParam);
    }
    else
    {
    tagMSG *msg = (tagMSG*)lParam;
    	switch (msg->message)
    	{
    		case WM_PAINT:
    		case WM_WINDOWPOSCHANGED:
    		case WM_WINDOWPOSCHANGING:
    			DessinBouton(0);
    			baseForm->DefaultHandler(&lParam);
    		break;
    		default:
    			baseForm->DefaultHandler(&lParam);
    		break;
    	}
    return CallNextHookEx(VueDonnees->GMHookHandle,code,wParam,lParam);
    }
    }
    //----------------------------------------------------------------------------
    //HOOK
    .code fiche delphi:
    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
     
    unit UnitAppel;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
     
    type
      TForm2 = class(TForm)
        procedure FormCreate(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form2: TForm2;
      function AddButton(aForm: TForm; ReponseClose: Pointer; ReponseMaxi: Pointer; ReponseMini: Pointer) : Integer;
                         stdcall; external 'NclButtonGauche.dll';
      function EndHook(): Integer; stdcall; external 'NclButtonGauche.dll';
      function RepClose(): Integer; stdcall;
      function RepMaxi(): Integer; stdcall;
      function RepMini(): Integer; stdcall;
     
    implementation
     
    {$R *.dfm}
    //---------------------------------------------------------------------------
    function RepClose(): Integer; stdcall;
    begin
      Form2.Close;
    result:= 0;
    end;
    //---------------------------------------------------------------------------
    function RepMaxi(): Integer; stdcall;
    begin
      Form2.WindowState := wsMaximized;
    result:= 0;
    end;
    //---------------------------------------------------------------------------
    function RepMini(): Integer; stdcall;
    begin
      Form2.WindowState := wsMinimized;
    result:= 0;
    end;
    //---------------------------------------------------------------------------
    procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
        EndHook();
    end;
    //---------------------------------------------------------------------------
    procedure TForm2.FormCreate(Sender: TObject);
    begin
       AddButton(Form2, @RepClose, @RepMaxi, @RepMini);
    end;
     
    end.
    //---------------------------------------------------------------------------
    Bon, ce n'est qu'une proposition. On peut surement faire mieux, d'ailleurs j'aurais du mettre les actions en réponse au click plutôt suite a un message de type WM_NCLBUTTONUP et garder la fonction de dessin suite au message WM_NCLBUTTONDOWN.
    J'espère surtout que pas trop d'erreur ne se sont glissées dans le code, puisque j'ai repiqué le code d'un travail précédent un pei .. vite fait quoi

    Tout conseil, avis, suggession, sont les biens venus d'ailleurs.

    En espérant t'aider,
    @+

    [EDIT]: Il manque aussi des petites choses, comme le fait de changer le second bouton lorsque la fenêtre est réduite, et passer alors une valeur de type DFCS_CAPTIONRESTORE lors du dessin du bouton par ex.
    Fichiers attachés Fichiers attachés

  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
    bon ... ben ... on dirait que ça enchante personne ma réponse ...

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 160
    Par défaut
    Citation Envoyé par Sunchaser
    bon ... ben ... on dirait que ça enchante personne ma réponse ...
    si si, c'est bien ... Bon personellement ca ne m'est d'aucune utilité

    Mais bon... juste pour te dire que t'es pas tout seul, et que c'est vrai qu'un petit mot ca fait du bien quand on essaye d'aider les autres.

    Et le Flag résolu, c'est un peu la cersise sur le gateau.

    C'est con mais ca réchauffe le coeur... Et ca donne envie de continuer.

    Donc bravo!

    Et merci à tous les contibuteurs du forum qui font de ce lieu une véritable ressource de grande valeur.

  6. #6
    Membre Expert
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 704
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 704
    Par défaut
    Citation Envoyé par Sunchaser
    bon ... ben ... on dirait que ça enchante personne ma réponse ...
    J'ai testé, mais j'ai une erreur : ca me réclame vcl100.bpl

    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. :bug: ___ "http://club.developpez.com/regles/#LIII-A"Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.3 Entreprise - Visual studio 2022
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.7)

Discussions similaires

  1. modifier position souris
    Par enaele dans le forum Général Python
    Réponses: 4
    Dernier message: 07/08/2010, 13h19
  2. Modifier position texte pango gtk gdk
    Par dongonis38 dans le forum GTK+ avec C & C++
    Réponses: 4
    Dernier message: 29/04/2010, 17h29
  3. Modifier position curseur
    Par Zwify dans le forum Général JavaScript
    Réponses: 16
    Dernier message: 10/07/2009, 20h19
  4. Modifier position, taille, etc des composants
    Par Jeane dans le forum NetBeans
    Réponses: 1
    Dernier message: 24/11/2008, 20h06
  5. [FLASH 8] Modifier position souris
    Par ViveLesQuads dans le forum Flash
    Réponses: 5
    Dernier message: 05/02/2007, 17h35

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