كيف يمكنني الحصول على إحداثيات الماوس عند النقر على السيطرة؟

StackOverflow https://stackoverflow.com/questions/826914

  •  05-07-2019
  •  | 
  •  

سؤال

في الحدث 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:)

هذه الصفحة سوف ربما حل كل ما تبذلونه من الأسئلة ولكن ... . ويبدو أن هناك وظائف للذهاب من العميل إلى إحداثيات الشاشة والظهر وما إلى ذلك.

وحظا سعيدا!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top