Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.12.17;
Скачать: CL | DM;

Вниз

Оставить мышь на месте.   Найти похожие ветки 

 
Still Swamp   (2006-10-31 18:09) [0]

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

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


 
Ketmar ©   (2006-10-31 18:11) [1]

сначала написать по-русски. чтобы хоть кто-то кроме тебя понял.


 
DVM ©   (2006-10-31 18:13) [2]

я тоже не хрена не понял что надо то.


 
Still Swamp   (2006-10-31 18:14) [3]

При движении мыши (манипулятор в руке)
не изменять координаты курсора (стрелка на экране)
отправив в систему WM_MOUSEMOVE (системное сообщение).


 
Ketmar ©   (2006-10-31 18:16) [4]

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


 
DVM ©   (2006-10-31 18:17) [5]

Я так и не понял что в результате должно получится в визуальном плане. И причем здесь кроллинг.


 
Still Swamp   (2006-10-31 18:18) [6]

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

Вопрос "Как сделать дверь?"
Ответ "Оригинально!!! Сделай в окно и лазь в него."


 
MetalFan ©   (2006-10-31 18:18) [7]

ммм. включаю телепатию...
нажимаешь ЛКМ на контрол, ведешь вверх - вниз, курсор на месте, а значение в контроле меняются


 
Leonid Troyanovsky ©   (2006-10-31 18:19) [8]


> Still Swamp   (31.10.06 18:14) [3]

> отправив в систему WM_MOUSEMOVE (системное сообщение).


А зачем системе оное сообщение?
У нее и своих - как грязи.

--
Regards, LVT.


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

Нужен совет как это сделать, а не комментарии содержащие в себе общий смысл "иш чего захотел".


 
Still Swamp   (2006-10-31 18:21) [10]

Оное сообщение нужно системе, таки затем что бы она оповестила окна что мышь (манипулятор в руке) двигается.


 
DVM ©   (2006-10-31 18:23) [11]


> Оное сообщение нужно системе

А как "в систему" отправляется указанное сообщение?


 
Ketmar ©   (2006-10-31 18:23) [12]

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


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

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


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


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

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


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

--
Regards, LVT.


 
Ketmar ©   (2006-10-31 18:28) [15]

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


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

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

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

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

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

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


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

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


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


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

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


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

--
Regards, LVT.


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

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


 
Leonid Troyanovsky ©   (2006-10-31 18:46) [20]


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

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


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

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

--
Regards, LVT.


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

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


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


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


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

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

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

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

--
Regards, LVT.


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

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


 
DiamondShark ©   (2006-10-31 23:39) [24]


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

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

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


 
MetalFan ©   (2006-11-01 08:27) [25]

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


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


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


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


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


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

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


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


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


 
Elen ©   (2006-11-01 10:46) [28]


> Still Swamp

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


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

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


 
Elen ©   (2006-11-01 11:43) [30]


> 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.


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


 
Elen ©   (2006-11-01 11:44) [31]


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

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



Страницы: 1 вся ветка

Текущий архив: 2006.12.17;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.109 c
15-1164552740
ShellX
2006-11-26 17:52
2006.12.17
Интересная задачка


15-1164292048
oldman
2006-11-23 17:27
2006.12.17
Разные бывают в жизни огорчения, но чтобы вот так...


15-1164399477
Некто
2006-11-24 23:17
2006.12.17
Работа с *.xls как с базой данных


2-1164720995
Мишок
2006-11-28 16:36
2006.12.17
Папка windows


4-1155022476
shake
2006-08-08 11:34
2006.12.17
завершение процесса