Gambas France BETA


Pas de compte ? Incription

drag'drop d'une image dans une DrawingArea

1
AuteurMessages
vintherine#1 Posté le 6/5/2012 à 10:05:12
Bonjour,


m'inspirant, pour la partie drag'drop, de http://gambaslinux.eg2.fr/articles.php?lng=fr&pg=113, je voudrai changer l'ordre de pictureboxes dans une drawing area. Tout ce passe bien sauf l'image affichée lors du drag

Dans l'exemple cité l'image tirée est l'image de la picturebox, le pointeur de la souris changeant en fonction de sa position (petite flèche tant qu'on est dans la DrawingArea, signe d'interdiction quand on la quite. Le code est déroutant de simplicité :
1
2
3
4
5
6
PUBLIC SUB PictureBox1_MouseDrag()
IF Mouse.Left THEN
Drag.Icon = LAST.Picture
LAST.Drag(LAST.Picture.Image)
ENDIF
END


Dans mon projet j'utilise strictement le même code si ce n'est que
- il y plusieurs picturesboxes et celles-ci sont crées dans le Sub Form_Open
- elles sont regroupés de telle sorte que la fonction MouseDrag s'applique à l'ensemble
- l'image qu'elles contiennent est chargée depuis un .png

Hors lors du drag l'image tirée est celle d'un mimetype tant qu'on est dans la DrawingArea est redevient celle de la picturebox quand on en sort (j'aurai préféré le contraire !)

Comme je sens que mes explications sont un peu confuses 2 images :
drag dans la DrawingArea

drag hors de la DrawingArea


Je veux bien poster l'ensemble du code mais faisant appel à des ressources locales (images, fichiers d'ini...) je ne sais s'il est exploitable. Dans le doute...

En attendant merci d'avance pour toute suggestion

P.S. Le code est crade, désolé, mais outre que je ne suis qu'un programmeur du dimanche j'ai découvert gambas hier matin.

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
' Gambas class file

PUBLIC IniDir AS STRING = "~/.config/myTint2Applets/"
PUBLIC IniFile AS STRING = IniDir & "myTint2Applets.ini"
PUBLIC myShare AS STRING = "/usr/share/myTint2Applets/"
PUBLIC myApplets[10] AS STRING
PUBLIC myAppletsNumber AS INTEGER
PUBLIC myAppletsButton[10] AS PictureBox
PUBLIC myAppletsPosX[10] AS INTEGER
PUBLIC MovingButton AS INTEGER

PUBLIC SUB _new()
IF NOT Exist(IniDir) THEN
MKDIR IniDir
ENDIF

IF NOT Exist(IniFile) THEN
COPY myShare & "init/myTint2Applets.ini" TO IniFile
ENDIF

END

PUBLIC SUB Form_Open()
DIM Fichier AS STRING
DIM i AS INTEGER

FOR EACH Fichier IN Dir(myShare & "launchers/", "*.desktop").Sort()
myApplets[i] = Left$(Fichier, Len(Fichier) - 8)
CreateButton(Fichier, i)
i = i + 1
NEXT
myAppletsNumber = i - 1
AfficheBarre()
END


SUB CreateButton(DesktopFile AS STRING, ButtonNumber AS INTEGER)
DIM IconFile AS STRING
DIM IconPicture AS Picture
DIM cde AS STRING
DIM IniPos AS STRING

DesktopFile = myShare & "launchers/" & DesktopFile
cde = "grep Icon " & DesktopFile & " | cut -d= -f2 | tr -d '\n'"
SHELL cde TO IconFile

myAppletsButton[ButtonNumber] = NEW PictureBox(DrawingArea1) AS "AppletPicture"
WITH myAppletsButton[ButtonNumber]
.Y = 10
.Width = 28
.height = 28
.Border = 3
.Tag = Str$(ButtonNumber)
END WITH
IconPicture = Picture.Load(IconFile)
myAppletsButton[ButtonNumber].Picture = IconPicture

IniPos = myApplets[ButtonNumber] & ".Order"
cde = "grep " & IniPos & " " & IniFile & " | cut -d= -f2 | tr -d '\n'"
SHELL cde TO IniPos
myAppletsPosX[ButtonNumber] = Val(IniPos)
END

