vsto定位单元格实际屏幕位置

该段代码是放在form窗体的form_load事件里面的,实现的功能是点击A5单元格(也就是Target对象),在A6单元格弹出窗体。

//点击单元格,窗体显示到下一行
this.StartPosition = FormStartPosition.Manual;
int ix = Convert.ToInt32(Target.Left);
int iy = Convert.ToInt32(Target.Top + Target.Height);

//获取A1的坐标位置
int ia = Target.Application.ActiveWindow.PointsToScreenPixelsX(0);
int ib = Target.Application.ActiveWindow.PointsToScreenPixelsY(0);

//excel的缩放率
double izoom = Target.Application.ActiveWindow.Zoom;

float dpiX = this.CreateGraphics().DpiX;//电脑的缩放率

ia = Convert.ToInt32(ia + ix * izoom / 100 * dpiX / 72);
ib = Convert.ToInt32(ib + iy * izoom / 100 * dpiX / 72);

this.Location = new System.Drawing.Point(ia, ib);

解释:

1、excel单元格长宽都是磅为单位,需要转像素:算法就是长/高*dpiX/72。

2、dpiX,电脑100%是96。

3、所有的算法都是基于A1的屏幕坐标处理的。A1的屏幕坐标位置是对的。如果直接使用A5就会有偏差。所以才需要A1的左上角坐标+A6的左上角坐标到A1左上角距离转换后的屏幕距离。

4、excel的长宽都是excel100%缩放率下的大小。一旦excel缩放率不是100%,需要进行转换。

参考:
https://bbs.csdn.net/topics/350003532

字号 磅值 像素值的对应关系_c# 字体大小转像素-CSDN博客

https://www.toutiao.com/article/6852127370066067982/?wid=1718184341420

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值