Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.12.17;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.303 c
15-1164439066
Shopot
2006-11-25 10:17
2006.12.17
2 операционки на 1 компе.


2-1164793338
kester
2006-11-29 12:42
2006.12.17
ReadProcessMemory


2-1164807554
webpauk
2006-11-29 16:39
2006.12.17
Проблема с RadioButton


1-1162540775
wild_arg
2006-11-03 10:59
2006.12.17
Показ неактивного окна


15-1164364973
vajo
2006-11-24 13:42
2006.12.17
Где можно взять музыку без слов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский