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

Вниз

region   Найти похожие ветки 

 
race1 ©   (2003-10-25 15:21) [0]

есть регион (hrgn, например). при наведении мышки этот регион мышка должна встать в центр региона (координаты центра известены). это без проблем делается прверкой мышки в регионе и указанием новых координат мышки.

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

а как сдеать что бы таких движений не нужно было делать? например, что бы мышка оставалась в центре региона, но кооринаты всё равно запоминались бы как если бы она двигалась - прибавлять дельты и т.п.

я написал код, но он чего-то неработает :(

link - координаты центра региона

procedure OnMouseMove ( X, Y );
begin
Link := Point ( -1, -1 );
FMousePos := Point ( FMousePos.x + X - FFirstPos.x, FMousePos.y + Y - FFirstPos.y );
Link := gObject.HitTest ( FMousePos.x, FMousePos.y );
if Link.x <> -1 then
begin
Link := ClientToScreen ( Link );
Mouse.CursorPos := Link;
end;
if Link.x = -1 then
begin
FFirstPos := Point ( X, Y );
FMousePos := Point ( X, Y );
end;


 
wicked ©   (2003-10-25 17:39) [1]

зачэм так сложно, дарагой?... может пересмотреть это?...

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


 
race1 ©   (2003-10-26 08:13) [2]

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


 
Song ©   (2003-10-26 10:03) [3]

2race1 © (25.10.03 15:21)
PtInRegion() может лучше использовать?


 
reonid ©   (2003-10-26 11:08) [4]

Насколько я тебя понял, проблема в том, что
если регион захватил мышь, то достаточно сложно вырвать её из него.
Эту проблему можно решить, самостоятельно рисуя курсор не в месте, где фактически находится указатель мыши,
а в модифицированой точке, которую и будет захватывать регион.
Настоящий же курсор будет скрытно перемещаться при движении мыши.

Приблизительный набросок:
//----------------------------------------------------------

unit main;

interface

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

type
TMouseCoordHistory = record
CurrPt, PrevPt, DownPt: TPoint;
end;

TForm1 = class(TForm)
PBox: TPaintBox;
procedure FormCreate(Sender: TObject);
procedure PBoxMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure PBoxMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure FormDestroy(Sender: TObject);
procedure PBoxPaint(Sender: TObject);
private
FActualCoords: TMouseCoordHistory;
FModifiedCoords: TMouseCoordHistory;
Rgn: HRGN;
RgnCenter: TPoint;
public
procedure DrawCursor(Canvas: TCanvas; X, Y: Integer);
procedure CMMouseLeave(var Msg: TMessage); message CM_MOUSELEAVE;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.CMMouseLeave(var Msg: TMessage);
begin
if TControl(Msg.LParam) = PBox then
begin
PBox.Canvas.Pen.Mode := pmNot;
//DrawCursor(PBox.Canvas, FModifiedCoords.PrevPt.X, FModifiedCoords.PrevPt.Y);
DrawCursor(PBox.Canvas, FModifiedCoords.CurrPt.X, FModifiedCoords.CurrPt.Y);
PBox.Canvas.Pen.Mode := pmCopy;
FActualCoords.CurrPt := Point(-20, -20);
FModifiedCoords.CurrPt := Point(-20, -20);
end;
end;

procedure TForm1.DrawCursor(Canvas: TCanvas; X, Y: Integer);
begin
Canvas.MoveTo(X-10, Y);
Canvas.LineTo(X+10, Y);
Canvas.MoveTo(X, Y-10);
Canvas.LineTo(X, Y+10);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
PBox.Cursor := crNone;
FActualCoords.CurrPt := Point(-20, -20);
FModifiedCoords.CurrPt := Point(-20, -20);

RgnCenter := Point(80, 80);
Rgn := CreateEllipticRgn(RgnCenter.X-30, RgnCenter.Y-50, RgnCenter.X+30,
RgnCenter.Y+50);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
DeleteObject(Rgn);
end;

procedure TForm1.PBoxMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
FActualCoords.DownPt := Point(X, Y);
// if .. then FModifiedCoords.DownPt := Point(X, Y) else ..;
end;

procedure TForm1.PBoxMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
FActualCoords.PrevPt := FActualCoords.CurrPt;
FActualCoords.CurrPt := Point(X, Y);

FModifiedCoords.PrevPt := FModifiedCoords.CurrPt;
if PtInRegion(Rgn, FActualCoords.CurrPt.X, FActualCoords.CurrPt.Y) then
FModifiedCoords.CurrPt := RgnCenter
else
FModifiedCoords.CurrPt := FActualCoords.CurrPt;

PBox.Canvas.Pen.Mode := pmNot;
DrawCursor(PBox.Canvas, FModifiedCoords.PrevPt.X, FModifiedCoords.PrevPt.Y);
DrawCursor(PBox.Canvas, FModifiedCoords.CurrPt.X, FModifiedCoords.CurrPt.Y);
PBox.Canvas.Pen.Mode := pmCopy;
end;

procedure TForm1.PBoxPaint(Sender: TObject);
begin
PBox.Canvas.Brush.Color := clAqua;
FillRgn(PBox.Canvas.Handle, Rgn, PBox.Canvas.Brush.Handle);
end;

end.


 
race1 ©   (2003-10-26 15:58) [5]

>reonid
ага, здорово, главное - работает! ;)

но нельзя ли как-нить рисовать установленный в винде курсор, а не две пересекающиеся прямые :)? там, mouse.cursorpos юзать или как ещё?



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

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

Наверх




Память: 0.48 MB
Время: 0.027 c
1-41357
Delph
2003-11-04 16:45
2003.11.13
Табуляция по клавише Enter


14-42004
MsGuns
2003-10-15 13:03
2003.11.13
Шахтер, Торпедо, Спартак.. Прогнозы


1-41271
Nert
2003-10-31 14:37
2003.11.13
Идеальное округление :-)


4-42253
waw
2003-09-09 15:46
2003.11.13
Добавление страниц свойств IShellPropSheetExt


1-41304
odyssey
2003-10-31 09:50
2003.11.13
Как удалить все файлы в каталоге?