1

Тема: HTA Окно, размеры, координаты

Как узнать внешние размеры окна, с заголовком, бордюрами?
Как узнать координаты окна, опять же внешние?
Как узнать размеры заголовка, бордюра?

2 (изменено: DnsIs, 2011-06-23 09:29:37)

Re: HTA Окно, размеры, координаты

А фик его знает как 8)
Вот о чем я ведаю:

screen.width
screen.height

document.body.offsetWidth
document.body.offsetHeight

document.body.clientWidth
document.body.clientHeight

document.body.scrollWidth
document.body.scrollHeight

Дальше погуглите пожалуйста сами, что да как.

Нас невозможно сбить с пути, нам пофигу куда идти.

3

Re: HTA Окно, размеры, координаты

Это я всё знаю, только это не то.
Неужели ни кто ни когда не пытался сохранить координаты и размеры окна, чтобы на следующем старте окно поставить в тоже самое место и с теми же размерами, что были при закрытии окна?
Или это только меня бесит, что окно прыгает по всему экрану с ненужными мне размерами?

Сегодня целый день убил на решение, вроде получилось.
Наверно нужно сделать тестовый файлик и выложить, или не надо?



А что гуглить?, я только за.

4

Re: HTA Окно, размеры, координаты

window.screnX; window.screenY

. По-мoeмy тaк.

5

Re: HTA Окно, размеры, координаты

Пока не очень удачно получилось с полностью открытым окном, с этим буду разбираться, для меня это сейчас актуально, игра готова, подбираю по мелочи.

Пока такая версия.

HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head>
<title>   Размеры и Координаты окна.</title>
<hta:application applicationname="nameHTA" id="gameP" border="thick" contexmenu="yes" icon="service/ornament.ico" scroll="no" selection="yes" singleinstance="yes" windowstate="normal"></hta:application>
<meta http-equiv="Content-Type" content="text/html; charset=Windows-1251">
<script type="text/javascript" src="okno2.js"></script>

</head>

<body>

<table border="1" cellpadding="0" cellspacing="0" style="width:55%; height:233px; margin:33px auto 0 auto;">
<tr><td align="center">
text
</td></tr></table>

</body>
</html>

JS

var arr=[];
//ширина, высота, лево, верх, смещение лево, смещение верх
arr[0]=[500, 400, 156, 123, 0, 0];
arr[1]="HKCU\\Software\\CoordSizesDispl\\data";

onload=function(){
var obj, t, l;
obj=new ActiveXObject("WScript.Shell");
//пробуем прочесть, если записи в реестре нет, получаем ошибку
try{obj.RegRead(arr[1]);};
//если нет, пишем новую запись
catch(er){obj.RegWrite(arr[1], arr[0].join(" "));};
//теперь прочтётся обязательно
arr[0]=obj.RegRead(arr[1]).split(" ");
window.resizeTo(arr[0][0], arr[0][1]);//размеры окна
window.moveTo(arr[0][2], arr[0][3]);//координаты окна
t=window.screenTop-arr[0][3];//получить разницу
l=window.screenLeft-arr[0][2];
if(t!=arr[0][5]||l!=arr[0][4]){
//высота заголовка зависит от темы используемой пользователем
arr[0][5]=t;//смещение необходимо учитывать при сохранении
arr[0][4]=l;//иначе окно будет скакать по экрану
//если есть изменения, сохранить. изменения могут образоваться при изменении темы в винде, заголовок и бордюр изменятся
obj.RegWrite(arr[1], arr[0].join(" "));};//сохранить смещение
 };//


//
onbeforeunload=function(){
arr[0][0]=document.documentElement.clientWidth+(arr[0][4]*3);
arr[0][1]=document.documentElement.clientHeight+(+arr[0][5]+(arr[0][4]*2));
arr[0][3]=window.screenTop-arr[0][5]*1;
arr[0][2]=window.screenLeft-arr[0][4]*1;
//пишем новое
new ActiveXObject("WScript.Shell").RegWrite(arr[1], arr[0].join(" "));
 };//

6

Re: HTA Окно, размеры, координаты

Вот такое получилось.
Если кто надумает потестить, выдумывайте разные комбинации, полный экран/не полный экран. Оказалось не так всё просто.
Или предлагайте свои варианты, раз микрософт такую дырку оставил.


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head>
<title>   Размеры и Координаты окна.</title>
<hta:application applicationname="nameHTA" id="maxHTA" border="thick" contexmenu="yes" scroll="no" selection="yes" singleinstance="yes" windowstate="maximize"></hta:application>
<meta http-equiv="Content-Type" content="text/html; charset=Windows-1251">
<script type="text/javascript" src="okno5.js"></script>
</head>

<body>

<table border="1" cellpadding="0" cellspacing="0" style="width:55%; height:233px; margin:33px auto 0 auto;">
<tr><td align="center">
text
</td></tr></table>

</body>
</html>
//ширина, высота, лево, верх, смещение лево, смещение верх, флаг max=1/min=0
var winS=[500, 400, 156, 123, 0, 0, 0];
var addr="HKCU\\Software\\CoordSizesDispl\\data";



onload=function(){
var obj, t, l;
obj=new ActiveXObject("WScript.Shell");
//пробуем прочесть, если записи в реестре нет, получаем ошибку
try{obj.RegRead(addr);};
//если нет, пишем новую запись
catch(er){obj.RegWrite(addr, winS.join(" "));};
//теперь прочтётся обязательно
winS=obj.RegRead(addr).split(" ");
if(winS[6]==0){//если windowstate="normal"
window.resizeTo(winS[0], winS[1]);//размеры окна
window.moveTo(winS[2], winS[3]);//координаты окна
t=window.screenTop-winS[3];//получить разницу
l=window.screenLeft-winS[2];
if(t!=winS[5]||l!=winS[4]){
//высота заголовка зависит от темы используемой пользователем
winS[5]=t;//смещение необходимо учитывать при сохранении
winS[4]=l;//иначе окно будет скакать по экрану
//если есть изменения, сохранить. изменения могут образоваться при изменении темы в винде, заголовок и бордюр изменятся
obj.RegWrite(addr, winS.join(" "));}};//сохранить смещение
 };//
//
onbeforeunload=function(){
var w1, w2, w3, h1, h2, h3, f;
w1=document.documentElement.clientWidth+(winS[4]*3);
h1=document.documentElement.clientHeight+(+winS[5]+(winS[4]*2));
w2=window.screen.availWidth;
h2=window.screen.availHeight;//отбрасывает высоту панели задач
w3=window.screenLeft-winS[4];
h3=window.screenTop-winS[5];
//если полный экран f=true; иначе f=false;
if(w1>w2&&h1>h2&&w3<0&&h3<0){f=true;}else{f=false;};
//пишем если, полное окно и флаг не полное  f=true; и winS[6]=0
//пишем если, не полное окно и флаг полное f=false; и winS[6]=1
//если ни так ни эдак, значит окно не изменилось
if((winS[6]==0&&f)||(winS[6]==1&&!f)){maxNormal();}
else{//сохранить если окно не полное и есть изменения
if(winS[6]==0&&(w1!=winS[0]||h1!=winS[1]||w3!=winS[2]||h3!=winS[3])){
saveData(w1, h1, w3, h3)}};
 };//
//
onresize=function(){
var w1, w2, w3, h1, h2, h3;
w1=document.documentElement.clientWidth+(winS[4]*3);
h1=document.documentElement.clientHeight+(+winS[5]+(winS[4]*2));
w2=window.screen.availWidth;
h2=window.screen.availHeight;//отбрасывает высоту панели задач
w3=window.screenLeft-winS[4];
h3=window.screenTop-winS[5];
if(winS[6]==1&&(w1<w2&&h1<h2&&w3>=0&&h3>=0)){
//сначала надо заменить в файле "maximize" на "normal", иначе ошибка
maxNormal();
//теперь можно менять
window.resizeTo(winS[0], winS[1]);
window.moveTo(winS[2], winS[3]);}
else{
//не пишем если развернулось в полный экран
if(!(w1>w2&&h1>h2&&w3<0&&h3<0)){
//пишем если есть изменения
if(w1!=winS[0]||h1!=winS[1]||w3!=winS[2]||h3!=winS[3]){
saveData(w1, h1, w3, h3)}}};
 };//
//
function saveData(w1, h1, w3, h3){
winS[0]=w1;
winS[1]=h1;
winS[2]=w3;
winS[3]=h3;
new ActiveXObject("WScript.Shell").RegWrite(addr, winS.join(" "));
 };//
//
function maxNormal(){
var w1, w2, w3, h1, h2, h3;
w1=maxHTA.commandLine;//читаем путь к файлу
w1=w1.slice(1, w1.length-2);//удалить кавычки
h1=readFile(w1);//читаем файл в массив
h2=h1.length;
h3=0;
while(h2--){//ищем в файле строку с windowstate
if(h1[h2].toLocaleLowerCase().indexOf("windowstate")>=0){h3=1; break;}};
if(h3==1){//пишем только если в файле нашлась строка windowstate
if(winS[6]==0){w2=/normal/; w3="maximize"; winS[6]=1;}
else{w2=/maximize/; w3="normal"; winS[6]=0;};
h1[h2]=h1[h2].replace(w2, w3);
writeFile(w1, h1);
new ActiveXObject("WScript.Shell").RegWrite(addr, winS.join(" "));}
 };//
//
function readFile(way){//чтение файла в массив
var f="", c="", m=[];
f=new ActiveXObject("Scripting.FileSystemObject");
c=f.FileExists(way);
if(!c){return null;};//если нет файла на диске
c=f.OpenTextFile(way, 1);
f=0;
while(!c.AtEndOfStream){m[f]=c.ReadLine(); f++;};
c.Close();
return m;
 };//
//
function writeFile(w, m){//принимает путь к файлу и массив
var i, fso, f, a, b, c, l=m.length;
fso=new ActiveXObject("Scripting.FileSystemObject");
f=fso.FileExists(w);
if(f){//если файла нет на диске, сразу пишем новый файл
f=fso.GetFile(w);
a=f.Attributes;
a=a.toString(2);//перегоняем в двоичное
b=a.length-1;//взять младший бит чтение/запись
if(a.charAt(b)==1){f.Attributes=32;}};//сбросить бит чтение/запись
c=fso.CreateTextFile(w, true);
for(i=0; i!=l; i++){c.WriteLine(m[i]);};//цикл записи файла
c.Close();
 };//