HTA - Position de fenêtre devient négative

Signaler
Messages postés
27
Date d'inscription
mercredi 19 janvier 2011
Statut
Membre
Dernière intervention
1 novembre 2018
-
Messages postés
2427
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
6 mai 2021
-
Bonjour,

j'ai un fichier HTA dont une partie en vbscript, qui sert à mémoriser la position de la fenêtre et la restaurer au lancement suivant. Fonctionne bien, mais de manière rare et aléatoire, la fenêtre se retrouve parfois à des coordonnées autour de -32000,-32000. Un problème d'entier signé/non-signé je pense, mais sans comprendre d'où ça vient, et je ne peux pas reproduire le cas à volonté.

Le bout de code concerné :


wpPosKey = "HKEY_CURRENT_USER\Environment\JCMWinPosition\Test"
wpw = 400 : wph = 400 ' taille intérieure de la fenêtre
' ----- formater la fenêtre à la bonne taille en tenant compte des bords -----
window.resizeto wpw, wph
wpcw = document.body.clientWidth : wpch = document.body.clientHeight
wpBorder = (wpw - wpcw) / 2 : wpTitle = (wph - wpch) - wpBorder
window.resizeto 2 * wpw - wpcw, 2 * wph - wpch
' ----- positionner la fenêtre à son précédent emplacement, sinon centrée
on error resume next : wpdone = false : wpv = wsh.regread(wpPosKey)
if err.number = 0 then
dim wpt : wpt = split(wpv, ",") : if ubound(wpt) = 1 then window.moveto wpt(0), wpt(1) : wpdone = true
end if
if not wpdone then window.moveto (screen.width - wpw) / 2, (screen.height - wph) / 2
' ----- enregistrer la position de la fenêtre quand on quitte l'outil -----
sub Window_onBeforeUnload
wsh.RegWrite wpPosKey, (window.screenleft - wpBorder) & "," & (window.screentop - wpTitle), "REG_SZ"
end sub


Merci d'avance de vos idées
Jean-Claude

1 réponse

Messages postés
2427
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
6 mai 2021
137
Bonjour
Sans certitude
A la ligne 8 pourquoi doubles-tu la longueur et la largeur de la fenêtre ?
window.resizeto (2 * wpw) - wpcw, (2 * wph) - wpch

J' ai rajouté les parenthèses pour montrer la priorité de l'opérateur * sur l'opérateur +

ce qui fait que ta fenêtre s'agrandit à chaque enregistrement et lorsqu'elle arrive vers la limite des INTEGER positif les dimensions basculent vers les INTEGER négatif
Un peu comme l'addition : si tu est à 32767 ( soit 7FFF en hexadécimal) tu fais + 1 cela donne 8000 en hexadécimal mais en arithmétique signée cela fait -32768 : tu bascules direct dans les négatifs
Messages postés
27
Date d'inscription
mercredi 19 janvier 2011
Statut
Membre
Dernière intervention
1 novembre 2018

Déjà, merci d'avoir répondu.
Les lignes 5 à 8 servent à avoir une fenêtre avec une zone intérieure d'une taille définie (indépendant de la bordure choisie par l'utilisateur) :
window.resizeto wpw, wph
=> mettre la fenêtre 400x400
wpcw = document.body.clientWidth : wpch = document.body.clientHeight
=> récupérer la taille intérieure (ex. 386x351 sur mon poste)
wpBorder = (wpw - wpcw) / 2 : wpTitle = (wph - wpch) - wpBorder
=> en déduire l'épaisseur du bord et de la barre de titre (ex. 7 et 42)
window.resizeto 2 * wpw - wpcw, 2 * wph - wpch
=> redimensionner en 414x449 : largeur fenêtre = intérieur + 2*épaisseur du bord = 400 + 2*7 = 414, mais aussi = 2*400 - 386, donc la formule est juste, même si ce n'est pas très logique, j'en conviens (je m'en occuperai)Mais malgré cela, la largeur est bien calculée.
De plus, même quand j'ai un bug de positionnement, la taille de la fenêtre reste correcte (intérieur 400x400). Et la taille reste constante, sans augmentation ou décalage. Seule la position est touchée.
J'ai une utilisatrice de l'outil qui semble avoir le pb plus souvent : je lui ai mis une log pour essayer de pister la prochaine fois que ça se produit. Mais c'est frustrant.
Messages postés
2427
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
6 mai 2021
137 >
Messages postés
27
Date d'inscription
mercredi 19 janvier 2011
Statut
Membre
Dernière intervention
1 novembre 2018

bonsoir
Je comprends un peu mieux
La barre de titre et les bordures font-elles partie de la fenêtre au sens Windows : car dans ce cas c'est Window.Screenleft qu'il faut enregistrer dans la base de registre et non Window.Screenleft - Wpborder ( idem pour l'autre paramètre )
Je te dis cela mais sans certitude
bonne soirée