PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Comment bloquer le déplacement d'une fenêtre
Comment bloquer le déplacement d'une fenêtre
Débuté par Jean-Michel, 27 juin 2015 03:24 - 12 réponses
Membre enregistré
834 messages
Popularité : +13 (13 votes)
Posté le 27 juin 2015 - 03:24
Bonjour,

J’ai encore regardé ce matin, je ne trouve pas de codes ou de propriétés qui permettraient de bloquer le déplacement d’une fenêtre modale ou non.
La seule alternative que j'ai trouvé pour empêcher son déplacement est de repositionner la fenêtre lors de l’évènement déplacement.
Il y bien la propriété MaFenêtre..DéplaçableParLeFond mais pas déplaçable !

Connaissez vous une propriété ou un mot clef ?

Merci à vous.

J.Michel

--
Synchronize Systems International LTD
Développement d'outils de gestion

Environnements AS400 – Windows
Langages GAP III – CL – Visual Basic - Visual Adélia - Adélia - Windev
http://www.cashpower.fr/

Bangkok / Pattaya
Membre enregistré
281 messages
Popularité : +24 (26 votes)
Posté le 27 juin 2015 - 16:38
Bonjour,

Il suffit qu'elle ne soit pas déplaçable par le fond et qu'elle n'ai pas de cadre système.
Membre enregistré
834 messages
Popularité : +13 (13 votes)
Posté le 27 juin 2015 - 17:32
Bonjour WDKyle,
Merci bien mais j'ai oublié de préciser :
Je suis administrateur : j'ai le droit de bouger les fenêtres
Je n'arrive pas à trouver quel est la propriété qui me permet à l'initialisation de la fenêtre, de pouvoir mettre ou pas la barre system !?

J.Michel

--
Synchronize Systems International LTD
Développement d'outils de gestion

Environnements AS400 – Windows
Langages GAP III – CL – Visual Basic - Visual Adélia - Adélia - Windev
http://www.cashpower.fr/

Bangkok / Pattaya
Membre enregistré
281 messages
Popularité : +24 (26 votes)
Posté le 27 juin 2015 - 18:08
Dans ce cas, il faut tenter de la faire avec des API pour supprimer le cadre système des fenêtre selon les droits des utilisateurs.

Il y à un exemple en VB ici : http://vb.developpez.com/faqvba/…
Posté le 28 juin 2015 - 00:12
Bonjour,

Par curiosité, quelle est la raison qui pousse à avoir une fenêtre non déplaçable par l’utilisateur mais déplaçable par un administrateur ?

Cdlt.
Membre enregistré
834 messages
Popularité : +13 (13 votes)
Posté le 28 juin 2015 - 03:23
Cela veut dire que Windev ne le permet pas aujourd'hui.
Merci pour l'API !

J.Michel

--
Synchronize Systems International LTD
Développement d'outils de gestion

Environnements AS400 – Windows
Langages GAP III – CL – Visual Basic - Visual Adélia - Adélia - Windev
http://www.cashpower.fr/

Bangkok / Pattaya
Membre enregistré
355 messages
Popularité : +37 (39 votes)
Posté le 28 juin 2015 - 11:19
Bonjour Jean-Michel

Personnellement je trouve la solution de gestion de l’événement WM_MOVING très simple à mettre en oeuvre.
Une propriété spécifique aurait effectivement contribuer au zéro ligne de code, mais bon...
Pour mémoire au cas ou voilà cette solution

