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 Pingui | Avec 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êmehttp://blog.vintherine.org |
Prokopy | #5 Posté le 7/5/2012 à 21:53:03 |
---|
Kinder Pingui | Oui, 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 |