Deplacer une fenêtre sans bord sans utiliser les API

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Deplacer une fenêtre sans bord sans utiliser les API

Message par Marc56 »

Hello,

Je l'ai posté sur le forum us, pour un autre sujet, mais je le poste aussi ici car ça peut servir à d'autres usages. :)
Le but est de permettre de déplacer des petites fenêtres sans bord (#PB_Window_BorderLess) sans utiliser les API
(donc en principe compatible avec tous les OS sur lequel PB tourne)

Je m'en sert pour un 'launcher' d'application en cours de développement, mais ça peut servir pour faire des postit, des pendules etc.
L'astuce tient en 5 lignes, suivez #WM_LBUTTONDOWN
Pseudo code:
- Tant que le bouton gauche est enfoncé
- Alors
- Tant que le bouton gauche n'est pas relâché
- Prendre la position de la souris et déplacer par rapport à cette position

Code : Tout sélectionner

OpenWindow(0, 0, 0, 300, 150, "", #PB_Window_BorderLess | #PB_Window_ScreenCentered)

Txt_Message = TextGadget  (#PB_Any, 050, 050, 150, 050, "Hello World!")
Btn_Close   = ButtonGadget(#PB_Any, 280, 005, 015, 015, "X")

Repeat
		Select WaitWindowEvent(50)
						
				Case #PB_Event_Gadget ; --- Clic on gadget
						Select EventGadget()
								Case Btn_Close ; --- [X]
										End
						EndSelect    
						
				Case #WM_LBUTTONDOWN ; --- Move window with left button and without API call because I hate use API ;-)
						Define X_Mouse = WindowMouseX(0)
						Define Y_Mouse = WindowMouseY(0)
						While WindowEvent() <> #WM_LBUTTONUP 
								ResizeWindow(0, DesktopMouseX() - X_Mouse, DesktopMouseY() - Y_Mouse, WindowWidth(0), WindowHeight(0))   
						Wend    

		EndSelect 
ForEver

End
On peut pointer n'importe où dans la fenêtre, mais il est possible de limiter à une zone si on veut.

:wink:

PS. Je poste ça dans "débutant", je ne sais pas si ça mérite d'aller dans "Trucs et astuces", je laisse soins aux admins de voir.
Dernière modification par Marc56 le mer. 08/juil./2015 9:49, modifié 2 fois.
Avatar de l’utilisateur
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Deplacer une fenêtre sans bord sans utiliser les API

Message par microdevweb »

Merci Marc56,

Super intéressant pour les boîtes à outils
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Deplacer une fenêtre sans bord sans utiliser les API

Message par falsam »

Merci marc mais à mon avis pas cross platform avec cette constante #WM_LBUTTONDOWN

En tout cas j'archive :)
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Deplacer une fenêtre sans bord sans utiliser les API

Message par Ar-S »

Et oui #WM_LBUTTONDOWN sous linux c'est mort..
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Deplacer une fenêtre sans bord sans utiliser les API

Message par GallyHC »

Bonjour,

Il est vrai que certaines constantes manque dans l'utilisation de "WaitWindowEvent()"

Comme :

Code : Tout sélectionner

#PB_Event_leftButtonUp 
#PB_Event_leftButtonDown
#PB_Event_RightButtonUp 
#PB_Event_RightButtonDown
Après perso si je rebranche mon minimac, je peux être avoir sur la fenêtre les informations? Faut aussi voir avec des personne qui on linux et que l'on génère la condition de compilation en utilisant les noms ci-dessus, pour respecté les nommages de constante propre à purebasic, comme cela si, il ajoute ce sera bon du premier coup?

bon ce n'est qu'une idée et peu être que je me trompe (et que je sois plus complexe que je l'imagine), mais bon c'est peu être une base déjà.

Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Deplacer une fenêtre sans bord sans utiliser les API

Message par Ar-S »

Code : Tout sélectionner

#PB_Event_leftButtonUp
#PB_Event_leftButtonDown
#PB_Event_RightButtonUp
#PB_Event_RightButtonDown
Claire que ça manque ! Depuis toujours.
Y'a pour screen et canvas mais pas pour les fenêtres, c'est vraiment un manque.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: Deplacer une fenêtre sans bord sans utiliser les API

Message par Marc56 »

Je crois que ce n'est pas tant une question de constante que d'évènements envoyés par le système.

Si on ajoute un "Debug Event" sous Windows puis sous Linux, on voit que Linux 'cause' assez peu :?

Code : Tout sélectionner

If OpenWindow(0, 0, 0, 220, 100, "Exemple...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    
    ButtonGadget  (1, 10, 60, 200, 30, "Fermer")
       
    Repeat
        Event = WaitWindowEvent()
        
        Debug Event
        
        Select Event
                
            Case #PB_Event_Gadget
                Select EventGadget()
                    Case 1 
                        CloseWindow(0)
                        End  
                EndSelect
                
        EndSelect
    Until Event = #PB_Event_CloseWindow
EndIf
Mais comment une info système aussi basique que 'bouton souris maintenu enfoncé' peut elle ne pas exister dans une 'api' ?
Il y a 20 ans, sous dos, on faisait tout ce qu'on voulait avec la souris avec l'interruption 33 (souvenir :) )
Micheao
Messages : 533
Inscription : dim. 07/déc./2014 10:12
Localisation : Sud-Est

Re: Deplacer une fenêtre sans bord sans utiliser les API

Message par Micheao »

merci Marc56 pour ce patage
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Deplacer une fenêtre sans bord sans utiliser les API

Message par blendman »

Code : Tout sélectionner

#PB_Event_leftButtonUp
#PB_Event_leftButtonDown
#PB_Event_RightButtonUp
#PB_Event_RightButtonDown
ah oui, c'est clair que c'est vraiment un énorme manque ce genre de chose pour purebasic.

Mais puisqu'on a ça sous windows, il n'y a pas d'équivalent sous linux et mac des #wm_LeftButonDown/up, mousemove, etc ?
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: Deplacer une fenêtre sans bord sans utiliser les API

Message par Mesa »

Houla, houla !!!
c'est parcequ'il y a 20-30 ans , les souris n'etaient pas controlées par microprocesseurs

de nos jours tout appareil demande un Driver ... donc, des Apis (maison ou windows)
La souris n'a jamais était contrôlée par le microprocesseur, ni hier ni aujourd'hui et il a toujours été nécessaire d'utiliser un driver, même avec un msx.

Les signaux émis par la souris sont envoyé au PIC (Programmable Interrupt Controller, ne pas confondre avec la marque de microcontrôleur), devenu APIC puis aujourd'hui tout simplement chipset. C'est une puce qui gère les interruptions matériels suivant un ordre de priorité.
http://www.technologuepro.com/microproc ... esseur.htm

Tu confonds tous :roll:

De plus les drivers ont toujours existé avec ou sans api !

Ha la fameuse table des vecteurs d'interruptions...
Ha les fameuses interruptions 14h et 33h (qui sont des drivers, très bas niveau dans le bios)...
Ha le fameux fichier mouse.com de Dos...

Hier, les logiciels ou le DOS contrôlait la souris, aujourd'hui ce sont les différents OS avec une api, oui, mais pas le processeur en tant que tel.

Ne le prends pas mal spock-dob... mais il était nécessaire de rectifier.
D’ailleurs, je me demande si notre spock vient bien de starfleet ? ou du secteur neuf-trois :wink:
Je rigole :wink:

Seul Fred sait pourquoi les #PB_Event_leftButtonUp,
#PB_Event_leftButtonDown, #PB_Event_RightButtonUp, #PB_Event_RightButtonDown
sont manquant. Il pourrait très bien les ajouter à PureBasic :!:

Ça a peut-être été une histoire d'api, en effet, quand il fallait gérer les Windows + les vieux OS d'apple (avec les processeurs à base de 68000 ou non) + linux + amigaOS, qui sait ?

Il faudrait "tanner" gentiment Fred pour qu'il ajoute ces fonctions qui nous manque tant :wink: 8)

Je vais de ce pas corriger une autre erreur de spock, va-t-il exploser :?: :|

M.
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: Deplacer une fenêtre sans bord sans utiliser les API

Message par Marc56 »

Ha, les drivers, les p... de journées passées à ouvrir x fois les capots de machines pour changer la position des jumpers pour réussir à faire admettre 1 voir 2 carte réseau (et que je te pique l'IRQ 7 à oui, mais m... elle est déjà prise par la carte son :P )
et faire comprendre au client que l'IRQ 3 vient en fait après l'IRQ 8 car le deuxième gestionnaire d'IRQ est en fait repiqué sur l'IRQ 2 du premier (comme deux prises multiples l'une sur l'autre 8O :? :mrgreen: )
et les moments de joie quand on arrivait à gratter plus de ram "à la main" que n'arrivait à faire Memmaker
Tout cela s'étant enfin presque résolu grâce au steering d'irq
Que de bidouilles hardware et software réalisées par MS pour assurer la compatibilité (et le plus merveilleux est que cette horreur fonctionne très bien depuis plus de 20, 30? ans :wink: )
Quel progrès que l'arrivée des cartes avec des adresses logicielles 8)

Un temps (exaltant) que les moins de 20 (30? 40?) ans ne peuvent pas connaitre :wink:
Un (doc vieux de 2001!) pour montrer au djeuns' les principes qu'on devait connaitre à l’époque pour configurer un PC chez un client (oui, pas d'Internet à l'époque) et les supports téléphoniques fabricants: mouarf' fallait de la patience... http://www.repaire.net/navig/mont_choisir/irq-1.php

Cela dit, pour en revenir au sujet principal: si sous Linux (et tous les os) on peut déplacer une fenêtre en maintenant le bouton gauche de n'importe quelle souris enfoncé, cela veut forcement dire qu'il y a une api qui gère cet évènement car je vois pas les programmeurs applicatifs allant taper directement dans le driver :?

Mais à part PB (pour essayer), je n'ai jamais fait de programmation graphique sous Linux.

J'ai trouvé ça:
http://unix.stackexchange.com/questions ... k-in-linux
'On a typical system, there is one process reading mice events: the X Window server. That program manages the graphical display and input peripherals. Individual graphical applications are then notified of mouse events through a generic X event protocol, which carries other event types such as key presses, window focus changes, window visibility changes, '
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Deplacer une fenêtre sans bord sans utiliser les API

Message par GallyHC »

Bonjour,

Comme "Mesa" le dit, il faudrait faire la demande a Fred du pourquoi de ce manque (Si sa ce trouve personne ne lui a jamais demandé et il n'a pas pensé a le mettre?).

Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Deplacer une fenêtre sans bord sans utiliser les API

Message par blendman »

J'ai trouvé ça pour linux et windows, mais c'est assez incomplet :
http://www.purebasic.fr/english/viewtop ... ouseButton

Sinon, j'ai posté la demande dans les features request, n'hésitez à dire que ça vous intéresse vous aussi ;)
http://www.purebasic.fr/english/viewtop ... =3&t=62574
Répondre