// Déclaration globale
WM_MOVINGest un entier = 0x0216
Evénement("FixeFenetre",FenEnExécution(),WM_MOVING)
// En complément si la fenêtre est redimensionnable
WM_SIZINGest un entier = 0x0214
Evénement("FixeFenetre",FenEnExécution(),WM_SIZING

// Procédure FixeFenetre
Procedure FixeFenetre(iEve,wParam,lParam)
RENVOYER 0


A+

--
Francis MOREL
http://www.SoftProtect.fr
Membre enregistré
834 messages
Popularité : +13 (13 votes)
Posté le 28 juin 2015 - 16:34
Francis bonjour,

ça m'avait l'air jolie comme solution.
Hic, cela ne fonctionne pas.
WM_MOVING est un entier = 0x0216 ==> "0x0216" m'a l'air de l'hexadécimale = 534 en entier.

Après recherche en début de piste sur ton code, j'y suis presque grâce à toi.
J'ai trouvé dans la doc WM_MOVE = 3
Quand je déplace la fenêtre, il rentre bien dans la procédure mais le renvoie 0 ne sert à rien.
Merci pour ton aide et si tu en sais plus, merci de me guider.

Ner0lph bonjour,
Réponse : Demande d'un client.
Ma solution fonctionne en replaçant la fenêtre à son point d'origine à chaque déplacement.
Mais cela fait clignoter l'écran et ce n'est pas "pro".
Pourquoi cette curiosité ?

J.Michel

--
Synchronize Systems International LTD
Développement d'outils de gestion

Environnements AS400 – Windows
Langages GAP III – CL – Visual Basic - Visual Adélia - Adélia - Windev
http://www.cashpower.fr/

Bangkok / Pattaya
Membre enregistré
355 messages
Popularité : +37 (39 votes)
Posté le 28 juin 2015 - 19:56
Bonsoir Jean-Michel

ça m'avait l'air jolie comme solution.
Hic, cela ne fonctionne pas.


Si je t'assure que cela fonctionne mais ...
je viens de tester en WD11 et malheureusement pas avec les WD20 (voire avant).
Je n'avais pas encore porté ce bout de code en WD20 d'ou l'erreur de ma part.

> WM_MOVING est un entier = 0x0216 ==> "0x0216" m'a l'air de l'hexadécimale = 534 en entier.

C'est effectivement écrit en hexa mais cette syntaxe "= 0x0216" est autorisée par Windev et ce n'est pas là le problème.
Cela dit rien n’empêche de mettre la valeur en décimale (534) si tu préfères.

Après recherche en début de piste sur ton code, j'y suis presque grâce à toi.
J'ai trouvé dans la doc WM_MOVE = 3
Quand je déplace la fenêtre, il rentre bien dans la procédure mais le renvoie 0 ne sert à rien.


Comme indiqué dans la doc MSDN : https://msdn.microsoft.com/fr-fr/library/windows/desktop/ms632631(v=vs.85).aspx
"The WM_MOVE message is sent after a window has been moved. "
De ce fait le retour vrai ou faux de la procédure est inutile, le déplacement a déjà été fait quand l'application reçoit le message.

C'est pourquoi j'ai utilisé WM_MOVING dont la doc dit :
"The WM_MOVING message is sent to a window that the user is moving. By processing this message, an application can monitor the position of the drag rectangle and, if needed, change its position."

A l'époque WD11 respectait probablement moins les règles de Microsoft, de ce fait le "Renvoyer 0" suspendait le déplacement en cours.
Ce qui ne semble plus être le cas en WD20.
Il faut donc recharger les positions initiales à chaque utilisation.
Tu peux faire ceci avec le code suivant (c'est ce que j'avais fait initialement mais jugé inutile après test sur WD11)
// Déclaration globale de la fenêtre
WM_MOVINGest un entier = 0x0216
WM_SIZINGest un entier = 0x0214

_RECTest une structure
ixLeftest un entier
ixRightest un entier
ixest un entier
iyest un entier
FIN
gstRectest un _RECT
gsNomFenest une chaîne = FenEnExécution()

Evénement("FixeFenetre",gsNomFen,WM_MOVING)
Evénement("FixeFenetre",gsNomFen,WM_SIZING)

// Fin d'initialisation de la fenêtre
gstRect:ixLeft={gsNomFen,indFenêtre}..X
gstRect:ixRight={gsNomFen,indFenêtre}..Y
gstRect:ix={gsNomFen,indFenêtre}..X+{gsNomFen,indFenêtre}..Largeur
gstRect:iy={gsNomFen,indFenêtre}..Y+{gsNomFen,indFenêtre}..Hauteur

// Procédure FixeFenetre
Procedure FixeFenetre(iEve,wParam,lParam)

stRectest un _RECT
Transfert(&stRect,lParam,16)
Transfert(lParam,&gstRect,16)

RENVOYER Faux


Un peu plus complexe mais marche (testé sous Win 7 en 32bits) avec WD20 sans clignotement ni effets visuels indésirables.

A+

--
Francis MOREL
http://www.SoftProtect.fr
Membre enregistré
834 messages
Popularité : +13 (13 votes)
Posté le 28 juin 2015 - 20:50
Francis,
QUEL TALENT !
1) Je me suis aperçu après que la syntaxe "= 0x0216" est autorisé par WD.
2) Bien vu pour le WM_MOVE
3) gstRect:ixLeft={gsNomFen,indFenêtre}..X : Je ne savais pas que l'on pouvait écrire ce genre de code dans WD

