Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Оставить мышь на месте. [D7, WinXP]


Страницы:   1 2

Still Swamp ©   (2006-10-31 18:09:00) 

Написал простенький компонет TTimeLine. Суть его - отрисовывается время (час мин) на канве. Надо сделать скролинг. Сделал отлавливая WM_MOUSEMOVE. Теперь желательно при скролинге оставлять мышкурсор на месте. Если возвращать его SetCurPos'ом - то он подрагивает на экране. Так как событие мыши он уже получил и передвинулся. Мне очевидно надо ловить перемещение до курсора, отправлять его сообщение WM_MOUSEMOVE на окошки, но при этом сам курсор не трогать.

Как это организовать?


Elen   (2006-11-01 11:44:00) [1]


>  плюс на драгдропе не сделать допустим зум при двух зажатых
> кнопках.

Зум к драгдропу не имеет отношения


Elen   (2006-11-01 11:43:00) [2]


> Still Swamp

И все же попробу поэксперементируй с этим :

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   Label1: TLabel;
   procedure Label1DragDrop(Sender, Source: TObject; X, Y: Integer);
   procedure Label1DragOver(Sender, Source: TObject; X, Y: Integer;
     State: TDragState; var Accept: Boolean);
   procedure Label1EndDock(Sender, Target: TObject; X, Y: Integer);
   procedure Label1EndDrag(Sender, Target: TObject; X, Y: Integer);
   procedure Label1MouseMove(Sender: TObject; Shift: TShiftState; X,
     Y: Integer);
   procedure Label1MouseLeave(Sender: TObject);
 private
   { Private declarations }
 public ax,ay:integer;
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Label1DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
label1.tag:=0;
end;

procedure TForm1.Label1DragOver(Sender, Source: TObject; X, Y: Integer;
 State: TDragState; var Accept: Boolean);
var t:Tpoint;al:integer;
begin
t:=form1.ScreenToClient(Mouse.CursorPos);
caption:=tcomponent(sender).Name+'-'+ inttostr(al)+' '+inttostr(t.x-label1.tag);
Label1.Left:=t.x-label1.tag;
 ax:=x;ay:=y ;
end;

procedure TForm1.Label1EndDock(Sender, Target: TObject; X, Y: Integer);
begin
label1.tag:=0;
end;

procedure TForm1.Label1EndDrag(Sender, Target: TObject; X, Y: Integer);
begin
label1.tag:=0;
end;

procedure TForm1.Label1MouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
begin
Label1.Tag:=x;
end;

procedure TForm1.Label1MouseLeave(Sender: TObject);
var t:tpoint;
begin
if Label1.Dragging then begin
 t.x:=ax;t.Y:=ay;
 Mouse.CursorPos:=label1.ClientToScreen(t);
end;
end;

end.


Може придет что в голову ;)


Still Swamp   (2006-11-01 10:56:00) [3]

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


Elen   (2006-11-01 10:46:00) [4]


> Still Swamp

Может проще Drag&Drop?


Still Swamp   (2006-11-01 10:32:00) [5]


> Ты не хами, а думай.

Задрали бессмысленными ответами - извиняюсь.


> Ответов было достаточно, чтобы скомпоновать приемлемое решение:
> прячь курсор;
> рисуй вместо него картинку;
> возвращай курсор SetCursorPos-ом, нехай теперь невидимый
> курсор сколько угодно себе дёргается;
> при отпускании кнопки показывай курсор


Дополню вариант из предыдущего совета,
Обрезать клипом регион перемещения, что бы даже если схватить объект близко к краю, на расстоянии одного резкого движения мышей, то курсор бы не выскочил за объект. Так и придется делать. Но уж очень изголенческий вариант получился. Наверняка есть более простое решение.


Still Swamp   (2006-11-01 10:25:00) [6]


> может ClipCursor'ом ограничить перемещение? только будут
> ли сообщения приходить при попытках выхода за границу области.
> .. не проверял


С клипом все печально и грустно. Курсор стоит на месте, WM_MOUSEMOVE приходит но xPos и yPos не изменяются. Мне неоткуда получить дельту перемещения для дальнейших действий.


