Klaus
Nombre de messages : 12277 Age : 74 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Déplacer dynamiquement un objet dans une form Mar 23 Déc 2014 - 2:28 | |
| Déplacer dynamiquement un objet dans une form - on sait faire. Certes. On peut changer les valeurs de TOP, LEFT, WIDTH et HEIGHT de n'importe quel objet visible. Mais comment faire pour commander cela par la souris, en tirant des poignées comme on le ferait dans certains logiciels d'édition? Dans un EDI de Delphi, VisualBasic ou autre ? Ou comme dans Word pour dimensionner une image ? Eh bien, je vais vous donner le moyen d'afficher un cadre avec des poignées autour de n'importe quel objet Panoramic visible, et de déplacer cet objet en tirant le cadre, ou en changeant des dimensions en tirant une des 8 poignées: Ca vous rappelle quelque chose ? Alors, on va s'y mettre. J'ai implémenté cela à l'aide de KGF.dll, car il fallair utiliser une FORM mobile placée toujours en avant-plan pour dessiner le cadre, et découper un trou rectangulaire dans cette form pour laisser apparaître l'objet à déplacer ! Il faut utiliser d'ailleurs pour cela la nouvelle version KGF.dll V03.99 du 22/12/2014, à cause d'une nouvelle fonction. Le programme suivant propose deux objets à reconfigurer: un mémo et un bouton. Pour chacun de ces objets, il y a un bouton "Saisir ..." qui "saisit" l'objet et affiche le cadre avec les poignées. Pour déplacer l'objet, il suffit de placer le curseur sur une des liges droites du cadre, enfoncer la touche Control et déplacer le curseur. Le mouvement s'arrête lorsqu'on relâche le bouton Control. Il ne sert à rien de cliquer à ce niveau-là: Panoramic n'a pas les évènements ON_MOUSE_DOWN ni ON_MOUSE_UP. J'utilise donc les évènements ON_KEY_DOWN et ON_KEY_UP sur le cadre. Pour utiliser une des poignée, il faut placer le curseur dans une de ces poignées, enfoncer la touche Control et déplacer la souris, puis relâcher Control. Il y a un bouton "Lâcher l'objet" qui fait disparaître le cadre. Voici le code: - Code:
-
' test_déplacer_dimensionner_un_objet.bas
label saisir_memo, saisir_button, lacher, down, up, tic
dim res%, reg%, trou%, wtrou%, htrou%, x0%, y0%, w0%, h0%, down%, zoom% dim posx%, posy%, dx%, dy%, curx%, cury%, selobj%, x%, y%
dim cadre% : cadre% = 1000 form cadre% : hide cadre% : border_hide cadre% : ' color cadre%,255,255,0
button 1 : top 1,10 : left 1,10 : caption 1,"Saisir mémo" on_click 1,saisir_memo button 2 : top 2,10 : left 2,200 : caption 2,"Saisir bouton" on_click 2,saisir_button button 3 : top 3,10 : left 3,390 : caption 3,"Lâcher l'objet" on_click 3,lacher
dim memo% : memo% = 10 memo memo% : top memo%,40 : left memo%,10 item_add memo%, "mémo à dimensionner" dim button% : button% = 20 button button% : top button%,40 : left button%,200 : width button%,150 caption button%,"bouton à dimensionner"
dll_on "KGF.dll"
timer 99 : on_timer 99,tic : timer_off 99 : on_timer 99,tic : timer_interval 99,10
end
saisir_memo: dessiner_cadre(memo%) return saisir_button: dessiner_cadre(button%) return lacher: timer_off 99 hide cadre% off_key_down cadre% off_key_up cadre% return sub dessiner_cadre(obj%) selobj% = obj% show cadre% res% = DLL_call2("WindowTopMost",handle(cadre%),1) if trou%=1 then res% = DLL_call6("WindowRectangleHole",handle(cadre%),0,3,3,wtrou%,htrou%) wtrou% = width(obj%) htrou% = height(obj%) trou% = 1 res% = dll_call5("GetFormClientMetrics",handle(0),adr(x0%),adr(y0%),adr(w0%),adr(h0%)) top cadre%,top(obj%)-5 + y0% left cadre%,left(obj%)-5 + x0% width cadre%,width(obj%)+10 height cadre%,height(obj%)+10 res% = DLL_call6("WindowRectangleHole",handle(cadre%),1,5,5,wtrou%,htrou%) 2d_target_is cadre% 2d_clear 2d_pen_color 1,1,1 2d_rectangle 3,3,wtrou%+7,htrou%+7 2d_pen_color 0,0,0 2d_fill_color 0,0,0 2d_fill_on ' poignées: 2d_rectangle 0,0,5,5 : ' HG 2d_rectangle 5+wtrou%/2-2,0,5+wtrou%/2+3,5 : ' HM 2d_rectangle 5+wtrou%,0,5+wtrou%+5,5 : ' HD 2d_rectangle 0,5+htrou%/2-2,5,5+htrou%/2+3 : ' MG 2d_rectangle 5+wtrou%,5+htrou%/2-2,5+wtrou%+5,5+htrou%/2+3 : ' MD 2d_rectangle 0,5+htrou%,5,5+htrou%+5 : ' BG 2d_rectangle 5+wtrou%/2-2,5+htrou%,5+wtrou%/2+3,5+htrou%+5 : ' BM 2d_rectangle 5+wtrou%,5+htrou%,5+wtrou%+5,5+htrou%+5 : ' BD 2d_fill_off to_foreground cadre% on_key_down cadre%,down on_key_up cadre%,up ' res% = dll_call2("AbsoluteMousePosition",left(cadre%),top(cadre%)) end_sub
down: if key_down_code<>17 then return if down%=1 then return zoom% = 0 res% = DLL_call5("GetFormMetrics",handle(cadre%),adr(posx%),adr(posy%),adr(w0%),adr(h0%)) res% = dll_call2("GetAbsoluteMousePosition",adr(curx%),adr(cury%)) detecter_zoom() caption 0,"zoom="+str$(zoom%) down% = 1 timer_on 99 return sub detecter_zoom() if (curx%>=posx%) and (curx%<(posx%+5)) if (cury%>=posy%) and (cury%<(posy%+5)) zoom% = 1 : ' HG exit_sub end_if if (cury%>=(posy%+5+htrou%/2-2)) and (cury%<(posy%+5+htrou%/2+3)) zoom% = 2 : ' MG exit_sub end_if if (cury%>=(posy%+5+htrou%)) and (cury%<(posy%+5+htrou%+5)) zoom% = 3 : ' BG exit_sub end_if end_if if (curx%>=(posx%+5+wtrou%/2-2)) and (curx%<(posx%+5+wtrou%/2+3)) if (cury%>=posy%) and (cury%<(posy%+5)) zoom% = 4 : ' MH exit_sub end_if if (cury%>=(posy%+5+htrou%)) and (cury%<(posy%+5+htrou%+5)) zoom% = 5 : ' MB exit_sub end_if end_if if (curx%>=(posx%+5+wtrou%)) and (curx%<(posx%+5+wtrou%+5)) if (cury%>=posy%) and (cury%<(posy%+5)) zoom% = 6 : ' HD exit_sub end_if if (cury%>=(posy%+5+htrou%/2-2)) and (cury%<(posy%+5+htrou%/2+3)) zoom% = 7 : ' MD exit_sub end_if if (cury%>=(posy%+5+htrou%)) and (cury%<(posy%+5+htrou%+5)) zoom% = 8 : ' BD exit_sub end_if end_if
end_sub
up: timer_off 99 down% = 0 return
tic: timer_off 99 res% = dll_call2("GetAbsoluteMousePosition",adr(x%),adr(y%)) dx% = x% - curx% dy% = y% - cury% select zoom% case 0 : ' move normal bouger(dx%,dy%) case 1 : ' HG bouger(dx%,dy%) zoomer(dx%,dy%) case 2 : ' MG bouger(dx%,0) zoomer(dx%,0) case 3 : ' BG bouger(dx%,0) zoomer(dx%,0-dy%) case 4 : ' MH bouger(0,dy%) zoomer(0,dy%) case 5 : ' MB bouger(0,0) zoomer(0,0-dy%) case 6 : ' HD bouger(0,dy%) zoomer(0-dx%,dy%) case 7 : ' MD bouger(0,0) zoomer(0-dx%,0) case 8 : ' BD bouger(0,0) zoomer(0-dx%,0-dy%) end_select timer_on 99 return
sub bouger(dx%,dy%) left cadre%, left(cadre%) + dx% top cadre%, top(cadre%) + dy% left selobj%, left(selobj%) + dx% top selobj%, top(selobj%) + dy% posx% = left(cadre%) posy% = top(cadre%) curx% = x% cury% = y% end_sub
sub zoomer(dx%,dy%) width cadre%,width(cadre%) - dx% height cadre%,height(cadre%) - dy% width selobj%,width(selobj%) - dx% height selobj%,height(selobj%) - dy% dessiner_cadre(selobj%) end_sub
EDIT Ci-dessus une version un peu optimisée, techniquement.
Dernière édition par Klaus le Mar 23 Déc 2014 - 11:44, édité 2 fois | |
|
Invité Invité
| Sujet: Re: Déplacer dynamiquement un objet dans une form Mar 23 Déc 2014 - 4:09 | |
| Bonjour, J'ai du me relever pour évacuer une douleur, et vu cette démo. - juste un détour:
J'avoue ne pas essayer ton programme pour l'instant, et je suis certain qu'il est bleffant. J'ai fait il y a quelque temps un IDE 100% en Panoramic, où j'ai obtenu un fonctionnement identique. Il n'y a pas les poignées, je n'y ai pas pensé lors de la conception. Le programme en lui-même je savais qu'il n'avait pas d’intérêt, vu que tu as fait beaucoup mieux.
Mais je pense que la méthode utilisée mérite d'être exploitée. Ça fait plusieurs programmes qui utilisent le principe de déplacement transparent. Ce serait intéressant je pense que quelqu'un exploite le principe et l'améliore. Moi j'ai pas le temps. Pour essayer à l'occasion, l'IDE est sur mon site, et voir la méthode. Restant un peu en dehors de Panoramic, bon Noël!
Dernière édition par cosmos70 le Mar 23 Déc 2014 - 14:13, édité 1 fois |
|