J'ai juste fait les corrections suivantes suite à une erreur de copier/coller dû au site du forum je pense.
_RECTest une structure => ST_RECTest une structure
gstRect:ixLeft={gsNomFen,indFenêtre}..X => gstRect:iNxLeft={gsNomFen,indFenêtre}..X

ça fait plaisir de lire des explications super claires !
A quel endroit on peut lire que l'on peut écrire ce genre de code ?????
Car j'ai vu ce site mais comment as tu pu coder dans WinDev ce genre de chose :
xPos = (int)(short) LOWORD(lParam); // horizontal position
yPos = (int)(short) HIWORD(lParam); // vertical position

Soit !
Bravo et encore bravo !!
Je me garde tous ça dans ma doc !

1000 Mercis de m'avoir accorder de ton temps, de plus ce jour dimanche.
Il est 20h45 en France et chez moi, on est lundi 01h45 du matin.
Je vais bien dormir !

@++
Génial !
J.Michel

--
Synchronize Systems International LTD
Développement d'outils de gestion

Environnements AS400 – Windows
Langages GAP III – CL – Visual Basic - Visual Adélia - Adélia - Windev
http://www.cashpower.fr/

Bangkok / Pattaya
Membre enregistré
834 messages
Popularité : +13 (13 votes)
Posté le 29 juin 2015 - 06:09
Désespoir ! :(
Cela fonctionne très bien sur des fenêtres libres mais pas sur des filles MDI.

En tous les cas merci.

J.Michel

--
Synchronize Systems International LTD
Développement d'outils de gestion

Environnements AS400 – Windows
Langages GAP III – CL – Visual Basic - Visual Adélia - Adélia - Windev
http://www.cashpower.fr/

Bangkok / Pattaya
Posté le 29 juin 2015 - 20:02
Bonjour,

(Je pensais avoir posté une réponse en début d'AM, j'ai dû me tromper :( )

> Cela fonctionne très bien sur des fenêtres libres mais pas sur des filles MDI.

Le problème vient probablement du fait que pour les fenêtres MDI "NomFen..X" et "NomFen..Y" renvoient des coordonnées relatives à la zone client de la mère, alors que la structure stRect contient des coordonnées relatives à l'écran.

Reste aussi à définir comment la fenêtre est fixée, fixe par rapport à la mère ou à l'écran.
Tu pourras recalculer les positions puis les injecter dans la structure adéquate (ici stRect).

Par exemple si tu veux que la fenêtre soit fixe par rapport à la mère tu peux utiliser le code ;
Procedure FixeFenetre(iEve,wParam,lParam)

sNomFenest une chaîne = FenEnExécution()
stRectest un _RECT
// La fenêtre n'a pas encore bougée, on peut donc utiliser ses coordonnées
stRect.ixL=FenExtPosX(sNomFen)
stRect.iyT=FenExtPosY(sNomFen)
stRect.ixR=stRect.ixL+FenExtLarg(sNomFen)
stRect.iyB=stRect.iyT+FenExtHaut(sNomFen)

Transfert(lParam,&stRect,16)

RENVOYER Faux

ATTENTION : J'ai redéfini les noms des membres pour que ça soit plus correct.
Ce code plus simple fonctionne pour les fenêtres MDI et libre.

A+
Francis MOREL
www.SoftProtect.fr
Posté le 14 mars 2023 - 07:30
J’ai essayé les réponses proposées mais j’ai une difficulté au niveau de la dernière ligne de transfert et chez moi ça génère une erreur à la place de 16 là