Relier graphiquement deux Gadgets [Resolu]

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Relier graphiquement deux Gadgets

Message par Kwai chang caine »

Bon je crois que je vais devenir dingue avec cette fleche. :twisted:

Ca fait 5 heures que je la torture, et pas moyen d'en faire ce que je veux.
KERNADEC m'a gentillement aidé pour la faire et elle est super classe.
C'etait une fleche pour aller a droite et en bas...

Bon j'me suis dit, rien de plus facile que de faire son contraire :D
Et 5 heures plus tard...j'ai envie de balancer ce pc un bon coup par terre pour voir si ça rebondi :?

J'ai essayé de modifier les coordonnées, et pas moyen de faire une fleche gauche et en bas qui fonctionne sur le meme principe, car tout est inversé et je tourne en rond
Alors je me suis apperçu que le meme code pouvait faire les deux fleches, voir meme les 4 fleches
Chouette "j'm'ai" dit, j'ai qu'a prendre le meme code pour les deux fleches, et "deplacer" le gadget selon si c'est à droite, couper la partie gauche qui sert a rien, et si c'est a gauche couper la partie droite qui sert a rien.

Et la j'me bat avec les image, les startdrawing et toute la clique.
En plus KERNADEC, il a sorti un code de la mort qui jongle entre deux images, et j'y comprend rien.
Quand je resize une tout est noir , et quand je resize l'autre et ben rien se passe :(

J'en ai maaaaaaarrrreee !!! :(

Si "quinquin" pouvait me guider un peu, ce serait pas de refus 8)