SUB AfficheBarre()
DIM i AS INTEGER
DIM PosX AS INTEGER
FOR i = 0 TO myAppletsNumber
PosX = myAppletsPosX[i] * 36 + 15
myAppletsButton[i].X = PosX
NEXT
DrawingArea1.Width = (22 + 36 * (myAppletsNumber + 1))
DrawingArea1.X = (FMain.Width - DrawingArea1.Width) / 2

END


PUBLIC SUB AppletPicture_MouseDrag()

IF Mouse.Left THEN
Drag.Icon = LAST.Picture
LAST.Drag(Drag.Icon.Image)
MovingButton = Val(LAST.Tag)
ENDIF

END

PUBLIC SUB Button2_Click()

QUIT

END



PUBLIC SUB DrawingArea1_Drop()
DIM PosX AS INTEGER
DIM Decalage AS INTEGER
DIM i AS INTEGER

PosX = myAppletsPosX[MovingButton] * 36 + 15

IF Drag.X > PosX + 50 THEN
Decalage = 1 + (Drag.X - (PosX + 50)) / 36
FOR i = 0 TO 6
IF myAppletsPosX[i] > myAppletsPosX[MovingButton] AND IF myAppletsPosX[i] <= myAppletsPosX[MovingButton] + Decalage THEN
myAppletsPosX[i] = myAppletsPosX[i] - 1
ENDIF
NEXT
myAppletsPosX[MovingButton] = myAppletsPosX[MovingButton] + Decalage
ELSE IF Drag.X < PosX - 22 THEN
Decalage = (Drag.X - (PosX - 22)) / 36 - 1
FOR i = 0 TO 6
IF myAppletsPosX[i] < myAppletsPosX[MovingButton] AND IF myAppletsPosX[i] >= myAppletsPosX[MovingButton] + Decalage THEN
myAppletsPosX[i] = myAppletsPosX[i] + 1
ENDIF
NEXT
myAppletsPosX[MovingButton] = myAppletsPosX[MovingButton] + Decalage
ELSE
RETURN
ENDIF
AfficheBarre()

END

PUBLIC SUB Button5_Click()

SHELL "killall tint2; sleep 1;tint2 &"


END

http://blog.vintherine.org
vintherine#2 Posté le 6/5/2012 à 10:08:28
Erreur de copier / coller, je ne trouve pas comment éditer le message :

Si, j'ai trouvé. Message rectifié
http://blog.vintherine.org
Prokopy#3 Posté le 7/5/2012 à 13:44:10
Kinder PinguiAvec le drag'n'drop seul le contrôle source permet de définir l'image sous le curseur. Tu ne peux donc pas la changer si le drag provient d'une autre application.
La théorie, c'est quand on sait tout et que rien ne fonctionne.
La pratique, c'est quand ça marche mais qu'on ne sait pas pourquoi.
Quand la théorie rejoint la pratique, rien ne fonctionne et on ne sait pas pourquoi.
vintherine#4 Posté le 7/5/2012 à 20:05:04
Je ne veux pas la changer, je veux justement qu'elle reste la meme. De plus le drag se situe entièrement dans la même application.
En l'occurence c'est quoi le contrôle source ? La PictureBox que l'on tire ? Si oui c'est bien dans Sub AppletPicture_MouseDrag() que se trouve le code.

Merci Quand même
http://blog.vintherine.org
Prokopy#5 Posté le 7/5/2012 à 21:53:03
Kinder PinguiOui, le contrôle source c'est celui que l'on "tire".
C'est l'instruction Drag.Icon = Last.Picture qui définit l'image sous le curseur. Si tu la retires ce sera celle par défaut qui sera utilisée, en l'occurence celle de la première capture.
La théorie, c'est quand on sait tout et que rien ne fonctionne.
La pratique, c'est quand ça marche mais qu'on ne sait pas pourquoi.
Quand la théorie rejoint la pratique, rien ne fonctionne et on ne sait pas pourquoi.
vintherine#6 Posté le 9/5/2012 à 21:56:26
Et bien comme tu peux le voir dans le code joint, l'instruction Drag.Icon = Last.Picture figure bien dans la procedure AppletPicture_MouseDrag(). Et c'est justement ce qui ne fonctionne pas. Ce qui est justement l'objet de ma question.

1
2
3
4
5
6
7
8
9
PUBLIC SUB AppletPicture_MouseDrag()

IF Mouse.Left THEN
Drag.Icon = LAST.Picture
LAST.Drag(Drag.Icon.Image)
MovingButton = Val(LAST.Tag)
ENDIF

END
http://blog.vintherine.org
1