c# - 打字时显示类似智能感知的窗口(无法获得正确的坐标)

标签 c# .net winforms

我试图在文本的最后一个字符的正下方显示一个类似智能感知的小窗口(它是一个小表单),但使用我当前的代码,它的坐标似乎是随机的并且不是很准确。任何帮助将不胜感激。

当我按 Alt+1(在打字时显示类似智能的窗口)时,我调用以下代码:

shortcuts.Location = GetPoint((TextBox)tabControl1.SelectedTab.Controls[0]);
shortcuts.Show(this);

获取坐标的代码是:

private Point GetPoint(TextBox textBoxControl)
        {
            Graphics graphics = Graphics.FromHwnd(textBoxControl.Handle);
            SizeF size = graphics.MeasureString(textBoxControl.Text.Substring(0,
                         textBoxControl.SelectionStart), textBoxControl.Font);
            Point coord = new Point((int)size.Width + textBoxControl.Location.X,
                          (int)size.Height + 200 + textBoxControl.Location.Y);
            return coord;
        }

工作代码

我承认可能有更好的方法来做到这一点,但这对我来说非常有效:

private Point GetPoint(TextBox textBoxControl)
{
    Graphics graphics = Graphics.FromHwnd(textBoxControl.Handle);
    SizeF size = graphics.MeasureString(textBoxControl.Text.Substring(0,
                 textBoxControl.SelectionStart), textBoxControl.Font);
    Point coord = new Point(this.Left + (int)size.Width + textBoxControl.Location.X + 5,
                  this.Location.Y + 25 + toolStrip1.Height + tabControl1.Top + (int)size.Height + tabControl1.Top + textBoxControl.Location.Y + 25);
    return coord;
}

但是,由于某种原因,第一次调用此方法时,它总是出现在某个随机位置 - 尽管随后每次调用此方法都会导致窗口被放置在它应该放置的位置;位于当前文本行的正下方并水平对齐,以便窗口位于文本框中最后一个字符之后。

最佳答案

试试这个:

TextBox tb = (TextBox)tabControl1.SelectedTab.Controls[0];
Point thePoint = GetPoint(tb);
shortcuts.Location = tb.PointToClient(tabControl1.PointToScreen(thePoint));  //assuming "this" is the form itself

在 GetPoint() 方法中,将“200 + ”替换为 tabControl1.GetTabRect(0).Height。我还必须为 X 和 Y 添加 5 作为填充,因为 tabControl 有一些间距。

关于c# - 打字时显示类似智能感知的窗口(无法获得正确的坐标),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16835763/

相关文章:

c# - Odoo C# 连接器无法按名称找到表

c# - 使用 System.Runtime.Caching,但是当我去检索它时,它是空的?

c# - 如何配置 C# 程序在操作系统首次启动时运行?

.net - 将 JavaScript 放入外部文件中。文件不起作用?

c# - 什么是选择键?

c# - MonoGame Windows 8 - 可写位图

.net - 当安装程序未创建标准 DSN 时,如何在 64 位 Server 2008 上使用 32 位 ODBC 驱动程序?

c# - C# 中的复选框数组

c# - 第一次显示控件后会立即发生什么事件?

c# - 在 C# 中将像素转换为英寸,反之亦然