MetalFan   (2006-11-01 08:27:00) [7]

может ClipCursor'ом ограничить перемещение? только будут ли сообщения приходить при попытках выхода за границу области... не проверял


DiamondShark   (2006-10-31 23:39:00) [8]


> Неа - это не ответ.

Ты не хами, а думай.
Ответов было достаточно, чтобы скомпоновать приемлемое решение:

прячь курсор;
рисуй вместо него картинку;
возвращай курсор SetCursorPos-ом, нехай теперь невидимый курсор сколько угодно себе дёргается;
при отпускании кнопки показывай курсор


Still Swamp   (2006-10-31 20:35:00) [9]

Неа - это не ответ.
В частности в 3DMax в зависимости от версии и настроек такое реализовано скажем для установки значений в полях. В нескольких RTS это реализовано для скалировани и зума карт. Так что... не стоит о пользователе вместо него печься... Мнеб технически это решить а хорошо или плохо это будет - моя забота.


Leonid Troyanovsky   (2006-10-31 19:06:00) [10]


> Still Swamp   (31.10.06 18:50) [21]


> Скролбар естно есть внизу (он обрезан на картинке просто).

Ну добавь еще и вверху, делов-то.

>  Если это нельзя сделать - то желателен простой ответ -
> "это нельзя сделть".

Так делать нельзя.
Пользователей надо уважать.

--
Regards, LVT.


Still Swamp   (2006-10-31 18:50:00) [11]

Скролбар естно есть внизу (он обрезан на картинке просто). Скроллинг аля Explorer для этой ситуации не очень кошерен, потоми я и задал конкретный вопрос про мышкурсор на месте. Если это нельзя сделать - то желателен простой ответ - "это нельзя сделть".


Leonid Troyanovsky   (2006-10-31 18:46:00) [12]


> Still Swamp   (31.10.06 18:39) [19]

> Ну в данном случае TDrawGrid, но вообще произвольный Canvas.


События мыши имеют смысл только для TControl.
А, вообще-то, у современных мышей (манипуляторов в руке)
есть, скажем, колесико посредине.

Ну, а если нет - приделай к картине scrollbar.

--
Regards, LVT.


Still Swamp   (2006-10-31 18:39:00) [13]

Ну в данном случае TDrawGrid, но вообще произвольный Canvas.


Leonid Troyanovsky   (2006-10-31 18:37:00) [14]


> Still Swamp   (31.10.06 18:32) [16]

> Я на Canvas объекта


Какого объекта?

--
Regards, LVT.


Still Swamp   (2006-10-31 18:36:00) [15]

Могу скри приложить что бы понятнее было.
http://www.astrocluster.com/Untitled-1.jpg
Красным обведена та самая линейка.


Still Swamp   (2006-10-31 18:32:00) [16]

Попробую описать.
Я на Canvas объекта отрисовываю линейку времени, допустим так.

01:00----02.00----03.00----04.00

Потом на WM_MOUSEMOVE при зажатой левой кнопке смещаю границы вывода ли нейки таким образом что получаю:

00----02.00----03.00----04.00---

Курсор мыши при этом так эе сдвигается. Мне не охота что бы это происходило.


Ketmar   (2006-10-31 18:28:00) [17]

>[13] Still Swamp 31-Oct-2006, 18:26
>Яб поленился.
поленись, а? ну пожалуйста! хотя бы недельку...


Leonid Troyanovsky   (2006-10-31 18:27:00) [18]


> Still Swamp   (31.10.06 18:20) [9]

> Нужен совет как это сделать


Ну, хорошо.
Расскажи, что ты понимаешь под системой (канвой, скролингом),
а мы выясним стоит ли посылать WM_MOUSEMOVE.

--
Regards, LVT.


Still Swamp   (2006-10-31 18:26:00) [19]

Мне нужен ответ. Нет ответа - не стоит и писать. Яб поленился.


Ketmar   (2006-10-31 18:23:00) [20]

опять наглое неко. ну что за эпидемия, а?! сходил бы к Ф. на форум, что ли... помойка находится именно там.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо