文档章节

.NET中Winform窗体应用程序的几个关于坐标的知识点

北风其凉
 北风其凉
发布于 2015/10/15 22:27
字数 845
阅读 781
收藏 1
点赞 0
评论 0

本文是我对一些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文档:

https://msdn.microsoft.com/zh-cn/library/system.windows.forms.control.pointtoclient%28v=vs.110%29.aspx

6、工作区内坐标与屏幕上坐标的换算

Control类中提供PointToScreen方法,可以将窗体(或某控件)的相对坐标转换为以屏幕右上角为原点的坐标系上的绝对坐标。

https://msdn.microsoft.com/zh-cn/library/system.windows.forms.control.pointtoscreen%28v=vs.110%29.aspx

三、一个例子

最后放上一个例子,建立一个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

© 著作权归作者所有

共有 人打赏支持
北风其凉

北风其凉

粉丝 114
博文 497
码字总数 462457
作品 4
朝阳
程序员
GDI绘制时钟效果,与系统时间保持同步,基于Winform

这是直接在Winform的基础上进行绘制的。接下来,我对时钟进行了封装,封装成一个名为CSharpQuartz的类,效果如下: 这是把时钟封装后,实现的一种效果,CSharpQuartz内部开辟了一个线程,与系...

李朝强
01/23
0
0
WPF 基础到企业应用系列4——WPF千年轮回

1.开篇前言 首先很高兴这个系列能得到大家的关注和支持,基于对大家负责和对自己负责的态度,我会不断努力写好这个系列,分享自己的微薄技术和经验,希望在帮助别人的同时也不断提升自己。由...

晨曦之光
2012/03/09
0
0
winform分辨率问题解决方案

一、问题分析 winform程序在不同分辨率下产生界面混乱的主要原因是,默认情况下winform程序的坐标是基于Point(点)的,Point与DPI(分辨率,每英寸所打印点数)相关。当DPI发生变化时,显示...

牛牛牛大棚
2016/02/04
125
0
Winform开发框架之插件化应用框架实现

支持插件化应用的开发框架能给程序带来无穷的生命力,也是目前很多系统、程序追求的重要方向之一,插件化的模块,在遵循一定的接口标准的基础上,可以实现快速集成,也就是所谓的热插拔操作,...

walb呀
2017/12/04
0
0
Winform开发框架之Office Ribbon界面

在前面几篇文章介绍我的Winform框架随笔文章,包括有《Winform开发框架之字典数据管理》、《Winform开发框架之权限管理系统》、《Winform开发框架之终极应用》,其中Winform开发框架之终极应...

长平狐
2012/06/11
4.6K
0
Winform开发框架之Office Ribbon界面

在前面几篇文章介绍我的Winform框架随笔文章,包括有《Winform开发框架之字典数据管理》、《Winform开发框架之权限管理系统》、《Winform开发框架之终极应用》,其中Winform开发框架之终极应...

长平狐
2012/08/22
514
0
C#中三种定时器对象的比较

  关于C#中timer类 在C#里关于定时器类就有3个   1.定义在System.Windows.Forms里   2.定义在System.Threading.Timer类里   3.定义在System.Timers.Timer类里   System.Windows.Fo...

橘子红了呐
2017/11/08
0
0
#中三种定时器对象的比较

  关于C#中timer类 在C#里关于定时器类就有3个   1.定义在System.Windows.Forms里   2.定义在System.Threading.Timer类里   3.定义在System.Timers.Timer类里   System.Windows.Fo...

橘子红了呐
2017/11/06
0
0
Web API应用架构在Winform混合框架中的应用(3)--Winfrom界面调用WebAPI的过程分解

最近一直在整合WebAPI、Winform界面、手机短信、微信公众号、企业号等功能,希望把它构建成一个大的应用平台,把我所有的产品线完美连接起来,同时也在探索、攻克更多的技术问题,并抽空写写...

walb呀
2017/12/04
0
0
解决Winform应用程序中窗体背景闪烁的问题

我的操作系统是Win7,使用的VS版本是VS2012,文中的代码都是C#代码。 这几天遇到一个问题,即我用一个嵌入图片的Panel作为Winform应用程序的背景,如下图所示: 这是一个Winform窗体,里面放...

北风其凉
2016/04/14
2.1K
3

没有更多内容

加载失败,请刷新页面

加载更多

下一页

崛起于Springboot2.X之开发拦截器(21)

序言:几乎所有项目都需要拦截器,所以小伙伴们必须要掌握这门技术哦,不然只会mybaits增删改查那是实习生干的活呀。 1、创建拦截器类,implements HandlerInterceptor public class MyInce...

木九天
14分钟前
1
0
(转)SQL语句的执行顺序

(7) SELECT (8) DISTINCT <select_list> (1) FROM <left_table> (3) <join_type> JOIN <right_table> (2) ON <join_condition> (4) WHERE <where_condition> (5) GROUP BY <group_by_list> (......

Avner
23分钟前
0
0
1.14 救援模式

确保开机启动时连接镜像文件,如果是真机服务器,就需要:U盘或光盘镜像启动进入BIOS 不同主板进入bios按键不同,一般是F12或Esc 光标:移动到Boot(开机启动项) 减号移动:光标选中行,按-...

小丑鱼00
31分钟前
0
0
ES11-全文检索

高级别全文检索通常用于在全文本字段(如电子邮件正文)上运行全文检索。 他们了解如何分析被查询的字段,并在执行之前将每个字段的分析器(或search_analyzer)应用于查询字符串。 1.term查...

贾峰uk
34分钟前
0
0
java 复制对象有哪些方式

java 复制对象有哪些方式 Apache的 Common beanutils库 org.apache.commons.beanutils.BeanUtils.copyProperties(dest,origin); Springframework 的BeanUtil 依赖: <dependency> ......

黄威
49分钟前
2
0
jstack的简单使用

公司测试反应, 一个java应用的机器, 即使不做交易, cpu始终是30%多, 于是想到了jstack, 实践步骤记录一下: 1, 找出java应用的进程号 ps -ef|grep 应用名|grep -v grep 2, 找出pid下的cpu占用...

零二一七
56分钟前
1
0
导入CSV文件就行数据整理分析

#-*-coding:utf-8-*-import csv,os,re,mathlocalPath=input("请输入所有群文件的根目录:") #所有QQ群文件的物理根目录路径def info(): info_dic=[] dirList=os.listdi...

Kefy
今天
5
0
CoreText进阶(六)-内容大小计算和自动布局

CoreText进阶(六)-内容大小计算和自动布局 其它文章: CoreText 入门(一)-文本绘制 CoreText入门(二)-绘制图片 CoreText进阶(三)-事件处理 CoreText进阶(四)-文字行数限制和显示更...

aron1992
今天
1
0
一个Unity高人的博客,涉猎范围很广,深度也很深。

https://blog.csdn.net/ecidevilin/article/list/

爽歪歪ES
今天
0
0
Spring Cloud Config-Git后端

EnvironmentRepository的默认实现使用Git后端,这对于管理升级和物理环境以及审核更改非常方便。要更改存储库的位置,可以在Config Server中设置“spring.cloud.config.server.git.uri”配置...

itcloud
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部