关于窗体跟随与 PointToScreen

今日写一段测试代码,实现的功能是,当一个输入框获得焦点时,某个帮助窗体跟随在其下方显示。代码很简单,本来没有什么值得一提的。但实验的时候发现,有些控件能较好地跟随,但有些不能,而且距离十分远。

主要代码如下(跟随窗体中):

Point p = ctrl.PointToScreen(ctrl.Location);
            p.X += 10;
            p.Y += ctrl.Height + 1;

lblDebugPoint.Text = string.Format("X: {0}, \r\nY: {1}", p.X, p.Y);
            this.Location = p;
            txtSearch.Focus();
            Show();

问题出现在哪里呢?经过一翻思索,也翻阅了一些文章。发现原来问题出现在第1句。

ctrl.PointToScreen(ctrl.Location);

ctrl.Location是什么?它是此控件相对于其容器的位置,ctrl.PointToScreen又是基于本控件来计算的。标准不一致,这还不乱套吗?

修改起来也不难,只需要统一标准就行,有两种方式:

Point p = ctrl.Parent.PointToScreen(ctrl.Location);

Point p = ctrl.PointToScreen(ctrl.ClientRectangle.Location);

最简单的代码上出了问题。

时间: 2024-10-05 23:46:17

关于窗体跟随与 PointToScreen的相关文章

winform窗体跟随窗体

Form2 frm2 = new Form2(); private void MoveProc() { frm2.StartPosition = FormStartPosition.CenterParent; frm2.Left = this.Left + panel1.Left; frm2.Top = this.Top + panel1.Top; } public Form1() { InitializeComponent(); MoveProc(); this.AddOwnedForm(fr

WPF 设置类库项目为启动项,设置窗体跟随。

原文:WPF 设置类库项目为启动项,设置窗体跟随. 1.添加用于启动的类Program.cs,需要一个静态的Main函数入口. using System; using System.Windows; using System.Windows.Controls; 棕色部分实现窗口的位置固定和跟随. public class Program { private static Application _MainApplication; internal static Application MainA

窗体切换特效

C# 实现磁性窗口(附源码和程序) 实现并封装了磁性窗口类MagneticMagnager,实现磁性窗口仅仅需要调用一行代码: MagneticMagnager test2 = new MagneticMagnager(this, fm2, MagneticPosition.Top); 插图: 具体操作: 1.新建winform项目MagneticForm,并添加磁性窗口操作类MagneticMagnager: [c-sharp] view plaincopy 1. using System;

Qt编写自定义控件属性设计器

以前做.NET开发中,.NET直接就集成了属性设计器,VS不愧是宇宙第一IDE,你能够想到的都给你封装好了,用起来不要太爽!因为项目需要自从全面转Qt开发已经6年有余,在工业控制领域,有一些应用场景需要自定义绘制一些控件满足特定的需求,比如仪器仪表.组态等,而且需要直接用户通过属性设计的形式生成导出控件及界面数据,下次导入使用,要想从内置控件或者自定义控件拿到对应的属性方法等,首先联想到的就是反射,Qt反射对应的类叫QMetaObject,着实强大,其实整个Qt开发框架也是超级强大的,本人自从转

C# 窗体控件跟随窗体大小自动调节

测试目的:如何使得窗体内的控件可以跟随窗体大小自动调节 测试环境:WIN10 ENT + VS2015 方法原理:记录初始时窗口大小.控件大小等信息.每当窗口大小变化时,计算窗口大小相对于初始时的缩放比例,然后根据缩放比例再调整控件的位置(Location).大小(Size).字体大小(Font.Size). C#主要测试代码: using System; using System.Drawing; using System.Windows.Forms; namespace TEST1111 {

Winform MDI窗体容器、权限、简单通讯

MDI窗体容器: 一般来说,窗体是顶级容器,不允许放在其他任何容器内,但是如果将某个窗体的IsMdiContainer属性设置为True,那此窗体就会成为窗体容器,可以在其中放入其他窗体 在内部的窗体不管怎么调整,是无法跳出其父级窗体容器的 注:如果想让内部窗体一直最大化并且不要其显示最大化最小化按钮,可将其FormBorderStyle设置为None,Win7系统另外需要将此窗体放入一个Panel容器中 private void 销售ToolStripMenuItem_Click(object

winform(MDI窗体容器、权限设置)

一.MDI窗体容器: 1.功能: 它可以让其它窗体在它的内部打开,无法超出它的范围 将某个窗体的属性:IsMdiContainer设置为true - 窗口样式 2.问题: (1)如何将其它窗体在它的内部打开? 窗体对象名.MdiParent = this; (2)窗体打开时最大化属性不好用,怎么办? 在实例化窗体对象,show之前,用代码设置最大化属性 注意:窗体的WindowState属性必须为默认值Normal (3)内部窗体最大时右上角总是显示最大最小关闭按钮,如何去掉? 在MDI窗体里放

获取鼠标点相对于各屏幕、窗体和当前控件的位置

//获取鼠标相对于当前控件的位置 Point mousePos = dgvAddCommand.PointToClient(MousePosition); //获取鼠标相对于当前窗体的位置 mousePos = PointToClient(MousePosition); //获取鼠标相对于屏幕左上点的位置 mousePos = PointToScreen(MousePosition); //偏移位置 mousePos.Offset(3, 20);

C#-WinForm-MDI窗体容器、权限设置

MDI窗体容器 - 放窗体的容器 窗体时顶级控件,是不允许放到其他的控件或窗体中的 (李献策lxc) 窗体属性中有一个属性:IsMdiContainer - 确定该窗体是否是MDI容器 在窗体中放一个顶部菜单 点击<销售>按钮会在窗体中弹出一个新的窗体 //销售 private void 销售ToolStripMenuItem_Click(object sender, EventArgs e) { Form5 f5 = new Form5(); f5.MdiParent = this; f5.