Voila le code qui marche, et ce que je voudrais c'est que quand on deplace la fleche a droite à gauche en haut ou en bas en depassant la zone blanche et bien l'image blanche se resize autour de la fleche :oops:
Je sais ça doit pas etre facile :(

Merci d'avance pour le volontaire 8)

Code : Tout sélectionner


Enumeration
 #Fenetre
 #Image_0
 #Image_1
 #ImageGadget
EndEnumeration

Hauteur = 200
Largeur = 200
Epaisseur = 10
Couleur = RGB(34, 54, 221)

Procedure DessineFleche(x, y, Epaisseur, Couleur)
     
 StartDrawing(ImageOutput(#Image_1))
 
  DrawImage(ImageID(#Image_0), 0, 0)
     
  For i = 1 To Epaisseur
           
   LineXY(GadgetWidth(#ImageGadget) / 2, 10 + i, x - 40, 10 + i, Couleur) ; Horizontale
   LineXY(x - 40 + i, 11, x - 40 + i, y - 30, Couleur) ; Verticale
   LineXY(x - 40 + i, y - 30, x - 60 + i, y - 60, Couleur) ; Bord fleche gauche
   LineXY(x - 40 + i, y - 30, x - 20 + i, y - 60, Couleur) ; Bord fleche droit
   
  Next
    
 StopDrawing()
 SetGadgetState(#ImageGadget,ImageID(#Image_1))
 RedrawWindow_(WindowID(#Fenetre), 0, 0, #RDW_INVALIDATE|#RDW_UPDATENOW)

EndProcedure

CreateImage(#Image_0, Largeur * 2, Hauteur) ; Image de ce qui est fixe
CreateImage(#Image_1, Largeur * 2, Hauteur) ; image de ce qui est en cours dêtre dessiné

OpenWindow(#Fenetre, 0, 0, Largeur * 3, Hauteur * 2, "Fleche et souris", #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_TitleBar)
ImageGadget(#ImageGadget, Largeur / 2 , Hauteur / 2, 0, 0, ImageID(#Image_1))

StartDrawing(ImageOutput(#Image_0))
 FillArea(0, 0, RGB(255,255,255), RGB(255,255,255))
StopDrawing()

DessineFleche(Largeur / 2, Hauteur, Epaisseur, Couleur)
      
Repeat  

Evenement = WaitWindowEvent()

  Select Evenement
   
   Case #WM_MOUSEMOVE
   
    MouseX = WindowMouseX(#Fenetre)
    MouseY = WindowMouseY(#Fenetre)
    
    If GetAsyncKeyState_(#VK_LBUTTON)
     DessineFleche(MouseX - GadgetX(#ImageGadget) + 39, MouseY - GadgetY(#ImageGadget) + 39, Epaisseur, Couleur)
    EndIf         

  EndSelect

Until Evenement = #PB_Event_CloseWindow
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Relier graphiquement deux Gadgets

Message par Kwai chang caine »

Y'a une question qui me trote dans la tete et je ne trouve pas de reponse.
Est ce quelqu'un a compris pourquoi KERNADEC utilise deux images
Ca ne marcherait pas avec une seule ???

Code : Tout sélectionner

CreateImage(#Image_0, Largeur,Hauteur) 
CreateImage(#Image_1, Largeur,Hauteur)
Et apres fait ça ?? 8O

Code : Tout sélectionner

SetGadgetState(#ImageGadget,ImageID(#Image_1))
Dans ce code :

Code : Tout sélectionner

Enumeration
#Fenetre
#Image_0
#Image_1
#FondBlanc
#ImageGadget
EndEnumeration
hdc.l=0
Hauteur = 200
Largeur = 400
CreateImage(#Image_0, Largeur,Hauteur) 
CreateImage(#Image_1, Largeur,Hauteur)
Procedure DessineFleche(x, y)
StartDrawing(ImageOutput(#Image_1))
  DrawImage(ImageID(#Image_0), 0, 0)
  LineXY(0, 10, x - 10, 10, RGB(226, 23, 29)) ; Horizontale
  LineXY(x - 10, 10, x - 10, y - 10, RGB(226, 23, 29)) ; Verticale
  LineXY(x - 10, y - 10, x - 15, y - 20, RGB(226, 23, 29))
  LineXY(x - 10, y - 10, x - 5, y - 20, RGB(226, 23, 29))
  StopDrawing()
SetGadgetState(#ImageGadget,ImageID(#Image_1))
RedrawWindow_(WindowID(#Fenetre), 0, 0, #RDW_INVALIDATE|#RDW_UPDATENOW)
EndProcedure

OpenWindow(#Fenetre, 417, 181, 600, 500, "New window ( 0 )",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
ImageGadget(#ImageGadget, 100, 100, Largeur,Hauteur, ImageID(#Image_1))
StartDrawing(ImageOutput(#Image_0))
FillArea(0,0,RGB(255,255,255),RGB(255,255,255))
StopDrawing()
DessineFleche(Largeur, Hauteur)
      
Repeat  

Evenement = WaitWindowEvent()

  Select Evenement
   
   Case #WM_MOUSEMOVE
   
      MouseX = WindowMouseX(#Fenetre)
      MouseY = WindowMouseY(#Fenetre)
      
      If GetAsyncKeyState_(#VK_LBUTTON)
      
      DessineFleche(mousex - GadgetX(#ImageGadget), mousey - GadgetY(#ImageGadget))
            
      EndIf         

   EndSelect

Until Evenement = #PB_Event_CloseWindow
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: Relier graphiquement deux Gadgets

Message par kernadec »

bonjour KCC

je n'ai pas tout compris, alors je t'ai fais un retournement de la flêche,
peut être ce n'est pascela que tu cherche, sinon fait un petit dessin.

cordialement

Code : Tout sélectionner

 

Enumeration
#Fenetre
#Image_0
#Image_1
#ImageGadget
EndEnumeration

Hauteur = 200
Largeur = 200
Epaisseur = 10
Couleur = RGB(34, 54, 221)

Procedure DessineFleche(x, y, Epaisseur, Couleur)
			
StartDrawing(ImageOutput(#Image_1))

	DrawImage(ImageID(#Image_0), 0, 0)
			
	For i = 1 To Epaisseur
	  LineXY(GadgetWidth(#ImageGadget) / 2, 170 + i, x + 40, 170 + i, Couleur) ; Horizontale
		LineXY(x + 40 - i, y+35, x + 40 - i,180, Couleur) ; Verticale
	  LineXY(x + 40 - i, y + 30, x + 60 - i, y + 60, Couleur) ; Bord fleche gauche
		LineXY(x + 40 - i, y + 30, x + 20 - i, y + 60, Couleur) ; Bord fleche droit
		
	Next
		
StopDrawing()
SetGadgetState(#ImageGadget,ImageID(#Image_1))
RedrawWindow_(WindowID(#Fenetre), 0, 0, #RDW_INVALIDATE|#RDW_UPDATENOW)

EndProcedure

CreateImage(#Image_0, Largeur * 2, Hauteur) ; Image de ce qui est fixe
CreateImage(#Image_1, Largeur * 2, Hauteur) ; image de ce qui est en cours dêtre dessiné

OpenWindow(#Fenetre, 0, 0, Largeur * 3, Hauteur * 2, "Fleche et souris", #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_TitleBar)
ImageGadget(#ImageGadget, Largeur / 2 , Hauteur / 2, 0, 0, ImageID(#Image_1))

StartDrawing(ImageOutput(#Image_0))
FillArea(0, 0, RGB(255,255,255), RGB(255,255,255))
StopDrawing()

DessineFleche( Hauteur/2,Largeur/4, Epaisseur, Couleur)
			
Repeat  

Evenement = WaitWindowEvent()

	Select Evenement
		
		Case #WM_MOUSEMOVE
		
		MouseX = WindowMouseX(#Fenetre)
		MouseY = WindowMouseY(#Fenetre)
		
		If GetAsyncKeyState_(#VK_LBUTTON)
			DessineFleche(MouseX - GadgetX(#ImageGadget) -35, MouseY - GadgetY(#ImageGadget) - 30, Epaisseur, Couleur)
		EndIf         

	EndSelect

Until Evenement = #PB_Event_CloseWindow

Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Relier graphiquement deux Gadgets

Message par Kwai chang caine »

KERNADEC mon sauveur 8)
Tu es revenu...j'ai grand besoin de toi .

En fait, j'ai noir de choses a te demander, je ne sais pas si tu peux accomplir ce miracle, mais je suis désespéré, car je m'egosille a expliquer en anglais, je fais noir de dessins et personne y comprend KCC :(
Et on s'y est meme mis a deux avec mon chef, qui y connait pas mal en math pour essayer de creer la fleche "parfaite"

Alors tout d'abord et avant toute chose, une premiere question sur ton premier code:
Pourquoi tu met deux images,

Code : Tout sélectionner

CreateImage(#Image_0, Largeur,Hauteur) 
CreateImage(#Image_1, Largeur,Hauteur)
Et ça

Code : Tout sélectionner

SetGadgetState(#ImageGadget,ImageID(#Image_1))
Parce que je torture ton super code dans tous les sens depuis 3 jours, et je n'ai toujours pas compris pourquoi il est necessaire de mettre deux images, ne pourrait on pas le faire avec une seule, ou bien c'est pour une histoire de rafraichissement ????
Et c'est important de comprendre....j'essaie de ne pas copier/coller betement :?
Sauf evidemment dans certains codes...qui paraissent etre ecrit en hebreux 8O

Et la seconde question :
Alors, j'ai essayé de demander chez les français qui parlent pas francais, si y pouvaient m'aider a creer une fleche comme je la reve.
J'ai eu deux codes, mais ils n'ont pas compris, et pourtant, comme quand j'avais 4 ans, je leur ai fait plein de dessins.

RASHAD m'a donné un code qui pourrait me depanner, et c'est deja bien gentil de sa part, mais ce n'est pas ce que je cherchais a faire comme effet.
Ce code qui d'ailleur a un petit probleme de selection des 4 fleches, mais si on change a la main le flag (1,2,3,4) ça marche
Donc ce code donne bien les 4 fleches....mais pas en partant d'une seule image, il a fait 4 image differentes. :(
Et en plus, pour les deplacement vertical + haut par exemple, RASHAD a simplifié le code en modifiant le gadget, et donc la pointe de la fleche ne suis plus la souris, c'est le "cul" de la fleche qui se retrecie (Si tu vois ce que je veux dire), donc c'est deja une solution, mais ça fait bizarre.
Car deux des dessins fonctionnent comme je le veux et deux autres a l'envers

Code : Tout sélectionner

Enumeration
#Fenetre
#Image_0
#Image_1
#FondBlanc
#ImageGadget
EndEnumeration

Hauteur.i = 200
Largeur.i = 400
CreateImage(#Image_0, Largeur,Hauteur) 
CreateImage(#Image_1, Largeur,Hauteur)

Global flag
flag = 1

Procedure DessineFleche(x, y)
If x > 400
   x = 400
ElseIf x < 35
    x = 35
EndIf
If y > 200
   y = 200
ElseIf y < 35
    y = 35
EndIf
  
StartDrawing(ImageOutput(#Image_1))
  DrawImage(ImageID(#Image_0), 0, 0)
  If flag = 1
    LineXY(10, 10, x - 10, 10, RGB(226, 23, 29))
    LineXY(x - 10, 10, x - 10, y - 10, RGB(226, 23, 29)) ; Verticale
    LineXY(x - 10, y - 10, x - 15, y - 20, RGB(226, 23, 29))
    LineXY(x - 10, y - 10, x - 5, y - 20, RGB(226, 23, 29))
  ElseIf flag = 2
    LineXY(10, y - 10, x - 10, y - 10, RGB(226, 23, 29))
    LineXY(x-10, 10,x-10, y - 10, RGB(226, 23, 29)) ; Verticale
    LineXY(x - 10, 10, x - 15, 20, RGB(226, 23, 29))
    LineXY(x - 10, 10, x - 5, 20, RGB(226, 23, 29))
  ElseIf flag = 3
    LineXY(10,10, x - 10, 10, RGB(226, 23, 29))
    LineXY(10, 10, 10, y - 10, RGB(226, 23, 29)) ; Verticale
    LineXY(10, y - 10, 15, y - 20, RGB(226, 23, 29))
    LineXY(10, y - 10, 5, y - 20, RGB(226, 23, 29))
  ElseIf flag = 4
    LineXY(10, y-10, x - 10, y-10, RGB(226, 23, 29))
    LineXY(10, 10, 10, y - 10, RGB(226, 23, 29)) ; Verticale
    LineXY(10, 10, 15, 20, RGB(226, 23, 29))
    LineXY(10, 10, 5, 20, RGB(226, 23, 29))
  EndIf
StopDrawing()

      ResizeImage(#Image_1, x, y)
      ResizeImage(#Image_0, x, y)

SetGadgetState(#ImageGadget,ImageID(#Image_1))

EndProcedure

OpenWindow(#Fenetre, 417, 181, 600, 500, "New window ( 0 )",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
ImageGadget(#ImageGadget, 100, 100, 0, 0, ImageID(#Image_1))
StartDrawing(ImageOutput(#Image_0))
Box(0,0,400,200, RGB(255, 255, 255))
StopDrawing() 
DessineFleche(Largeur, Hauteur)
      
Repeat  

Evenement = WaitWindowEvent()

  Select Evenement
   
   Case #WM_MOUSEMOVE
   
      MouseX = WindowMouseX(#Fenetre)
      MouseY = WindowMouseY(#Fenetre)
      
      If GetAsyncKeyState_(#VK_LBUTTON) And MouseX > GadgetX(#ImageGadget) And MouseY > GadgetY(#ImageGadget)          
      
      DessineFleche(mousex - GadgetX(#ImageGadget), mousey - GadgetY(#ImageGadget))
            
      EndIf
      
   Case #WM_KEYDOWN
       If GetAsyncKeyState_(49) & $8000 = 32768
          flag = 1
        ElseIf GetAsyncKeyState_(50) & $8000 = 32768
          flag = 2
        ElseIf GetAsyncKeyState_(51) & $8000 = 32768
          flag = 3
        ElseIf GetAsyncKeyState_(52) & $8000 = 32768
          flag = 4
       EndIf
       ResizeImage(#Image_1,Largeur, Hauteur)
       ResizeImage(#Image_0,Largeur, Hauteur)
       DessineFleche(Largeur, Hauteur)  

   EndSelect

Until Evenement = #PB_Event_CloseWindow
Mais bon comme d'habitude, ce que je cherche a faire est super dur....bien au dessus de mes moyens de programmeur, de mathematicien et de graphiste car il faut ces 3 qualités pour reussir cette put....de fleche (Excuse moi, apres 50 heures a travailler dessus .....j'suis un peu sur les crocs :oops:)

Donc ce que "j'aimerais" avoir est tres simple....en explication (En français...pas en anglais :wink: ), mais tres dur en code, apparement.
Deja merci de ta fleche retournée, car elle peut etre aussi une des reponses 8)

Premiere supplication :oops:
Ce que je voudrais, c'est cette fleche que tu viens de me faire...et celle que tu m'avais faite avant, soient ensemble dans le meme gadget.
C'est à dire, je part d'un point central, et que j'aille dans toutes les directions la pointe de la fleche suit la souris, exactement comme elle suit la souris sur ton dernier code, mais dans toutes les directions, haut , bas, droite gauche
Voici un dessin dans les deux langues car c'est pas facile de traduire chaque post :( :
Image
Ca c'est pour le deplacement :oops:

Seconde supplication :oops:
Maintenant la seconde difficultée, c'est que j'aimerais que les fleches n'aient pas de limites, c'est à dire que le ImageGadget se resize au fur et a mesure que tu approche du bord.
Car actuellement ta superbe fleche bleue on voit pas le bout si on va trop loin, et le bout disparait carrement si on continue :(
Image

Troisieme et derniere supplication :oops:
J'aimerais, si c'est possible, que les grandes parties de blanc disparaissent quand tu resize la fleche, ou au pire a la fin du resize si c'est trop dur a le faire en meme temps.
Exemple sur ton ancien code on pouvait faire partir la fleche en bas a droite, et c'etait deja magique, mais tout le blanc qui est a gauche va me gener pour poser les autres gadgets, car FRED a dit de ne pas les faire chevaucher, PB n'est pas prevu pour ça
Image

Donc ce qui serait le top, c'est que au final quand on a deplacé la pointe de la fleche on se retrouve avec une de ces fleches, en partant toujours du meme point central
Exemple avec des fleches rouges (Je pense que tu comprendra quand meme :lol:)
Image Image
Image Image

Voici un code de rashad qui fait exactement ce que je veux, mais seulement dans une seule direction :(
Le gadgetimage se resize pil poil sur la fleche, mais quand tu passe dans l'autre sens, et ben ça s'arrette

Code : Tout sélectionner

Enumeration
#Fenetre
#Image_0
#Image_1
#FondBlanc
#ImageGadget
EndEnumeration
hdc.l=0
Hauteur = 200
Largeur = 400
CreateImage(#Image_0, Largeur,Hauteur) 
CreateImage(#Image_1, Largeur,Hauteur)

Procedure DessineFleche(x, y)
  
StartDrawing(ImageOutput(#Image_1))
  DrawImage(ImageID(#Image_0), 0, 0)
  LineXY(0, 10, x - 10, 10, RGB(226, 23, 29)) ; Horizontale
  LineXY(x - 10, 10, x - 10, y - 10, RGB(226, 23, 29)) ; Verticale
  LineXY(x - 10, y - 10, x - 15, y - 20, RGB(226, 23, 29))
  LineXY(x - 10, y - 10, x - 5, y - 20, RGB(226, 23, 29))
StopDrawing()

  ResizeImage(#Image_1, x, y)
  ResizeImage(#Image_0, x, y)

SetGadgetState(#ImageGadget,ImageID(#Image_1))

EndProcedure

OpenWindow(#Fenetre, 417, 181, 600, 500, "New window ( 0 )",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
ImageGadget(#ImageGadget, 100, 100, 0, 0, ImageID(#Image_1))
StartDrawing(ImageOutput(#Image_0))
FillArea(0,0,RGB(255,255,255),RGB(255,255,255))
StopDrawing()
DessineFleche(Largeur, Hauteur)
      
Repeat  

Evenement = WaitWindowEvent()

  Select Evenement
   
   Case #WM_MOUSEMOVE
   
      MouseX = WindowMouseX(#Fenetre)
      MouseY = WindowMouseY(#Fenetre)
      
      If GetAsyncKeyState_(#VK_LBUTTON) And MouseX > GadgetX(#ImageGadget) And MouseY > GadgetY(#ImageGadget)
      
      DessineFleche(mousex - GadgetX(#ImageGadget), mousey - GadgetY(#ImageGadget))
            
      EndIf         

   EndSelect

Until Evenement = #PB_Event_CloseWindow
Voila tout mon malheur depuis trois jours de codage.
J'ai un sceau de codes, d'abord tous les miens qui marchent pas.
Et aussi ceux des copains qui ont bien voulu essayer de m'aider, et que je remercie encore 8)

J'espere que j'ai fait assez de dessin, car c'est pas facile d'expliquer ce genre de chose.
Si tu as un doute..n'hesite pas, c'est mieux de demander, plutot que de se casser la nenette a faire un code, et que ce ne soit pas l'effet voulu :(

J'suis dégouté, car normalement ce devrait etre dans les derniers codes, pour terminer mon organigramme, et comme dab j'arrive pas a terminer.
Ce qui fait une apli de plus non terminée a mon actif :(

En tout cas mille merci de t'inquieter de mon sort 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: Relier graphiquement deux Gadgets

Message par kernadec »

bonsoir KCC
merci pour les explications , je ne suis pas chez moi ce week
je regarderais si je peux t'aider sur ce petit code.

Cordialement
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Relier graphiquement deux Gadgets

Message par Kwai chang caine »

Pas de probleme KERNADEC.

"Petit" est peut etre un doux euphemisme :mrgreen:
Repose toi bien...KCC il est pas préssé..mais il va faire F5 toutes les 20 secondes pour rafraichir cette page :lol: :lol:

Encore merci 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: Relier graphiquement deux Gadgets

Message par Le Soldat Inconnu »

Tiens mon petit KCC

des petites flèches, j'ai pas tout lu mais je pense que c'est ce genre de truc que tu cherches

PB4.40 pour cet exemple
mais pas obligatoire, ca tournera en 4.31, mais tu dois dessiner tes flèches toi même, mon système ne marchera pas

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu
; Version de PB : 4.40
;
; Explication du programme :
; Une flèche qui part d'un point fixe et qui suit la souris


Procedure TriangleAA(x1, y1, x2, y2, x3, y3, Color, Thickness = 1, Mode = #PB_2DDrawing_Default)
  Protected Epaisseur.f, Zone_G, Zone_D, Zone_H, Zone_B, Couleur_Fond, Application.f
  Protected Width12.l, Hight12.l, Distance12.f, CosAngle12.f, SinAngle12.f, Sens12.l, y1_r2.f, Application1.f, Interieur1
  Protected Width23.l, Hight23.l, Distance23.f, CosAngle23.f, SinAngle23.f, Sens23.l, y2_r2.f, Application2.f, Interieur2
  Protected Width31.l, Hight31.l, Distance31.f, CosAngle31.f, SinAngle31.f, Sens31.l, y3_r2.f, Application3.f, Interieur3
  
  ; Demi épaisseur de la ligne
  Epaisseur.f = Thickness / 2
  
  ; calcul pour le changement de repère qui permet de connaitre l'épaisseur du trait et de gérer l'AA
  ; Pour la ligne 12
  ; Le point de départ du repère est le point x1, y1
  Width12.l = x2 - x1
  Hight12.l = y2 - y1
  Distance12.f = Sqr(Width12 * Width12 + Hight12 * Hight12)
  CosAngle12.f = Width12 / Distance12
  SinAngle12.f = Sin(ACos(CosAngle12))
  If Hight12 > 0
    SinAngle12 = -SinAngle12
	EndIf
  ; changement de base
  y3_r2 = (x3 - x1) * SinAngle12 + (y3 - y1) * CosAngle12
  ; on regarde de quel coté de la ligne se trouve le triangle en regardant la position du point 3
  If y3_r2 > 0
    Sens12 = 1
	Else
    Sens12 = -1
	EndIf
  ; Pour la ligne 23
  ; Le point de départ du repère est le point x2, y2
  Width23.l = x3 - x2
  Hight23.l = y3 - y2
  Distance23.f = Sqr(Width23 * Width23 + Hight23 * Hight23)
  CosAngle23.f = Width23 / Distance23
  SinAngle23.f = Sin(ACos(CosAngle23))
  If Hight23 > 0
    SinAngle23 = -SinAngle23
	EndIf
  ; changement de base
  y1_r2 = (x1 - x2) * SinAngle23 + (y1 - y2) * CosAngle23
  ; on regarde de quel coté de la ligne se trouve le triangle en regardant la position du point 3
  If y1_r2 > 0
    Sens23 = 1
	Else
    Sens23 = -1
	EndIf
  ; Pour la ligne 31
  ; Le point de départ du repère est le point x3, y3
  Width31.l = x1 - x3
  Hight31.l = y1 - y3
  Distance31.f = Sqr(Width31 * Width31 + Hight31 * Hight31)
  CosAngle31.f = Width31 / Distance31
  SinAngle31.f = Sin(ACos(CosAngle31))
  If Hight31 > 0
    SinAngle31 = -SinAngle31
	EndIf
  ; changement de base
  y2_r2 = (x2 - x3) * SinAngle31 + (y2 - y3) * CosAngle31
  ; on regarde de quel coté de la ligne se trouve le triangle en regardant la position du point 3
  If y2_r2 > 0
    Sens31 = 1
	Else
    Sens31 = -1
	EndIf
  
  ; Détermination de la zone de dessin
  Zone_G = x1
  Zone_D = x1
  Zone_B = y1
  Zone_H = y1
  If x2 < Zone_G
    Zone_G = x2
	EndIf
  If x3 < Zone_G
    Zone_G = x3
	EndIf
  If x2 > Zone_D
    Zone_D = x2
	EndIf
  If x3 > Zone_D
    Zone_D = x3
	EndIf
  If y2 < Zone_B
    Zone_B = y2
	EndIf
  If y3 < Zone_B
    Zone_B = y3
	EndIf
  If y2 > Zone_H
    Zone_H = y2
	EndIf
  If y3 > Zone_H
    Zone_H = y3
	EndIf
  Zone_B - Thickness
  Zone_H + Thickness
  Zone_G - Thickness
  Zone_D + Thickness
  
  ; Dessin du triangle
  If Mode & #PB_2DDrawing_Outlined ; Triangle vide
    For n = Zone_G To Zone_D
      For nn = Zone_B To Zone_H
        
        y1_r2 = (n - x1) * SinAngle12 + (nn - y1) * CosAngle12
        y1_r2 * Sens12
        If y1_r2 >= -0.5 - Epaisseur
          
          Application1.f = 0.5 + Epaisseur + y1_r2
          If Application1 > 1
            Application1 =  1 + 0.5 + Epaisseur - Application1
            If Application1 < 0
              Application1 = 0
						EndIf
            Interieur1 = 1
					Else
            Interieur1 = 0
					EndIf
          
          y2_r2 = (n - x2) * SinAngle23 + (nn - y2) * CosAngle23
          y2_r2 * Sens23
          If y2_r2 >= -0.5 - Epaisseur
            
            Application2.f = 0.5 + Epaisseur + y2_r2
            If Application2 > 1
              Application2 = 1 + 0.5 + Epaisseur - Application2
              If Application2 < 0
                Application2 = 0
							EndIf
              Interieur2 = 1
						Else 
              Interieur2 = 0
						EndIf
            
            y3_r2 = (n - x3) * SinAngle31 + (nn - y3) * CosAngle31
            y3_r2 * Sens31
            If y3_r2 >= -0.5 - Epaisseur
              
              Application3.f = 0.5 + Epaisseur + y3_r2
              If Application3 > 1
                Application3 = 1 + 0.5 + Epaisseur - Application3
                If Application3 < 0
                  Application3 = 0
								EndIf
                Interieur3 = 1
							Else
                Interieur3 = 0
							EndIf
              
              
              If Interieur1 And Interieur2 And Interieur3
                Application = Application1 + Application2 + Application3
							Else
                Application = 1
                If Interieur1 = 0
                  Application * Application1
								EndIf
                If Interieur2 = 0
                  Application * Application2
								EndIf
                If Interieur3 = 0
                  Application * Application3
								EndIf
							EndIf
              If Application > 0
                If Application < 1
                  ; Couleur_Fond = Point(n, nn)
                  ; Plot(n, nn, ColorBlending(Color, Couleur_Fond, Application))
									Alpha = 255 * Application
									Plot(n, nn, Color | Alpha << 24)
								Else
                  Plot(n, nn, Color | $FF000000)
								EndIf
							EndIf
							
						EndIf
					EndIf
				EndIf
        
			Next
		Next
	Else ; Triangle plein
    For n = Zone_G To Zone_D
      For nn = Zone_B To Zone_H
        
        y1_r2 = (n - x1) * SinAngle12 + (nn - y1) * CosAngle12
        y1_r2 * Sens12
        If y1_r2 >= -0.5 - Epaisseur
          
          Application1.f = 0.5 + Epaisseur + y1_r2
          If Application1 > 1
            Application1 = 1
					EndIf
          
          y2_r2 = (n - x2) * SinAngle23 + (nn - y2) * CosAngle23
          y2_r2 * Sens23
          If y2_r2 >= -0.5 - Epaisseur
            
            Application2.f = 0.5 + Epaisseur + y2_r2
            If Application2 > 1
              Application2 = 1
						EndIf
            
            y3_r2 = (n - x3) * SinAngle31 + (nn - y3) * CosAngle31
            y3_r2 * Sens31
            If y3_r2 >= -0.5 - Epaisseur
              
              Application3.f = 0.5 + Epaisseur + y3_r2
              If Application3 > 1
                Application3 = 1
							EndIf
              
              Application = Application1 * Application2 * Application3
              If Application < 1
								Alpha = 255 * Application
								Plot(n, nn, Color | Alpha << 24)
							Else
                Plot(n, nn, Color | $FF000000)
							EndIf
              
						EndIf
					EndIf
				EndIf
        
			Next
		Next
	EndIf
  
EndProcedure

Enumeration
	#Fleche_Haut
	#Fleche_Bas
	#Fleche_Droite
	#Fleche_Gauche
	#Fleche_BarreVerticale
	#Fleche_BarreHorizontale
EndEnumeration
#Fleche_Dimension = 32
#Fleche_Epaisseur = 6
#Fleche_Couleur = $000000

Procedure Fleche_Creation()
	; Dessin des flèches
	CreateImage(#Fleche_Haut, #Fleche_Dimension, #Fleche_Dimension, 32)
	StartDrawing(ImageOutput(#Fleche_Haut))
		DrawingMode(#PB_2DDrawing_AlphaChannel)
		Box(0, 0, #Fleche_Dimension, #Fleche_Dimension, 0)
		DrawingMode(#PB_2DDrawing_AlphaBlend)
		TriangleAA(#Fleche_Dimension / 2 - 1, 1, #Fleche_Dimension - 2, #Fleche_Dimension - 2, 1, #Fleche_Dimension - 2, #Fleche_Couleur)
	StopDrawing()
	CreateImage(#Fleche_Bas, #Fleche_Dimension, #Fleche_Dimension, 32)
	StartDrawing(ImageOutput(#Fleche_Bas))
		DrawingMode(#PB_2DDrawing_AlphaChannel)
		Box(0, 0, #Fleche_Dimension, #Fleche_Dimension, 0)
		DrawingMode(#PB_2DDrawing_AlphaBlend)
		TriangleAA(#Fleche_Dimension / 2 - 1, #Fleche_Dimension - 2, 1, 1, #Fleche_Dimension - 2, 1, #Fleche_Couleur)
	StopDrawing()
	CreateImage(#Fleche_Gauche, #Fleche_Dimension, #Fleche_Dimension, 32)
	StartDrawing(ImageOutput(#Fleche_Gauche))
		DrawingMode(#PB_2DDrawing_AlphaChannel)
		Box(0, 0, #Fleche_Dimension, #Fleche_Dimension, 0)
		DrawingMode(#PB_2DDrawing_AlphaBlend)
		TriangleAA(1, #Fleche_Dimension / 2 - 1, #Fleche_Dimension - 2, 1, #Fleche_Dimension - 2, #Fleche_Dimension - 2, #Fleche_Couleur)
	StopDrawing()
	CreateImage(#Fleche_Droite, #Fleche_Dimension, #Fleche_Dimension, 32)
	StartDrawing(ImageOutput(#Fleche_Droite))
		DrawingMode(#PB_2DDrawing_AlphaChannel)
		Box(0, 0, #Fleche_Dimension, #Fleche_Dimension, 0)
		DrawingMode(#PB_2DDrawing_AlphaBlend)
		TriangleAA(#Fleche_Dimension - 2, #Fleche_Dimension / 2 - 1, 1, 1, 1, #Fleche_Dimension - 2, #Fleche_Couleur)
	StopDrawing()
	
	; Création des gadgets nécessaire à l'affichage de la fleche
	ImageGadget(#Fleche_Haut, 0, 0, #Fleche_Dimension, #Fleche_Dimension, ImageID(#Fleche_Haut))
	ImageGadget(#Fleche_Bas, 100, 0, #Fleche_Dimension, #Fleche_Dimension, ImageID(#Fleche_Bas))
	ImageGadget(#Fleche_Gauche, 200, 0, #Fleche_Dimension, #Fleche_Dimension, ImageID(#Fleche_Gauche))
	ImageGadget(#Fleche_Droite, 300, 0, #Fleche_Dimension, #Fleche_Dimension, ImageID(#Fleche_Droite))
	ContainerGadget(#Fleche_BarreHorizontale, 0, 100, 100, #Fleche_Epaisseur, #PB_Container_BorderLess)
		SetGadgetColor(#Fleche_BarreHorizontale, #PB_Gadget_BackColor, #Fleche_Couleur)
	CloseGadgetList()
	ContainerGadget(#Fleche_BarreVerticale, 100, 100, #Fleche_Epaisseur, 100, #PB_Container_BorderLess)
		SetGadgetColor(#Fleche_BarreVerticale, #PB_Gadget_BackColor, #Fleche_Couleur)
	CloseGadgetList()	
EndProcedure

Procedure Fleche_Position(Depart_X, Depart_Y, Fin_X, Fin_Y)
	If Depart_X >= Fin_X
		; Vers la gauche
		If Depart_Y >= Fin_Y
			; Vers le haut
			If Abs(Fin_X - Depart_X) < Abs(Fin_Y - Depart_Y)
				; Chemin en X le plus long
				Fleche_Haut = 1
				Barre_Gauche = 1
			Else
				; Chemin en Y le plus long
				Fleche_Gauche = 1
				Barre_Haut = 1
			EndIf
		Else
			; Vers le bas
			If Abs(Fin_X - Depart_X) < Abs(Fin_Y - Depart_Y)
				; Chemin en Y le plus long
				Fleche_Bas = 1
				Barre_Gauche = 1
			Else
				; Chemin en X le plus long
				Fleche_Gauche = 1
				Barre_Bas = 1
			EndIf
		EndIf
	Else
		; Vers la droite
		If Depart_Y >= Fin_Y
			; Vers le haut
			If Abs(Fin_X - Depart_X) < Abs(Fin_Y - Depart_Y)
				; Chemin en Y le plus long
				Fleche_Haut = 1
				Barre_Droite = 1
			Else
				; Chemin en X le plus long
				Fleche_Droite = 1
				Barre_Haut = 1
			EndIf
		Else
			; Vers le bas
			If Abs(Fin_X - Depart_X) < Abs(Fin_Y - Depart_Y)
				; Chemin en Y le plus long
				Fleche_Bas = 1
				Barre_Droite = 1
			Else
				; Chemin en X le plus long
				Fleche_Droite = 1
				Barre_Bas = 1
			EndIf
		EndIf
	EndIf
	
	
	HideGadget(#Fleche_Haut, 1 - Fleche_Haut)
	HideGadget(#Fleche_Bas, 1 - Fleche_Bas)
	HideGadget(#Fleche_Gauche, 1 - Fleche_Gauche)
	HideGadget(#Fleche_Droite, 1 - Fleche_Droite)
	
	If Fleche_Haut
		ResizeGadget(#Fleche_Haut, Fin_X - #Fleche_Dimension / 2, Fin_Y, #PB_Ignore, #PB_Ignore)
		ResizeGadget(#Fleche_BarreVerticale, Fin_X - #Fleche_Epaisseur / 2, Fin_Y + #Fleche_Dimension, #Fleche_Epaisseur, Depart_Y - Fin_Y - #Fleche_Dimension + #Fleche_Epaisseur / 2)
	EndIf
	If Fleche_Gauche
		ResizeGadget(#Fleche_Gauche, Fin_X, Fin_Y - #Fleche_Dimension / 2, #PB_Ignore, #PB_Ignore)
		ResizeGadget(#Fleche_BarreHorizontale, Fin_X + #Fleche_Dimension, Fin_Y - #Fleche_Epaisseur / 2, Depart_X - Fin_X - #Fleche_Dimension + #Fleche_Epaisseur / 2, #Fleche_Epaisseur)
	EndIf
	If Fleche_Bas
		ResizeGadget(#Fleche_Bas, Fin_X - #Fleche_Dimension / 2, Fin_Y - #Fleche_Dimension, #PB_Ignore, #PB_Ignore)
		ResizeGadget(#Fleche_BarreVerticale, Fin_X - #Fleche_Epaisseur / 2, Depart_Y - #Fleche_Epaisseur / 2, #Fleche_Epaisseur, Fin_Y - Depart_Y - #Fleche_Dimension + #Fleche_Epaisseur / 2)
	EndIf
	If Fleche_Droite
		ResizeGadget(#Fleche_Droite, Fin_X - #Fleche_Dimension, Fin_Y - #Fleche_Dimension / 2, #PB_Ignore, #PB_Ignore)
		ResizeGadget(#Fleche_BarreHorizontale, Depart_X - #Fleche_Epaisseur / 2, Fin_Y - #Fleche_Epaisseur / 2, Fin_X - Depart_X - #Fleche_Dimension + #Fleche_Epaisseur / 2, #Fleche_Epaisseur)
	EndIf
	
	If Barre_Gauche
		ResizeGadget(#Fleche_BarreHorizontale, Fin_X - #Fleche_Epaisseur / 2, Depart_Y - #Fleche_Epaisseur / 2, Depart_X - Fin_X + #Fleche_Epaisseur / 2, #Fleche_Epaisseur)
	EndIf
	If Barre_Droite
		ResizeGadget(#Fleche_BarreHorizontale, Depart_X, Depart_Y - #Fleche_Epaisseur / 2, Fin_X - Depart_X + #Fleche_Epaisseur / 2, #Fleche_Epaisseur)
	EndIf
	If Barre_Haut
		ResizeGadget(#Fleche_BarreVerticale, Depart_X - #Fleche_Epaisseur / 2, Fin_Y - #Fleche_Epaisseur / 2, #Fleche_Epaisseur, Depart_Y - Fin_Y + #Fleche_Epaisseur / 2)
	EndIf
	If Barre_Bas
		ResizeGadget(#Fleche_BarreVerticale, Depart_X - #Fleche_Epaisseur / 2, Depart_Y - #Fleche_Epaisseur / 2, #Fleche_Epaisseur, Fin_Y - Depart_Y + #Fleche_Epaisseur / 2)
	EndIf
	

EndProcedure


; Création de la fenêtre et de la GadgetList
If OpenWindow(0, 0, 0, 600, 600, "Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget) = 0
  End
EndIf

Depart_X = 300
Depart_Y = 300

Fleche_Creation()

Repeat
  Event = WaitWindowEvent()
	
  Select Event
		Case #WM_MOUSEMOVE ; La souris à bouger
			Fin_X = WindowMouseX(0)
			Fin_Y = WindowMouseY(0)
			
			Fleche_Position(Depart_X, Depart_Y, Fin_X, Fin_Y)
			
		Case #PB_Event_Gadget
      Select EventGadget() ; Gadgets
          
			EndSelect
	EndSelect
  
Until Event = #PB_Event_CloseWindow
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Relier graphiquement deux Gadgets

Message par Kwai chang caine »

Alors la les bras m'en tombent 8O
Vraiment mille merci, car je commence à etre désespéré :(
Elle est splendide ta fleche......et puis tout ce code.....j'en reviens pas 8O
Je risquais pas de m'en sortir :oops:

Un seul geste me viens immediatement a l'esprit

Image

Bon, il me reste a essayer de l'inserer dans un imageGadget, car je ne sais pas si tu le sais, mais c'est pour inserer dans une ImageGadget qui servira d'element dans mon Organigramme

Image

Pas de probleme pour la 4.40 ...j'y suis passé....et j'arrive a m'y faire, j'met noir de @ et de variables en plus, toutes les 3 lignes :?

C'est exactement ce que je voulais au niveau du deplacement, il me reste donc à la mettre dans un imageGadget et a resizer l'imageGadget a la vitesse et tout autour de la fleche.
Je pense que ça demain, je devrais y arriver, je te tiens au courant :D

Vraiment mille merci, a toi et aussi a KERNADEC qui m'avais promis de m'aider aussi. :wink:
C'est sincerement reconfortant d'avoir des copains comme vous quand on se sent au fond du trou 8)

Au fait...j'espere que tes vacances se sont bien passées :D (Quel impoli je fais) :oops:
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: Relier graphiquement deux Gadgets

Message par Le Soldat Inconnu »

La modification ne sera pas trop méchante, il suffit de remplacer les resizegadget.
Dans l'idée, c'est ça :
Tu remplaces le resizegadget des flèches par un DrawAlphaImage(
Et tu remplaces le ResizeGadget des containers (qui font le trait des flèches) par un Box(

Et si tu veux du dégradé, comme sur ton image, utilise les gradients
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Relier graphiquement deux Gadgets

Message par Kwai chang caine »

Le maitre des fleches a écrit :La modification ne sera pas trop méchante
:lol: :lol: :lol:J'suis mort de rire, car justement, j'allais t'ecrire exatement le contraire :lol: :lol:

Bah le probleme, c'est qu'apparement, tu utilise plusieurs imagegadgets pour faire la fleche.
Et que j'avais besoin de exactement ce que tu as fait pour le deplacement, mais que la fleche soit dans un seul image gadget, car apres une fois la fleche "réglée" a ma guise (Comme dirait jean rochefort), j'aimerais pouvoir la deplacer entierement comme un objet et que cette fois elle ne modifie plus.
Ce que je faisait dans mon code, j'utilisais la touche CTRL + Clic gauche + Deplacement souris pour modifier la fleche et juste Clic gauche + deplacement souris pour deplacer l'image.
L'image gadget se resizant automatiquement autour de la fleche comme dans ce code

Code : Tout sélectionner

Enumeration
 #Fenetre
 #Image_0
 #Image_1
 #FondBlanc
 #ImageGadget
EndEnumeration

Hauteur = 200
Largeur = 400
CreateImage(#Image_0, Largeur,Hauteur) 
CreateImage(#Image_1, Largeur,Hauteur)

Procedure DessineFleche(x, y)
  
 StartDrawing(ImageOutput(#Image_1))
  DrawImage(ImageID(#Image_0), 0, 0)
  LineXY(0, 10, x - 10, 10, RGB(226, 23, 29)) ; Horizontale
  LineXY(x - 10, 10, x - 10, y - 10, RGB(226, 23, 29)) ; Verticale
  LineXY(x - 10, y - 10, x - 15, y - 20, RGB(226, 23, 29))
  LineXY(x - 10, y - 10, x - 5, y - 20, RGB(226, 23, 29))
 StopDrawing()

 ResizeImage(#Image_1, x, y)
 ResizeImage(#Image_0, x, y)

 SetGadgetState(#ImageGadget,ImageID(#Image_1))

EndProcedure

OpenWindow(#Fenetre, 417, 181, 600, 500, "New window ( 0 )",  #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_TitleBar)
ImageGadget(#ImageGadget, 100, 100, 0, 0, ImageID(#Image_1))

StartDrawing(ImageOutput(#Image_0))
 FillArea(0,0,RGB(255,255,255),RGB(255,255,255))
StopDrawing()

DessineFleche(Largeur, Hauteur)
      
Repeat  

Evenement = WaitWindowEvent()

  Select Evenement
   
   Case #WM_MOUSEMOVE
   
    MouseX = WindowMouseX(#Fenetre)
    MouseY = WindowMouseY(#Fenetre)
    
    If GetAsyncKeyState_(#VK_LBUTTON) And MouseX > GadgetX(#ImageGadget) And MouseY > GadgetY(#ImageGadget)
     DessineFleche(MouseX - GadgetX(#ImageGadget), MouseY - GadgetY(#ImageGadget))
    EndIf         

   EndSelect

Until Evenement = #PB_Event_CloseWindow
1/ Donc en premier, je la "forme" comme ton code le fait en tenant le clic gauche.(Le gadgetimage entoure la fleche entiere)
2/ Puis je la deplace et la positionne ou je veux dans ma page

Et la, je ne peux pas inserer des imagegadgets coincé dans une seule imagegadget :(
Ou alors j'etais en train de penser les inserer dans un gadget "container", mais est ce que ça va pas encore coincer quelque part....car tout ce joli monde est deja dans un scrollArea gigantesque ??? :roll:

Y'a pas que les cowboys qui auront eu du mal avec les fleches :(

EDIT : J'ai pas besoin qu'elle soit dégradée...les fleches dégradées que tu vois sur la photo, sont d'autres fleches faites avec une image, et celle ci ne sont pas resizable, c'est pourquoi j'ai deux modeles, les fleches courtes....et les personalisables comme celle que tu viens de me donner le code :wink:
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: Relier graphiquement deux Gadgets

Message par kernadec »

bonjour KCC

pour l'explication des deux images

StartDrawing(ImageOutput(#Image_1)) ; image ou l'on dessine
DrawImage(ImageID(#Image_0), 0, 0) ; dessin de l'image0 = (page blanche) dans l'image_1 ce qui efface le dessin precedent
For i = 1 To Epaisseur ; remplacé immediatement par nouveau dessin lié au mouvenemt de la souris
LineXY(GadgetWidth(#ImageGadget) / 2, 170 + i, x + 40, 170 + i, Couleur) ; Horizontale
LineXY(x + 40 - i, y+35, x + 40 - i,180, Couleur) ; Verticale
LineXY(x + 40 - i, y + 30, x + 60 - i, y + 60, Couleur) ; Bord fleche gauche
LineXY(x + 40 - i, y + 30, x + 20 - i, y + 60, Couleur) ; Bord fleche droit
Next
StopDrawing()
SetGadgetState(#ImageGadget,ImageID(#Image_1)) ; réactive etat affiché d'imagegadget

je t'envoie un essai, regarde si ca te convient comme ca je vais poursuivre dans cette voie...
pour la flêche et l'epaisseur, ca ne seras que des options de cet essai!

Cordialement

Code : Tout sélectionner

Enumeration
#Fenetre
#Image_0
#Image_1
#Image_2
#Image_3
#FondBlanc
#ImageGadget_0
#ImageGadget_1
#boutonGadget_0
#boutonGadget_1
#boutonGadget_2
#boutonGadget_3
EndEnumeration
Hauteur = 1
Largeur = 1
CreateImage(#Image_0, Largeur,Hauteur) 
CreateImage(#Image_1, Largeur,Hauteur)
CreateImage(#Image_2, Largeur,Hauteur) 
CreateImage(#Image_3, Largeur,Hauteur)
Procedure DessineFlechev(x, y)

StartDrawing(ImageOutput(#Image_1))
DrawImage(ImageID(#Image_0),0,0)
;FillArea(0,0,RGB(255,0,0),RGB(255,0,0))

LineXY(MouseX , 0,MouseX , y , RGB(226, 23, 29)) ; Verticale

StopDrawing()
ResizeImage(#Image_1, 1, y)
ResizeImage(#Image_0, 1, y)
ImageGadget(#ImageGadget_0,x+MouseX, 100, x, 0, ImageID(#Image_1))
SetGadgetState(#ImageGadget_0,ImageID(#Image_1))
RedrawWindow_(WindowID(#Fenetre), 0, 0, #RDW_INVALIDATE|#RDW_UPDATENOW)

EndProcedure
Procedure DessineFlecheh(x1, y1,mx)
If mx>100 
StartDrawing(ImageOutput(#Image_3))
DrawImage(ImageID(#Image_2), 0, 0)
;LineXY(0, 0, x , 0, RGB(226, 23, 29)) ; Horizontale
FillArea(0,0,RGB(255,0,0),RGB(255,0,0))
StopDrawing()
ResizeImage(#Image_3, x1, y1)
ResizeImage(#Image_2, x1, y1)
EndIf
SetGadgetState(#ImageGadget_1,ImageID(#Image_3))
;RedrawWindow_(WindowID(#Fenetre), 0, 0, #RDW_INVALIDATE|#RDW_UPDATENOW)
EndProcedure

OpenWindow(#Fenetre, 417, 181, 600, 500, "New window ( 0 )",  #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_TitleBar)

ImageGadget(#ImageGadget_0, 100, 100, 0, 0, ImageID(#Image_1))
ImageGadget(#ImageGadget_1, 100, 100, 0, 0, ImageID(#Image_1))
ButtonGadget(#boutonGadget_0, 120,80, 50, 30, "texte" )

ButtonGadget(#boutonGadget_1, 240,140, 50, 30, "texte" )
ButtonGadget(#boutonGadget_2, 240,190, 50, 30, "texte" )
ButtonGadget(#boutonGadget_3, 320,290, 50, 30, "texte" )


StartDrawing(ImageOutput(#Image_0))
FillArea(0,0,RGB(255,255,255),RGB(255,255,255))
StopDrawing()
StartDrawing(ImageOutput(#Image_2))
FillArea(0,0,RGB(255,255,255),RGB(255,255,255))
StopDrawing()

DessineFlechev(1, 1)
DessineFlecheh(1, 1,100)

Repeat  

Evenement = WaitWindowEvent()
 	Select Evenement
		
		Case #WM_MOUSEMOVE
	  MouseX = WindowMouseX(#Fenetre)
		MouseY = WindowMouseY(#Fenetre)
		If mouseX>100 Or mouseY>100
		If GetAsyncKeyState_(#VK_LBUTTON); And MouseX > GadgetX(#ImageGadget_0) And MouseY > GadgetY(#ImageGadget_0) ;And (GetAsyncKeyState_(#VK_LBUTTON) And MouseX < GadgetX(#ImageGadget_0)+10 And MouseY < GadgetY(#ImageGadget_0)+10) 
			DessineFlechev(MouseX, MouseY - GadgetY(#ImageGadget_0)-5)
		  DessineFlecheh(MouseX - GadgetX(#ImageGadget_1), 1,mousex)
	   EndIf         
    EndIf
		EndSelect
 
Until Evenement = #PB_Event_CloseWindow

Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Relier graphiquement deux Gadgets

Message par Kwai chang caine »

Bonjour KERNADEC

Merci pour l'explication. 8)

C'est drolement cool ton idée 8O
C'est une autre approche ....
Ce pourrait etre un complement d'enfer a mon programme.

Car en fait, la fleche se trace automatiquement 8O

Au tout debut, je voulais faire cette option, mais j'ai pris peur et je me suis dit, je vais taper plus simple.
C'est a dire rajouter un gadget image entre les autres qui donnera l'impression qu'ils sont reliés :wink:

J'ai abandonné ton idée, car je me suis dit : "Et si tu deplace les gadgets ??? apres avoir tracé la ligne"
Et ben la ligne va rester :(
Et apres comment je vais l'effacer pour en retracer une autre :roll:

Dans ton schema, il faudrait que les lignes suivent les gadgets, une fois tracé elle se modifient en ne le lachant pas....car tous les gadgets sont mobiles
Dans un logigramme qui s'appelle DIA et qui est freeware, c'est ce qui se passe.
JE t'explique pas le bordel quand tu croise les elements :lol:

Ou alors faire une option, supprimer la ligne en selectionnant les deux gadgets a relier, d'une certaine maniere par exemple en appuyant des touches de clavier en meme temps, et l'option inverse avec d'autres touches
Donc dans ton option, il ne faudrait pas que la fleche parte d'un point de la fenetre...mais d'un gadget preselectionné....et encore du bon coté du gadget....car tout est automatique.....fiooouuuuu pas simple :(
Mais tu vois c'est bien plus compliqué que ma methode, ou la fleche est independante des autres gadgets.

C'est sur que si tu as le temps et que ça te derange pas trop, et que tu peux le faire, je pourrais ajouter un choix ligne auto ou manuelle ...
Et puis attention !!! faut pas oublier que je suis dans un areagadget, est ce que les lignes se tracent pareil que sur une fenetre ????
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: Relier graphiquement deux Gadgets

Message par kernadec »

merci KCC

je vois que ton affaire se complique, si tu relie des objets avec des fêches
et qu'ensuite le lien devient dynamique en fonction du déplacement de l'objet
ca va devenir une usine a gaz.
car gérer les liens en tenant compte de la position de la taille des autres objets
en cherchant chemin le plus court ca va pas être de la tarte.
tu as regarder dans les sources sur la généalogie, ya peut être des idées par là

pour le moment je n'ai pas beaucoup de temps, je t'ai fais ca vite fait
je vais étudier ca ce soir

cordialement
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Relier graphiquement deux Gadgets

Message par Kwai chang caine »

Non mais te casse pas la tete....
Je pense que la solution, de la fleche toutes directions dans un imagegadget qui s'auto resize, est la plus simple.
En fait c'est la reunion de tes deux codes de fleche bleu (Haut et bas) avec le resizing de l'imageGadget auto autour de la fleche, on en est pas loin cette fois :D
Si j'arrive deja a ça..je serais super content 8)

En tout cas merci aussi pour ton debut de code automatique, çà peut me donner un bon depart, si un jour, je veux rajouter cette option :wink:
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: Relier graphiquement deux Gadgets

Message par kernadec »

bonjour KCC

voila 4 petits codes
il te suffiras de les reunir pour obtenir ce que tu recherche, d'après ce que j'ai compris.

et je n'ai pas beaucoup de temps en ce moment, alors je te livre les code brutes

cordialement

Code : Tout sélectionner

; imagegadget avec flêche haut_gauche
Enumeration
#Fenetre
#Image_0
#Image_1
#FondBlanc
#ImageGadget
EndEnumeration
Global Hauteur.l,Largeur .l
Hauteur = 300
Largeur = 400
CreateImage(#Image_0, Largeur,Hauteur) 
CreateImage(#Image_1, Largeur,Hauteur)

Procedure DessineFleche(x, y) 
x1=Abs(1-x+largeur)
y1=Abs(1-y+Hauteur)
StartDrawing(ImageOutput(#Image_1))
	DrawImage(ImageID(#Image_0), 0, 0)
	LineXY(10, GadgetHeight(#ImageGadget)- 10, GadgetWidth(#ImageGadget),GadgetHeight(#ImageGadget)- 10, RGB(226, 23, 29)) ; Horizontale
	LineXY(GadgetWidth(#ImageGadget)-x1 + 10, 10, GadgetWidth(#ImageGadget)-x1 + 10, GadgetHeight(#ImageGadget)- 10, RGB(226, 23, 29)) ; Verticale
	LineXY(GadgetWidth(#ImageGadget)-x1 +10, 10, GadgetWidth(#ImageGadget)-x1 +15,  20, RGB(226, 23, 29))
	LineXY(GadgetWidth(#ImageGadget)-x1 +10,  10, GadgetWidth(#ImageGadget)-x1 + 5, 20, RGB(226, 23, 29))
StopDrawing()
  ResizeImage(#Image_1, x1, y1)
  ResizeImage(#Image_0, x1, y1)
  ImageGadget(#ImageGadget,x,y,x1, y1,ImageID(#Image_1))
  SetGadgetState(#ImageGadget,ImageID(#Image_1))
EndProcedure

OpenWindow(#Fenetre, 0, 0, 800, 600, "New window ( 0 )",  #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_TitleBar)
ImageGadget(#ImageGadget,0,0,0,0, ImageID(#Image_1))   ;initialise ImageGadge
StartDrawing(ImageOutput(#Image_0))
FillArea(0,0,RGB(255,255,255),RGB(255,255,255))
StopDrawing()
DessineFleche(Largeur-30, Hauteur-30)

Repeat  

Evenement = WaitWindowEvent()
  MouseX = WindowMouseX(#Fenetre)
	MouseY = WindowMouseY(#Fenetre)
  If mousex<400 And mousey<300
	  Select Evenement
		
		Case #WM_MOUSEMOVE


		 If GetAsyncKeyState_(#VK_LBUTTON) 
			DessineFleche(MouseX , MouseY)
		 EndIf 
		EndSelect
  EndIf
Until Evenement = #PB_Event_CloseWindow

Code : Tout sélectionner

; imagegadget avec flêche haut_droit
Enumeration
#Fenetre
#Image_0
#Image_1
#FondBlanc
#ImageGadget
EndEnumeration
Global Hauteur.l,Largeur .l
Hauteur = 300
Largeur = 400
CreateImage(#Image_0, Largeur,Hauteur) 
CreateImage(#Image_1, Largeur,Hauteur)

Procedure DessineFleche(x, y)
x1=Abs(Largeur+x-(Largeur*2))
y1=Hauteur-y
StartDrawing(ImageOutput(#Image_1))
	DrawImage(ImageID(#Image_0), 0, 0)
	LineXY(0, GadgetHeight(#ImageGadget)- 10, GadgetWidth(#ImageGadget) - 10,GadgetHeight(#ImageGadget)- 10, RGB(226, 23, 29)) ; Horizontale
	LineXY(GadgetWidth(#ImageGadget) - 10, 10, GadgetWidth(#ImageGadget) - 10, GadgetHeight(#ImageGadget)- 10, RGB(226, 23, 29)) ; Verticale
	LineXY(GadgetWidth(#ImageGadget) - 10, 10, GadgetWidth(#ImageGadget) - 15,  20, RGB(226, 23, 29))
	LineXY(GadgetWidth(#ImageGadget) - 10,  10, GadgetWidth(#ImageGadget) - 5, 20, RGB(226, 23, 29))
StopDrawing()
  ResizeImage(#Image_1,x1, y1)
  ResizeImage(#Image_0, x1, y1)
  ImageGadget(#ImageGadget, Largeur, Hauteur-y1,x1, Hauteur-y, ImageID(#Image_1))
  SetGadgetState(#ImageGadget,ImageID(#Image_1))
EndProcedure

OpenWindow(#Fenetre, 0, 0, 800, 600, "New window ( 0 )",  #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_TitleBar)
ImageGadget(#ImageGadget,0,0,0,0, ImageID(#Image_1))   ;initialise ImageGadget
StartDrawing(ImageOutput(#Image_0))
FillArea(0,0,RGB(255,255,255),RGB(255,255,255))
StopDrawing()
DessineFleche(Largeur-30, Hauteur-30)
			
Repeat  

Evenement = WaitWindowEvent()
  MouseX = WindowMouseX(#Fenetre)
	MouseY = WindowMouseY(#Fenetre)
  If mousex>400 And mousey<300

	Select Evenement
		
		Case #WM_MOUSEMOVE
			
		If GetAsyncKeyState_(#VK_LBUTTON) ;And MouseX > GadgetX(#ImageGadget) And MouseY > GadgetY(#ImageGadget)
			DessineFleche(MouseX , MouseY)
		EndIf         

		EndSelect
EndIf  
Until Evenement = #PB_Event_CloseWindow

Code : Tout sélectionner

; imagegadget avec flêche bas_gauche
Enumeration
#Fenetre
#Image_0
#Image_1
#FondBlanc
#ImageGadget
EndEnumeration
Global Hauteur.l,Largeur .l
Hauteur = 300
Largeur = 400

CreateImage(#Image_0, Largeur,Hauteur) 
CreateImage(#Image_1, Largeur,Hauteur)

Procedure DessineFleche(x, y)
x1=Abs(1-x+largeur)
y1=Abs(Hauteur-y)

StartDrawing(ImageOutput(#Image_1))
	DrawImage(ImageID(#Image_0), 0, 0)
	LineXY(10, 10, GadgetWidth(#ImageGadget), 10, RGB(226, 23, 29)) ; Horizontale
	LineXY(GadgetWidth(#ImageGadget)-x1 + 10, 10, GadgetWidth(#ImageGadget)-x1 + 10, GadgetHeight(#ImageGadget)- 10, RGB(226, 23, 29)) ; Verticale
	LineXY(GadgetWidth(#ImageGadget)-x1 + 10, GadgetHeight(#ImageGadget) - 10, GadgetWidth(#ImageGadget) -x1+ 15, GadgetHeight(#ImageGadget) - 20, RGB(226, 23, 29))
	LineXY(GadgetWidth(#ImageGadget) -x1+ 10, GadgetHeight(#ImageGadget) - 10, GadgetWidth(#ImageGadget) -x1+ 5,GadgetHeight(#ImageGadget) - 20, RGB(226, 23, 29))
StopDrawing()
  ResizeImage(#Image_1,x1, y1)
  ResizeImage(#Image_0, x1, y1)
  ImageGadget(#ImageGadget,x ,Hauteur,x1,Hauteur+y, ImageID(#Image_1))
  SetGadgetState(#ImageGadget,ImageID(#Image_1))
EndProcedure

OpenWindow(#Fenetre, 0, 0, 800, 600, "New window ( 0 )",  #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_TitleBar)
ImageGadget(#ImageGadget,0,0,0,0, ImageID(#Image_1))   ;initialise ImageGadge
StartDrawing(ImageOutput(#Image_0))
FillArea(0,0,RGB(255,255,255),RGB(255,255,255))
StopDrawing()
DessineFleche(Largeur-30,Hauteur-30)
			
Repeat  

Evenement = WaitWindowEvent()
   MouseX = WindowMouseX(#Fenetre)
	 MouseY = WindowMouseY(#Fenetre)
  If mousex<400 And mousey>300
   Select Evenement
		
		Case #WM_MOUSEMOVE
		
		 If GetAsyncKeyState_(#VK_LBUTTON)
			DessineFleche(MouseX , MouseY)
		 EndIf         

		EndSelect
EndIf  
Until Evenement = #PB_Event_CloseWindow

Code : Tout sélectionner

; imagegadget avec flêche bas_droite
Enumeration
#Fenetre
#Image_0
#Image_1
#FondBlanc
#ImageGadget
EndEnumeration
Global Hauteur.l,Largeur .l
Hauteur = 300
Largeur = 400
CreateImage(#Image_0, Largeur,Hauteur) 
CreateImage(#Image_1, Largeur,Hauteur)

Procedure DessineFleche(x, y)
	x1=Abs(Largeur+x-(Largeur*2))
	y1=y-Hauteur
StartDrawing(ImageOutput(#Image_1))
	DrawImage(ImageID(#Image_0), 0, 0)
	LineXY(0, 10, GadgetWidth(#ImageGadget) - 10, 10, RGB(226, 23, 29)) ; Horizontale
	LineXY(GadgetWidth(#ImageGadget) - 10, 10, GadgetWidth(#ImageGadget) - 10, GadgetHeight(#ImageGadget)- 10, RGB(226, 23, 29)) ; Verticale
	LineXY(GadgetWidth(#ImageGadget) - 10, GadgetHeight(#ImageGadget) - 10, GadgetWidth(#ImageGadget) - 15, GadgetHeight(#ImageGadget) - 20, RGB(226, 23, 29))
	LineXY(GadgetWidth(#ImageGadget) - 10, GadgetHeight(#ImageGadget) - 10, GadgetWidth(#ImageGadget) - 5,GadgetHeight(#ImageGadget) - 20, RGB(226, 23, 29))
StopDrawing()
  ResizeImage(#Image_1,x1, y1)
  ResizeImage(#Image_0, x1, y1)
  ImageGadget(#ImageGadget, Largeur,Hauteur,x1, Hauteur+y1, ImageID(#Image_1))
  SetGadgetState(#ImageGadget,ImageID(#Image_1))
EndProcedure

OpenWindow(#Fenetre, 0, 0, 800, 600, "New window ( 0 )",  #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_TitleBar)
ImageGadget(#ImageGadget, 0, 0, 0, 0, ImageID(#Image_1))
StartDrawing(ImageOutput(#Image_0))
FillArea(0,0,RGB(255,255,255),RGB(255,255,255))
StopDrawing()
DessineFleche(Largeur+30, Hauteur+30)
			
Repeat  

Evenement = WaitWindowEvent()

 MouseX = WindowMouseX(#Fenetre)
 MouseY = WindowMouseY(#Fenetre)
	If mousex>400 And mousey>300
   	Select Evenement
		
		Case #WM_MOUSEMOVE
		
		If GetAsyncKeyState_(#VK_LBUTTON)
			DessineFleche(MouseX , MouseY )
		EndIf         

		EndSelect
EndIf
Until Evenement = #PB_Event_CloseWindow
Dernière modification par kernadec le mar. 19/janv./2010 15:11, modifié 3 fois.
Répondre