Bonjour à tous, j'ai voulu pouvoir déplacer un bouton créé dynamiquement à l'aide de la souris, avec l’évènement MouseMove, mais j'ai pas pu ...
Merci de m'avoir indiqué comment procéder.
Bonjour à tous, j'ai voulu pouvoir déplacer un bouton créé dynamiquement à l'aide de la souris, avec l’évènement MouseMove, mais j'ai pas pu ...
Merci de m'avoir indiqué comment procéder.
Salut chiti
C'est possible
le .cpp
le .h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; TButton *Button; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { Button = new TButton(this); Button->Top = 300; Button->Left = 300; Button->Height = 25; Button->Width = 75; Button->Parent = Form1; Button->Visible = true; Button->Caption = "bouton"; Button->OnMouseMove = MonTraiteMouseMove; } //--------------------------------------------------------------------------- void __fastcall TForm1::MonTraiteMouseMove(TObject *Sender, TShiftState, int, int) { // traitement ReleaseCapture(); SendMessage(Button->Handle, WM_SYSCOMMAND, 0xF012, 0); } //---------------------------------------------------------------------------
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 //--------------------------------------------------------------------------- #ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> //--------------------------------------------------------------------------- class TForm1 : public TForm { __published: // IDE-managed Components void __fastcall FormCreate(TObject *Sender); private: // User declarations void __fastcall TForm1::MonTraiteMouseMove(TObject *Sender, TShiftState, int, int); public: // User declarations __fastcall TForm1(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endif
--
Plutot que d'essayer de réinventer la roue, apprenons à nous en servir
Merci pour cette réponse, je ne peux l'essayer pour l'instant vu que je n'ai pas le CodeGear ici, je le ferais ce soir.
J'ai essayé de gérer l'évènement MouseClick pour mes boutons dynamique, et ça a marché à merveil, mais j'ai pas pu le faire pour MouseMove, je te propose mon code, et dis moi POURQUOI ça ne marche pas
Pour le .h
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 #ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include <ComCtrls.hpp> #include <Menus.hpp> //--------------------------------------------------------------------------- class TForm1 : public TForm { private: // Déclarations utilisateur public: // Déclarations utilisateur __fastcall TForm1(TComponent* Owner); TButton *MonBouton1; TButton *MonBouton2; TButton *MonBouton3; void __fastcall MonBouton1Click(TObject *Sender); void __fastcall MonBouton2Click(TObject *Sender); void __fastcall MonBouton3Click(TObject *Sender); void __fastcall MonBouton1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y); }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endif
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 //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" #include "TBouton.cpp" #include "Unit2.h" #include "Unit3.h" #include "Unit4.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" //--------------------------------------------------------------------------- TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- int creation=1, etape=1, fin=1; int leftCre = 300, topCre=0, topEta = 0; String trait = "___________________________"; UnicodeString nom = "Création"; UnicodeString nom2 = "Etapes"; UnicodeString nom3 = "Fin"; //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { //Ce bouton permet de créer des boutons création autant qu'on veut. topCre += 50; MonBouton1 = new TButton(this); MonBouton1->Left = leftCre; MonBouton1->Top = topCre; MonBouton1->Parent = Form1; creation += 1; MonBouton1->OnClick = MonBouton1Click; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { //Ce bouton permet de créer des bouton étapes autant qu'on veut. TButton *MonBouton2; MonBouton2 = new TButton(this); MonBouton2->Top = topCre ; MonBouton2->Left = leftCre + 150; MonBouton2->Parent = Form1; TLabel *MonLabel;//Création d'un lien visuel du bouton etapes avec la dernière création MonLabel = new TLabel(this); MonLabel->Top = topCre; MonLabel->Left = leftCre; MonLabel->Caption = trait; MonLabel->Parent = Form1; topEta = topCre; MonBouton2->OnClick = MonBouton2Click; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button3Click(TObject *Sender) { //Ce bouton permet de créer des bouton fin autant qu'on veut. TButton *MonBouton3; MonBouton3 = new TButton(this); MonBouton3->Left = leftCre + 300; MonBouton3->Top = topEta; MonBouton3->Parent = Form1; TLabel *MonLabel;//Création d'un lien visuel du bouton fin avec la dernière étape. MonLabel = new TLabel(this); MonLabel->Top = topEta; MonLabel->Left = leftCre + 150; MonLabel->Caption = trait; MonLabel->Parent = Form1; MonBouton3->OnClick = MonBouton3Click; } //--------------------------------------------------------------------------- void __fastcall TForm1::MonBouton1Click(TObject *Sender) { Form2->Show(); //Afficher la fenêtre "Création" } void __fastcall TForm1::MonBouton2Click(TObject *Sender) { Form3->Show(); //Afficher la fenêtre "Etapes" } void __fastcall TForm1::MonBouton3Click(TObject *Sender) { Form4->Show(); //Afficher la fenêtre "Fin" } void __fastcall TForm1::MonBouton1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { TPoint* pt; ReleaseCapture; SendMessage(MonBouton1->Handle, WM_SYSCOMMAND, 61458, 0); GetCursorPos(pt); SendMessage(MonBouton1->Handle, WM_LBUTTONUP, MK_CONTROL, Longint(pt)); } //---------------------------------------------------------------------------
La je seche des que l'on essaye de bouger le TButton celui ci execute un MouseDown alors que le bouton de la souris reste enfonce
--
Plutot que d'essayer de réinventer la roue, apprenons à nous en servir
Si je comprends bien, tu veux créer un bouton dynamiquement et permettre à l'utilisateur de le placer où il veut, c'est ça?
Si c'est ça. j'avais déjà fait un soft dans le genre, me semble que j'utilisais la technique du "Drag and drop" et ça fonctionnait très bien.
Faudrait que je retrouve le code, mais de mémoire il me semble c'était la forme qui s'occupait de déplacer le bouton et non le bouton lui-même. Ça se faisait via l'événement "FormDragOver".
En effet je crée des boutons dynamiquement, et j'ai pu gérer l'évènement du clique de la souris, mais par contre pas le mouvement de la souris ....
Guyt54 Tu peux m'éclaircir à ce propos s'il te plait !?
Bin voilà.
Le bouton n'a pas été crée dynamiquement, je te montre ici comment on peut simplement déplacer un bouton avec une souris:
le .h:
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 //--------------------------------------------------------------------------- #ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include <System.Classes.hpp> #include <Vcl.Controls.hpp> #include <Vcl.StdCtrls.hpp> #include <Vcl.Forms.hpp> //--------------------------------------------------------------------------- class TForm2 : public TForm { __published: // Composants gérés par l'EDI TButton *Button1; void __fastcall FormDragOver(TObject *Sender, TObject *Source, int X, int Y, TDragState State, bool &Accept); private: // Déclarations utilisateur public: // Déclarations utilisateur __fastcall TForm2(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TForm2 *Form2; //--------------------------------------------------------------------------- #endif
Faut pas oublier de mettre la propriété DragMode du bouton à dmAutomatic,
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 //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm2 *Form2; //--------------------------------------------------------------------------- __fastcall TForm2::TForm2(TComponent* Owner) : TForm(Owner) { Button1->DragMode = dmAutomatic ; } //--------------------------------------------------------------------------- void __fastcall TForm2::FormDragOver(TObject *Sender, TObject *Source, int X, int Y, TDragState State, bool &Accept) { if (Source->ClassNameIs("TButton")) { TButton* button = (TButton*) Source ; button->Left = X ; button->Top = Y ; } }
Est ce que c'est normal si je ne peux que déplacer le dernier bouton créé ????
Je viens de rajouter un évément "OnClick" à mon bouton et me suis rappelé que celui n'est pas appelé si sa propriété DragMode est à dmAutomatic.
Dans le logiciel que j'avais écrit, c'était pas grave, même que c'était souhaitable car je voulais 2 modes, édition et exécution. Quand il y avait un changement, je parcourais la liste des composants de la forme et je changeais la propriété DragMode en conséquence.
Pour parcourir la liste des composants de TForm, il y a les propriétés "Components[]" et "ComponentCount".
J'ai un peu plus de temps et j'ai repris mes essais et le code propose fonctionne avec un evenement OnClick
le .cpp
le .h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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 //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; TButton *Buttonxx; bool Deplacement; int XPos, YPos; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { /* Button = new TButton(this); Button->Top = 50; Button->Left = 50; Button->Height = 25; Button->Width = 75; Button->Parent = Form1; Button->Visible = true; Button->Caption = "bouton"; Button->OnMouseMove = MonTraiteMouseMove; //Button->OnMouseDown = MonTraiteMouseDown; Button->OnClick = MonTraiteMouseClick; */ } //--------------------------------------------------------------------------- void __fastcall TForm1::MonTraiteMouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { // traitement ReleaseCapture(); SendMessage(Buttonxx->Handle, WM_SYSCOMMAND, 0xF012, 0); } //--------------------------------------------------------------------------- void __fastcall TForm1::MonTraiteMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { // } //--------------------------------------------------------------------------- void __fastcall TForm1::MonTraiteMouseClick(TObject *Sender) { Beep(0x00FF, 1000); } void __fastcall TForm1::Button1Click(TObject *Sender) { Buttonxx = new TButton(this); Buttonxx->Top = 50; Buttonxx->Left = 50; Buttonxx->Height = 25; Buttonxx->Width = 75; Buttonxx->Parent = Form1; Buttonxx->Visible = true; Buttonxx->Caption = "boutonxx"; Buttonxx->OnMouseMove = MonTraiteMouseMove; //Buttonxx->OnMouseDown = MonTraiteMouseDown; Buttonxx->OnClick = MonTraiteMouseClick; } //---------------------------------------------------------------------------
Fais un essais avec le code telquel pour toi voir le resultat
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 //--------------------------------------------------------------------------- #ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> //--------------------------------------------------------------------------- class TForm1 : public TForm { __published: // IDE-managed Components TButton *Button1; void __fastcall FormCreate(TObject *Sender); void __fastcall Button1Click(TObject *Sender); private: // User declarations void __fastcall TForm1::MonTraiteMouseMove(TObject *Sender, TShiftState Shift, int X, int Y); void __fastcall TForm1::MonTraiteMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y); void __fastcall TForm1::MonTraiteMouseClick(TObject *Sender); public: // User declarations __fastcall TForm1(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endif
--
Plutot que d'essayer de réinventer la roue, apprenons à nous en servir
Le meme et avec deux bouttons perso et qui se deplacent et gerent le click
le .cpp
le .h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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 //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; TButton *Buttonxx; TButton *Buttonyy; bool Deplacement; int XPos, YPos; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { /* Button = new TButton(this); Button->Top = 50; Button->Left = 50; Button->Height = 25; Button->Width = 75; Button->Parent = Form1; Button->Visible = true; Button->Caption = "bouton"; Button->OnMouseMove = MonTraiteMouseMove; //Button->OnMouseDown = MonTraiteMouseDown; Button->OnClick = MonTraiteMouseClick; */ } //--------------------------------------------------------------------------- void __fastcall TForm1::MonTraiteMouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { // traitement ReleaseCapture(); SendMessage(Buttonxx->Handle, WM_SYSCOMMAND, 0xF012, 0); } //--------------------------------------------------------------------------- void __fastcall TForm1::MonTraiteMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { // } //--------------------------------------------------------------------------- void __fastcall TForm1::MonTraiteMouseClick(TObject *Sender) { Beep(0x00FF, 1000); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { Buttonxx = new TButton(this); Buttonxx->Top = 50; Buttonxx->Left = 50; Buttonxx->Height = 25; Buttonxx->Width = 75; Buttonxx->Parent = Form1; Buttonxx->Visible = true; Buttonxx->Caption = "boutonxx"; Buttonxx->OnMouseMove = MonTraiteMouseMove; //Buttonxx->OnMouseDown = MonTraiteMouseDown; Buttonxx->OnClick = MonTraiteMouseClick; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { Buttonyy = new TButton(this); Buttonyy->Top = 50; Buttonyy->Left = 50; Buttonyy->Height = 25; Buttonyy->Width = 75; Buttonyy->Parent = Form1; Buttonyy->Visible = true; Buttonyy->Caption = "boutonyy"; Buttonyy->OnMouseMove = MonTraiteMouseMove1; //Buttonxx->OnMouseDown = MonTraiteMouseDown; Buttonyy->OnClick = MonTraiteMouseClick1; } //--------------------------------------------------------------------------- void __fastcall TForm1::MonTraiteMouseMove1(TObject *Sender, TShiftState Shift, int X, int Y) { // traitement ReleaseCapture(); SendMessage(Buttonyy->Handle, WM_SYSCOMMAND, 0xF012, 0); } //--------------------------------------------------------------------------- void __fastcall TForm1::MonTraiteMouseClick1(TObject *Sender) { Beep(0x00FF, 1000); }
Si le code tel qu'il est ecrit fonctionne chez toi c'est que cela est du a la construction de ton programme
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 //--------------------------------------------------------------------------- #ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> //--------------------------------------------------------------------------- class TForm1 : public TForm { __published: // IDE-managed Components TButton *Button1; TButton *Button2; void __fastcall FormCreate(TObject *Sender); void __fastcall Button1Click(TObject *Sender); void __fastcall Button2Click(TObject *Sender); private: // User declarations void __fastcall TForm1::MonTraiteMouseMove(TObject *Sender, TShiftState Shift, int X, int Y); void __fastcall TForm1::MonTraiteMouseMove1(TObject *Sender, TShiftState Shift, int X, int Y); void __fastcall TForm1::MonTraiteMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y); void __fastcall TForm1::MonTraiteMouseClick(TObject *Sender); void __fastcall TForm1::MonTraiteMouseClick1(TObject *Sender); public: // User declarations __fastcall TForm1(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endif
--
Plutot que d'essayer de réinventer la roue, apprenons à nous en servir
D'accord, merci pour ces réponses, je vais l'essayer ce soir, et je vous tiendrais au courant ... Merci encore !
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager