Форум: "Основная";
Текущий архив: 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.52 MB
Время: 0.046 c