Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-41551
Unknown user
2003-10-27 19:43
2003.11.13
Ошибка при работе функций trunc и int.


1-41463
Alecs
2003-10-28 19:18
2003.11.13
Как поменять CharSet у TRadioGroup, TCheckBox и т.д.?


6-41801
Dolla
2003-09-17 13:02
2003.11.13
ошибка сокета


4-42225
JS
2003-09-02 16:45
2003.11.13
Global memory


1-41684
Peter
2003-10-24 13:58
2003.11.13
Файлы





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский