2

テキストの最後の文字のすぐ下に小さなインテリセンスのようなウィンドウ (小さなフォーム) を表示しようとしていますが、現在のコードでは座標がランダムであまり正確ではないようです。どんな助けでも感謝されます。

Alt+1 を押すと (入力中に Intelliense のようなウィンドウを表示するには、次のコードを呼び出します。

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;
}

ただし、何らかの理由で、このメソッドが初めて呼び出されたときは、常にランダムな場所に表示されますが、その後このメソッドを呼び出すたびに、ウィンドウが配置されるべき場所に配置されます。ウィンドウがテキストボックスの最後の文字の直後になるように、現在のテキスト行のすぐ下に水平方向に配置されます。

4

1 に答える 1

3

これを試して:

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 に置き換えます。また、tabControl にはスペースがあるため、X と Y の両方にパディングとして 5 を追加する必要がありました。

于 2013-05-30T12:41:41.217 に答える