HTA - Position de fenêtre devient négative

salut67 21 Messages postés mercredi 19 janvier 2011Date d'inscription 12 avril 2017 Dernière intervention - 11 avril 2017 à 20:46 - Dernière réponse : vb95 1388 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 15 décembre 2017 Dernière intervention
- 12 avril 2017 à 21:49
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
Afficher la suite 

3 réponses

Répondre au sujet
vb95 1388 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 15 décembre 2017 Dernière intervention - 12 avril 2017 à 10:49
0
Utile
2
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
salut67 21 Messages postés mercredi 19 janvier 2011Date d'inscription 12 avril 2017 Dernière intervention - 12 avril 2017 à 19:57
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.
vb95 1388 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 15 décembre 2017 Dernière intervention > salut67 21 Messages postés mercredi 19 janvier 2011Date d'inscription 12 avril 2017 Dernière intervention - 12 avril 2017 à 21:49
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
Commenter la réponse de vb95

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.