本文是我对一些Winform下常用的坐标知识点做一个总结。
在计算机中,左上角是原点,从左上角向右为X轴的正方向,从左上角向下为Y轴的正方向。坐标在.NET中通过Point结构表示,该结构有两个属性X与Y用于指定横纵坐标,并重载了+、-、+=、-=等运算符。
1、鼠标在窗体(Form)中的相对坐标
在Form的MouseClick事件中,可以从MouseEventArgs类型的参数e中获取到鼠标在窗体中的相对坐标。
2、鼠标在屏幕上的绝对坐标
获取鼠标在电脑显示器屏幕上的坐标,可以使用Cursor.Position获取。
3、获取窗体(Form)四个角的坐标
窗体四个角的坐标可以通过窗体的上(Top)、下(Bottom)、左(Left)、右(Right)四边的横(纵)坐标计算得出。
4、某控件左上角在窗体中的相对坐标
控件都具有Location属性,该属性内存储了这个控件左上角的坐标
5、屏幕上坐标与工作区中坐标的换算
这里说的工作区中坐标,即以当前控件(可以为Form,也可以为其他控件)左上角为原点的坐标系。Control类中的PointToClient方法,可以将屏幕上的坐标换算为窗体(或某控件)内的相对坐标
可以参考MSDN文档:
6、工作区内坐标与屏幕上坐标的换算
Control类中提供PointToScreen方法,可以将窗体(或某控件)的相对坐标转换为以屏幕右上角为原点的坐标系上的绝对坐标。
最后放上一个例子,建立一个C#窗体应用程序,窗体名为FormMain,里面有一个Dock被设置为Fill的Label,取名lblPositionInfo,右下角是一个名为btnClear的按钮。用鼠标点击窗体内的任意区域,Label上就会打印出坐标信息。
在FormMain的MouseClick事件中加入代码:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace GetCurrPoint { public partial class FormMain : Form { public FormMain() { InitializeComponent(); } private void FormMain_MouseClick(object sender, MouseEventArgs e) { StringBuilder sb = new StringBuilder(); sb.Append(string.Format("鼠标在窗体中的相对坐标:({0}, {1})\r\n", e.X, e.Y)); sb.Append(string.Format("鼠标在屏幕上的绝对坐标:({0}, {1})\r\n", Cursor.Position.X, Cursor.Position.Y)); sb.Append(string.Format("窗体左上角在屏幕上的绝对坐标:({0}, {1})\r\n", this.Left, this.Top)); sb.Append(string.Format("窗体右上角在屏幕上的绝对坐标:({0}, {1})\r\n", this.Right, this.Bottom)); sb.Append(string.Format("窗体左下角在屏幕上的绝对坐标:({0}, {1})\r\n", this.Left, this.Top)); sb.Append(string.Format("窗体右下角在屏幕上的绝对坐标:({0}, {1})\r\n", this.Right, this.Bottom)); sb.Append(string.Format("清空按钮左上角在窗体中的相对坐标:({0}, {1})\r\n", btnClear.Location.X, btnClear.Location.Y)); sb.Append(string.Format("屏幕上点(300, 300)在工作区内的坐标:({0}, {1})\r\n", PointToClient(new Point(300, 300)).X, PointToClient(new Point(300, 300)).Y)); sb.Append(string.Format("工作区上点(300, 300)在屏幕上的坐标:({0}, {1})\r\n", PointToScreen(new Point(300, 300)).X, PointToScreen(new Point(300, 300)).Y)); lblPositionInfo.Text = sb.ToString(); } private void btnClear_Click(object sender, EventArgs e) { lblPositionInfo.Text = ""; } } }
END
原文:http://my.oschina.net/Tsybius2014/blog/517808