该段代码是放在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