|
FORUMS PROFESSIONNELS WINDEV, WEBDEV et WINDEV Mobile |
| | | | | |
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
WM_MOVINGest un entier = 0x0216 Evénement("FixeFenetre",FenEnExécution(),WM_MOVING)
WM_SIZINGest un entier = 0x0214 Evénement("FixeFenetre",FenEnExécution(),WM_SIZING
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)
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)
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
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
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à |
| |
| |
| | | |
|
| | | | |
| | |
| | |
| |
|
|
|