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

Вниз

Right Button = Left Button   Найти похожие ветки 

 
Deus   (2003-04-29 03:14) [0]

Как заставить правую кнопку мыши работать со всеми особенностями левой, а именно, с drug n drop? Это вообще возможно? Или это всё на уровне ядра/драйверов?


 
MBo ©   (2003-04-29 06:05) [1]

со всеми особенностями - в установках Виндоус кнопки поменять.

Только некоторые операции в своей программе - сделать несложно.


 
Zergling   (2003-04-29 12:04) [2]

> заставить правую кнопку мыши работать со всеми особенностями левой
Не совсем ясна суть вопроса. Че за особенности такие?
> именно, с drug n drop
Это совсем другая категория вопроса не имеющая ни чего общего с 1 вопросом.

Здесь используются средства RTTI, так что теоритически можно таскать любой объект у которого есть свойства left и Top. На данный (таскаемый) обеъкт должны быть назначены ниже приведенные события мыши OnMouseUp, OnMouseDown, OnMouseMove.
Возможно чего то будет не хватать (код перед отправкой не тестировал) т.к. выдирал код кусками из своего проекта. Если будут глюки напиши, добавлю недостющую часть кода.

uses TypInfo;

var
MouseDownSpot: TPoint; // Координаты мыши для перемещения объекта
DragObjects: Boolean=False; // Тащим объект или нет (True - да)

Procedure TVSetIntProp(AComponent:TObject;APropertyName:String;AValue:Integer);
var PropInfo: PPropInfo;
Begin
PropInfo:=GetPropInfo(AComponent.ClassInfo,APropertyName);
if PropInfo<>nil then
if PropInfo^.PropType^.Kind=tkInteger then SetOrdProp(AComponent,PropInfo,Integer(AValue));
End;

Function TVGetIntProp(AComponent:TObject;APropertyName:String):Integer;
var PropInfo: PPropInfo;
Begin
PropInfo:=GetPropInfo(AComponent.ClassInfo,APropertyName);
if PropInfo<>nil then
if PropInfo^.PropType^.Kind=tkInteger then Result:=GetOrdProp(AComponent,PropInfo) else Result:=0;
End;

// Событие OnMouseDown
procedure TEdit_FC.DefaultForMouseMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
// Событие для начала перемещения объекта
if Button = mbLeft then // Нужную кнопку назначишь сам (без проверки будет срабатывать на нажатие любой кнопки)
Begin
DragObjects := True;
MouseDownSpot.X := X;
MouseDownSpot.Y := Y;
End;
end;

// Событие OnMouseMove
procedure TEdit_FC.DefaultForMouseMouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
begin
// Событие на перемещение объекта
if DragObjects then
begin
TVSetIntProp(Sender,"Left",TVGetIntProp(Sender,"Left")-(MouseDownSpot.X-X));
TVSetIntProp(Sender,"Top",TVGetIntProp(Sender,"Top")-(MouseDownSpot.Y-Y));
end;
end;

// Событие OnMouseUp
procedure TEdit_FC.DefaultForMouseMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
// Событие для завершения перемещения объекта
if DragObjects then
begin
DragObjects:=False;
TVSetIntProp(Sender,"Left",TVGetIntProp(Sender,"Left")-(MouseDownSpot.X-X));
TVSetIntProp(Sender,"Top",TVGetIntProp(Sender,"Top")-(MouseDownSpot.Y-Y));
end;
end;


 
Deus   (2003-04-30 20:47) [3]

Спасибо за ответы. Уточню вопрос, я его не совсем правильно сформулировал. Вернее, совсем не правильно. Собственно dnd _объектов_ делать не нужно. Есть объект dxdraw, он отрисовывает на surface tpicture. Этот tpicture иногда больше отображаемого (primary) сарфейса и его приходится мышкой "таскать" в окне dxdraw. Причем необходима возможность перетаскивания зажав как левую, так и правую кнопку мыши. Так вот, с левой никаких проблем - события onmousemove генерятся вне зависимости находится ли курсор мыши на dxdraw, на моей форме, или вообще неизвестно где - всё прекрасно работает. Как я понимаю, за счет механизма dnd. С правой кнопкой естественно всё совсем не так. События генерятся только до краёв окна dxdraw. Если кнопку отпустить вне окна, естественно, onmousemove не доходит до окна (хорошо, если хоть до формы дойдет). И начинаются чудные глюки. Пока на dxdraw мышь не перещелкнешь. Такое поведение вполне понятно, объяснимо и логично. Тут вопросов нет, кто виноват понятно. Второй вечный вопрос: что делать?


 
Deus   (2003-05-11 15:52) [4]

Добрый день всем. Наконец добрался до инета. Извините, что надоедаю, но еще кто что скажет по этому вопросу?


 
Deus   (2003-05-15 16:03) [5]

Думаю, тебе стоит сменить ник...


 
Death_666   (2003-05-15 17:14) [6]

А тебе - e-mail.


 
Deus ©   (2003-05-15 17:33) [7]

2Death_666:
?


 
Death_666   (2003-05-15 17:45) [8]

Сладкое слово - спам. Что, мылом не мог предупредить? Обязательно нужно было повыеживаться?



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

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

Наверх




Память: 0.49 MB
Время: 0.022 c
3-77802
zep
2003-07-02 23:24
2003.07.24
работа с Alias


1-77821
stkatch
2003-07-09 16:36
2003.07.24
Как узнать Handle текущего потока (Thread)


1-77876
Всё равно
2003-07-13 23:36
2003.07.24
Свой компонент


1-77992
Вован
2003-07-10 18:09
2003.07.24
Как зделать форму которая всегда находится на заднем плане?


3-77804
Chery
2003-07-03 11:51
2003.07.24
Кол-во записей, где некое поле P = a or b or c ? Filtre ?