Форум: "Основная";
Текущий архив: 2003.11.13;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.052 c