Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 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 | | Calendrier |
|
|
| Faire un trou complexe dans un objet FORM | |
| | Auteur | Message |
---|
papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Faire un trou complexe dans un objet FORM Mar 26 Avr 2016 - 0:45 | |
| Je sais que KGF.DLL de Klaus permet de trouer un FORM. Ce que je ne le savais pas c’est quelles API utiliser pour faire la même chose (ou presque) en Panoramic. Je suis tombé par hasard sur un bout de code en Delphi qui traite des régions sous Delphi. Quelques petites recherches encore et une première tentative et ça donne ça ! Je suis content comme un gosse qui a reçu un bon bonbon ! - Code:
-
rem ============================================================================ rem Faire un trou complexe dans un objet FORM rem ============================================================================ dim hWnd%,r1%,r2%,r3%,w%,h%,ret% ,i dim RGN_XOR : RGN_XOR = 3 dim RGN_OR : RGN_OR = 2 width 0,400 : height 0,400 : top 0,(screen_y - height(0))/2 : color 0,200,100,50 w% = width(0) : h% = height(0) hWnd% = handle(0) caption 0,"Trou complexe dans FORM"
dll_on "gdi32"
r1% = dll_call4("CreateRectRgn",0,0,w%,h%) : ' R1 englobe toute la form
r3% = dll_call4("CreateEllipticRgn",81,81,81+75,81+81) : ' Le premier oeil ret% = dll_call4("CombineRgn",R1%,R1%,R3%,RGN_XOR) : ' Soustraction du premier oeil de R1
R3% = dll_call4("CreateEllipticRgn",229,81,229+75,81+81) : ' Le deuxieme oeil ret% = dll_call4("CombineRgn",R1%,R1%,R3%,RGN_XOR) : ' Soustraction du deuxième oeil de R1
R3% = dll_call4("CreateEllipticRgn",94, 194, 195+94, 133+194) : ' Une ellipse pour la bouche ret% = dll_call4("CombineRgn",R1%, R1%, R3%,RGN_XOR) : ' Soustraction de l'ellipse de R1
R3% = dll_call4("CreateEllipticRgn",87,191, 87+213, 191+90) : ' Une ellipse à soustraire de la bouche ret% = dll_call4("CombineRgn",R1%, R1%, R3%,RGN_OR) : ' Ajout de l'ellipse à R1
R2% = dll_call4("CreateEllipticRgn",25,38,25+333,38+311): ' La tête ret% = dll_call4("CombineRgn",R1%, R1%, R2%,RGN_XOR) : ' Creuse toute la tête sauf les régions ajoutées précédemment dll_off dll_on "user32"
ret% = dll_call3("SetWindowRgn",hWnd%, R1%, 0) : ' Applique le tout à la form dll_off for i = screen_x to 10 step -2 : left 0,i : pause 1 : next i rem ============================================================================
Dernière édition par papydall le Mar 26 Avr 2016 - 1:08, édité 1 fois | |
| | | Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: Faire un trou complexe dans un objet FORM Mar 26 Avr 2016 - 0:59 | |
| Très original ! Avec un exemple très PRO et, comme d'habitude, un source très bien détaillé.
Merci Papydall pour ton emporte-pièce numérique !
| |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Mar 26 Avr 2016 - 1:08 | |
| C' est assez original. | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Faire un trou complexe dans un objet FORM Mar 26 Avr 2016 - 1:09 | |
| Merci Marc37. Merci Ygeronimi Tout le plaisir est pour moi. | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Faire un trou complexe dans un objet FORM Mar 26 Avr 2016 - 1:32 | |
| Puisque vous avez apprécié, voici un autre code. - Code:
-
rem ============================================================================ rem Pour fermer la fenêtre cliquer sur le coin haut droit, rem puis Fermer ou <ALT> + F4 rem ============================================================================ dim ret%, hWnd% dim h1%,h2%,h3% dim RGN_XOR : RGN_XOR = 3 dim RGN_OR : RGN_OR = 2 top 0,300 : left 0,500 : color 0,0,255,255 hWnd% = handle(0) dll_on "gdi32"
h1% = dll_call4("CreateEllipticRgn",0-20,0-20,100,100) h2% = dll_call4("CreateEllipticRgn",090,000,190,100) h3% = dll_call4("CreateEllipticRgn",180,000,280,100)
ret% = dll_call4("CombineRgn",h1%,h1%,h2%,RGN_OR) ret% = dll_call4("CombineRgn",h1%,h1%,h3%,RGN_OR)
dll_off dll_on "user32" ret% = dll_call3("SetWindowRgn",hWnd%, h1%, 0) rem ============================================================================
Faites vos tests! | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Faire un trou complexe dans un objet FORM Mar 26 Avr 2016 - 8:03 | |
| Belle trouvaille Papydall ! Je met de coté, ça peut servir..... (j'imagine un glouton qui dévore la fenêtre ) A+ | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Faire un trou complexe dans un objet FORM Mar 26 Avr 2016 - 16:00 | |
| C'est vrai que c'est sympa tout ça, des trous complexes elliptiques qui se baladent sur l'écran. A partir de là, j'essaie de faire un trou tout simple et fixe, rectangulaire, dans un Form fixe, pour qu'on voie à travers, mais je n'y arrive pas... PS ça y est, ça commence à venir: - Code:
-
rem ============================================================================ rem Faire un trou complexe dans un objet FORM rem ============================================================================ dim hWnd%,r1%,r2%,r3%,w%,h%,ret% ,i dim x%,y%, dim RGN_XOR : RGN_XOR = 3 dim RGN_OR : RGN_OR = 2 dim w0%,h0% w0% = 600: h0% = 600 width 0,w0% : height 0,h0% : top 0,100 : LEFT 0,50: color 0,200,100,50 border_small 0 w% = w0% : h% = h0% hWnd% = handle(0) caption 0,"Trou complexe dans FORM"
dll_on "gdi32" r1% = dll_call4("CreateRectRgn",0,0,w%,h%) : ' R1 englobe toute la form x% = 20: y% = 40: w% = w0%-50: h% = h0%-60 r3% = dll_call4("CreateRectRgn",x%,y%,x%+w%,y%+h%) : ' Le premier oeil ret% = dll_call4("CombineRgn",r1%,r1%,r3%,RGN_XOR) : ' Soustraction du premier oeil de R1 dll_off dll_on "user32" ret% = dll_call3("SetWindowRgn",hWnd%, r1%, 0) : ' Applique le tout à la form dll_off rem ============================================================================ C'est un peu aléatoire quand même, j'ai l'impression d'avoir une ressource pas ou mal libérée. En fait, le code ci-dessus est très empirique par rapport à ton code papydall, je n'ai pas tout compris... | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Faire un trou complexe dans un objet FORM Mar 26 Avr 2016 - 19:37 | |
| Attention Papydall, si tu continues comme ça tu finiras dans quelques temps par obtenir un niveau Klaussien Bon sérieusement, bien trouvé, programmé et documenté. Tu es vraiment le parfait exemple du contributeur "idéal" de ce forum et non je n'ai aucune idée de la prochaine pépite que tu vas nous dénicher. | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Faire un trou complexe dans un objet FORM Mer 27 Avr 2016 - 6:48 | |
| - Code:
-
rem ============================================================================ rem FORM circulaire rem ============================================================================ dim hWnd%,ret%,w%,h%, cercle%,carre% ' Constantes dim RGN_AND : RGN_AND = 1 dim RGN_OR : RGN_OR = 2 dim RGN_XOR : RGN_XOR = 3 dim RGN_DIFF : RGN_DIFF = 4 dim RGN_COPY : RGN_COPY = 5
label clic width 0,400 : height 0,400 : top 0,(screen_y - height(0))/2 : color 0,200,100,50 w% = width(0) : h% = height(0) hWnd% = handle(0) caption 0,string$(30," ") + "Cliquer et déplacer ce FORM" 2d_fill_on : 2d_fill_color 255,0,0 : 2d_pen_width 2
2d_circle 200,200,100 button 10 : top 10,180 : left 10,160 : caption 10,"Quitter" : on_click 10,clic dll_on "gdi32" ' on definit une region ellipse de même coordonnées que le cercle cercle% = dll_call4("CreateEllipticRgn",0, 0, w%, h%) ' on definit un carré carre% = dll_call4("CreateRectRgn",150, 50, 220, 120) ' on définit une region combinant le cercle et le carré ret% = dll_call4("CombineRgn",carre%,cercle%,carre%,RGN_DIFF) dll_off dll_on "user32" ' on affecte cette region à la form ret% = dll_call3("SetWindowRgn",hWnd%, carre%, 0) dll_off dll_on "gdi32" ' on supprime la region cercle, la transformation est faite. On en a plus besoin ret% = dll_call1("DeleteObject",cercle%)
end rem ============================================================================ clic: dll_off dll_on "user32" ret% = dll_call4("PostMessageA",hWnd%,16,0,0) : ' 16 c'est la constante de fermeture return
rem ============================================================================
| |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Faire un trou complexe dans un objet FORM Mer 27 Avr 2016 - 8:10 | |
| Papydall, sans les bords c'est plus sympa - Code:
-
rem ============================================================================ rem FORM circulaire rem ============================================================================ dim hWnd%,ret%,w%,h%, cercle%,carre% ' Constantes dim RGN_AND : RGN_AND = 1 dim RGN_OR : RGN_OR = 2 dim RGN_XOR : RGN_XOR = 3 dim RGN_DIFF : RGN_DIFF = 4 dim RGN_COPY : RGN_COPY = 5
label clic,DepDroite,DepGauche border_hide 0 width 0,400 : height 0,400 : top 0,(screen_y - height(0))/2 : left 0,(screen_x - width(0))/2 : color 0,200,100,50 w% = width(0) : h% = height(0) hWnd% = handle(0) ' caption 0,string$(30," ") + "Cliquer et déplacer ce FORM" 2d_fill_on : 2d_fill_color 255,0,0 : 2d_pen_width 2 2d_circle 200,200,100
button 10 : top 10,180 : left 10,160 : caption 10,"Quitter" : on_click 10,clic button 11 : width 11,20 : height 11,20 : top 11,50 : left 11,250 : caption 11,">" : on_click 11,DepDroite button 12 : width 12,20 : height 12,20 : top 12,50 : left 12,100 : caption 12,"<" : on_click 12,DepGauche
dll_on "gdi32" ' on definit une region ellipse de même coordonnées que le cercle cercle% = dll_call4("CreateEllipticRgn",0, 0, w%, h%) ' on definit un carré carre% = dll_call4("CreateRectRgn",150, 50, 220, 120) ' on définit une region combinant le cercle et le carré ret% = dll_call4("CombineRgn",carre%,cercle%,carre%,RGN_DIFF) dll_off dll_on "user32" ' on affecte cette region à la form ret% = dll_call3("SetWindowRgn",hWnd%, carre%, 0) dll_off dll_on "gdi32" ' on supprime la region cercle, la transformation est faite. On en a plus besoin ret% = dll_call1("DeleteObject",cercle%)
end rem ============================================================================ DepDroite: left 0,left(0)+100 return DepGauche: left 0,left(0)-100 return
clic: dll_off dll_on "user32" ret% = dll_call4("PostMessageA",hWnd%,16,0,0) : ' 16 c'est la constante de fermeture return
rem ============================================================================
Je n'ai pas réussi à centrer le carré, mais il doit bien y avoir une possibilité ? A+ | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Faire un trou complexe dans un objet FORM Mer 27 Avr 2016 - 20:26 | |
| - Code:
-
rem ============================================================================ rem FORM circulaire rem ============================================================================ dim hWnd%,ret%,w%,h%, cercle%,carre% ,i ' Constantes dim RGN_AND : RGN_AND = 1 dim RGN_OR : RGN_OR = 2 dim RGN_XOR : RGN_XOR = 3 dim RGN_DIFF : RGN_DIFF = 4 dim RGN_COPY : RGN_COPY = 5
label clic,DepDroite,DepGauche,Centrer border_hide 0 width 0,400 : height 0,400 : top 0,(screen_y - height(0))/2 : left 0,(screen_x - width(0))/2 : color 0,200,100,50 w% = width(0) : h% = height(0) hWnd% = handle(0)
2d_fill_on : 2d_fill_color 255,0,0 : 2d_pen_color 0,255,255 : 2d_pen_width 20 2d_circle 200,200,100
button 10 : top 10,180 : left 10,160 : caption 10,"Quitter" : on_click 10,clic button 11 : width 11,20 : height 11,20 : top 11,50 : left 11,270 : caption 11,">>" : font_bold 11 : on_click 11,DepDroite button 12 : width 12,20 : height 12,20 : top 12,50 : left 12,100 : caption 12,"<<" : font_bold 12 : on_click 12,DepGauche button 13 : width 13,20 : height 13,20 : top 13,20 : left 13,180 : caption 13,"||" : font_bold 13 : on_click 13,Centrer dll_on "gdi32" ' on definit une région ellipse de même coordonnées que le cercle cercle% = dll_call4("CreateEllipticRgn",0, 0, w%, h%) ' on definit un carré carre% = dll_call4("CreateRectRgn",130, 50, 260, 120) ' on définit une région combinant le cercle et le carré ret% = dll_call4("CombineRgn",carre%,cercle%,carre%,RGN_DIFF) dll_off dll_on "user32" ' on affecte cette region à la form ret% = dll_call3("SetWindowRgn",hWnd%, carre%, 0) dll_off dll_on "gdi32" ' on supprime la region cercle, la transformation est faite. On en a plus besoin ret% = dll_call1("DeleteObject",cercle%)
end rem ============================================================================ DepDroite: for i = left(0) to screen_x-400 : left 0,i : pause 1 : next i return rem ============================================================================ DepGauche: for i = left(0) to 20 step -1 : left 0,i : pause 1 : next i return rem ============================================================================ Centrer: top 0,(screen_y - height(0))/2 : left 0,(screen_x - width(0))/2 return rem ============================================================================ clic: dll_off dll_on "user32" ret% = dll_call4("PostMessageA",hWnd%,16,0,0) : ' 16 c'est la constante de fermeture return
rem ============================================================================
| |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Faire un trou complexe dans un objet FORM Mer 27 Avr 2016 - 20:36 | |
| J'ai un souci: la constante de fermeture ne marche pas, (le bouton quitter), je suis obligé de tuer la tâche. En plaçant un terminate, j'ai au moins le message Windows qui me permet d'arrêter la programme.
Le bouton "Pause" ne recentre pas le Form comme prévu.
Sinon le carré est bien centé.
A+ | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Faire un trou complexe dans un objet FORM Mer 27 Avr 2016 - 21:07 | |
| Chez moi, Windows 7 , je ne rencontre pas de soucis avec mon bouton quitter Le bouton « Pause » recentre parfaitement le FORM. Je n’ai de soucis / problème qu’avec TERMINATE ! | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Faire un trou complexe dans un objet FORM Mer 27 Avr 2016 - 21:11 | |
| La commande n'est peut-être pas la même sous W10, je dis ça, mais j'en sait rien. Pour Terminate, on connais le problème.
A+ | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Faire un trou complexe dans un objet FORM Jeu 28 Avr 2016 - 1:53 | |
| Un autre exemple. - Code:
-
rem ============================================================================ rem FORM quelconque rem ============================================================================ dim hWnd%,ret%,w%,h%,region%, RegionRectangle% ,i ' Constantes dim RGN_AND : RGN_AND = 1 dim RGN_OR : RGN_OR = 2 dim RGN_XOR : RGN_XOR = 3 dim RGN_DIFF : RGN_DIFF = 4 dim RGN_COPY : RGN_COPY = 5 rem ============================================================================ ' CombineRegion utilisé avec RGN_DIFF permet l'union des 2 régions ' il existe aussi : ' RGN_AND pour récupérer l'intersection des deux régions ' RGN_XOR pour faire l'union des parties non communes mais en retirant les parties communes rem ============================================================================ label fermer dll_on "gdi32" ' border_hide 0 caption 0,"" width 0,400 : height 0,400 : top 0,(screen_y - height(0))/2 : left 0,(screen_x - width(0))/2 : color 0,200,100,50 w% = width(0): h% = height(0) hWnd% = handle(0) button 10 : top 10,50 : left 10,w%/2-50 : font_bold 10 : caption 10,"Fermer": on_click 10,fermer ' on definit une region ellipse inscrite dasn la forme Region% = dll_call4("CreateEllipticRgn",0, 0, w%, h%) ' on definit un carré qui est à l'intérieur de la form RegionRectangle% = dll_call4("CreateRectRgn",int(w%/2-50),int(H%/2-50),int(W%/2+50),int(H%/2+50)) ' on définit une region combinant le cercle et le carré ' CombineRegion utilisé avec RGN_DIFF permet de retirer RegionRectangle de Region ' d'où l'effet de transparence. ret% = dll_call4("CombineRgn",Region%,Region%,RegionRectangle%,RGN_DIFF) ' libération des ressources avant de réaffecter une autre région ret% = dll_call1("DeleteObject",RegionRectangle%)
RegionRectangle% = dll_call4("CreateRectRgn",0,h%-40,w%,h%) ' création du rectangle du bas ret% = dll_call4("CombineRgn",Region%,Region%,RegionRectangle%,RGN_OR) ' libération des ressources ret% = dll_call1("DeleteObject",RegionRectangle%) ' on affecte cette region à la form dll_off dll_on "user32" ret% = dll_call3("SetWindowRgn",hWnd%,Region%,0) end rem ============================================================================ Fermer: ' Si TERMINATE vous pose problème ret% = dll_call4("PostMessageA",hWnd%,16,0,0) : ' 16 c'est la constante de fermeture ' Sinon remplacer la ligne ci-dessus par TERMINATE return
rem ============================================================================
| |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Faire un trou complexe dans un objet FORM Jeu 28 Avr 2016 - 7:59 | |
| Excuse-moi Papydall, je suis un Âne.
Ton code fonctionne parfaitement, je n'avais pas compris qu'il fallait d'abord mettre en pause et attendre que le FORM ai terminé son déplacement et cliquer sur quitter pour que la fermeture du programme soit effective.
Désolé pour le dérangement.
A+ | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Faire un trou complexe dans un objet FORM Jeu 28 Avr 2016 - 12:05 | |
| Tu es tout excusé, de la tête aux pieds. Tu n’es pas un Âne , mais tu as fait confiance à Papydall qui n’a pas jugé utile d’expliquer comment piloter ce FORM d’une autre forme ! | |
| | | Contenu sponsorisé
| Sujet: Re: Faire un trou complexe dans un objet FORM | |
| |
| | | | Faire un trou complexe dans un objet FORM | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |