1 (изменено: Дроздов, 2010-10-08 19:27:08)

Тема: HTA, JScript: drag & drop окна HTA без caption

Уважаемые специалисты!
Может быть кто-то сталкивался с подобной задачей? Помогите советом.
Не получается у меня нормальный drag-and-drop для окна. Никак не могу придумать, чтоб курсор не выскакивал за пределы окна и "прилипал" к диву наглухо до onmouseup.

в коде рабочий минимум.

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<META http-equiv="MSThemeCompatible" content="Yes">
<title>drag & drop</title>
<script language="JScript">
var W ={w:500, h:300}; W.x=(screen.width - W.w)/2; W.y=(screen.height - W.h)/2;
(function WinPos(w,h,x,y){
var w=w||W.w, h=h||W.h, x=x||W.x, y=y||W.y;
resizeTo(w, h); 
moveTo(x, y)
})();
</script>

<hta:application ID="oHTA"
 scroll ="no"
BORDER="none"
INNERBORDER ="no"
/>
<script language="JavaScript1.2">
function $(el){
var _el = (typeof(el) == 'string')?document.getElementById(el): el;
return _el;
}
var pic={};
var trnsp = 255;
var x,y, dobj, isdrag=false; //ie=document.all, 

function winpos(e)
{    var xx = tx + event.clientX - x, yy =ty + event.clientY - y;
  if (isdrag)
  {
    dobj.style.left =xx;
    dobj.style.top  = yy;
    if (xx!=pic.x ||yy!=pic.y)winmove(xx,yy)
    return false;
  }
}

function winmove(x,y)    {
var winX = window.screenLeft, winY = window.screenTop;
window.moveBy(x, y);
}

function getpic(obj){
    pic.x = parseInt(obj.style.left+0);
    pic.y = parseInt(obj.style.top+0);
 }
 
function GetCursorPos(e){
  var fobj       = event.srcElement; 
  var topelement = "BODY"
  
  if (fobj.className=="movable")
  {
    isdrag = true;
    dobj = fobj;
    getpic(caption);
    tx = parseInt(dobj.style.left+0);
    ty = parseInt(dobj.style.top+0);
    x = event.clientX;  
    y = event.clientY;
    document.onmousemove=winpos;
    return false;
  }

}

document.onmousedown=GetCursorPos//selectmouse;
document.onmouseup=new Function("isdrag=false;");
</script>


</head>
<body style="margin: 0;">
<div id="caption" class="movable"  style="background-color: #eee; position: relative;left:0px; top: 0; height:20px; width:100%; border: solid 1px #cccccc; z-index:10;" ><span id="ctrl_close" style="color:#999999; padding: 2px;    float: right; cursor:pointer; height:12px;" onclick='window.close()'>X</span></div>
</body>

</html>

ps/ наверное не здесь этому топику место? понял, прошу прощения.

2

Re: HTA, JScript: drag & drop окна HTA без caption

При начале движения окошка ставим setInterval и в callback проверяем значение window.event.button на 0.

3

Re: HTA, JScript: drag & drop окна HTA без caption

JSman пишет:

При начале движения окошка ставим setInterval и в callback проверяем значение window.event.button на 0.

Спасибо большое, хороший способ, но в случае с этой проблемой не совсем помогает. Тут в том беда, что этот d&d вполне рабочий, но не всегда и, главное -- не всюду. На моей машине всё нормально, а на дровах, где процессор, видеокарта (ну или какое-то другое железо) чуть менее производительны. При резком ускорении движения (особенно явно проявление при движении вверх), курсор срывается за верхний предел окошка и перестает обрабатываться как событие объекта window, т.е. воспринимается как остановка курсора. Потом, при возвращении в пределы окна, все становится на место. Другими словами, железо не одинаково быстро реагирует на действия пользователя.

Значение event.button так же остается неизменным, если курсор за пределами окна. Скрипт вообще не видит мышь, любые действия, включая кнопки остаются низменны до возврата. И проверять кнопку еще раз, тоже можно только в пределах, она и так проверяется. Возможно setInterval мог бы быть как-то полезен, если следить за clientY, но тогда для каждого случая использования надо устанавливать свою задержку(?) Не на всей аппаратуре интервал со значением delay =1 -- это 1 миллисекунда.

Я нашёл один вариант решения, но с внешним обработчиком положения окна и курсора, а это связано с вызовом внешнего COM-объекта и значит наличием и регистрацией ActiveX. Мне не очень нравится, хотелось бы как-то без этих танцев...