كيف يمكنني الحصول على إحداثيات الماوس عند النقر على السيطرة؟
سؤال
في الحدث OnClick على TImage، وأود أن استخراج س، ص الإحداثيات من الماوس. وأود أن تفضل فيهم فيما يتعلق الصورة، ولكن بالنسبة إلى النموذج أو النافذة تماما كما هو جيدة.
المحلول
وMouse.CursorPos يحتوي على TPoint، والذي يحتوي بدوره على X وموقف Y. هذه القيمة هي في الإحداثيات العالمية، حتى تتمكن من ترجمة إلى النموذج الخاص بك باستخدام روتين ScreenToClient التي سوف تترجم الشاشة إحداثيات إحداثيات النافذة.
ووفقا لملف مساعدة دلفي، يمكن أن تفشل Windows.GetCursorPos، Mouse.CursorPos يلتف هذا لرفع EOsException إذا فشلت.
var
pt : tPoint;
begin
pt := Mouse.CursorPos;
// now have SCREEN position
Label1.Caption := 'X = '+IntToStr(pt.x)+', Y = '+IntToStr(pt.y);
pt := ScreenToClient(pt);
// now have FORM position
Label2.Caption := 'X = '+IntToStr(pt.x)+', Y = '+IntToStr(pt.y);
end;
نصائح أخرى
والخاصية Mouse.CursorPos
سوف اقول لكم <م> موقف م> الحالي من الفأرة. إذا كان الكمبيوتر يعمل ببطء، أو إذا كان البرنامج بطيء للرد على الرسائل، فإنه قد لا يكون هو نفسه موقف زيارتها الماوس عندما وقعت أحداث OnClick
أولا. للحصول على موضع الماوس <م> في الوقت الذي تم النقر على زر الماوس م>، استخدم <لأ href = "http://msdn.microsoft.com/en-us/library/ms644938.aspx" يختلط = "noreferrer"> GetMessagePos
. فإنه تقارير <م> إحداثيات الشاشة م>. تترجم إلى العميل ينسق مع TImage.ScreenToClient
.
والبديل هو للتعامل مع OnMouseDown
والأحداث OnMouseUp
نفسك؛ وتشمل المعلمات الخاصة بهم الإحداثيات. تذكر أن <م> على حد سواء م> أحداث تحتاج إلى أن تحدث من أجل ل<م> انقر م> تحدث. قد تحتاج أيضا للكشف عن السحب م> العمليات، وبما انك قد لا ترغب في النظر في السحب على اعتباره نقرة.
وكما قال آخرون، يمكنك استخدام Mouse.CursorPos أو وظيفة GetCursorPos، ولكن يمكنك أيضا مجرد التعامل مع الحدث عند_ضغط_الماوس أو OnMouseUp بدلا من عند_النقر. وبهذه الطريقة يمكنك الحصول على X والقيم Y كمعلمات إلى معالج الحدث، دون الحاجة إلى إجراء أي مكالمات وظيفة إضافية.
وماذا عن هذا؟
procedure TForm1.Button1Click(Sender: TObject);
var
MausPos: TPoint;
begin
GetCursorPos(MausPos);
label1.Caption := IntToStr(MausPos.x);
label2.Caption := IntToStr(MausPos.y);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
SetCursorPos(600, 600);
end;
وجدت هذا الخط في مكان ما مرة واحدة وحفظه في بلدي codesnippet DB:)
هذه الصفحة سوف ربما حل كل ما تبذلونه من الأسئلة ولكن ... . ويبدو أن هناك وظائف للذهاب من العميل إلى إحداثيات الشاشة والظهر وما إلى ذلك.
وحظا سعيدا!