Knowing the point location of the caret in a Winforms TextBox?

前端 未结 7 1714
粉色の甜心
粉色の甜心 2021-01-12 08:14

I need to know the exact point location in my window where the caret currently resides so that I can pop up a small window under the text (similar to intellisense or a spell

7条回答
  •  逝去的感伤
    2021-01-12 09:18

    I have discoverd some peculiar behavior of the textbox control. When you type text at the end of the textbox, GetPositionFromCharIndex remains 0,0. However, if you insert text before the last char in the textbox, GetPositionFromCharIndex IS updated.

    Don't know if you can use that to your advantage, but I think you might wanted to know that.

    Edit: Ok, LOL, this seems to work, how ugly it may be...:

    Point pt = textBox1.GetPositionFromCharIndex(textBox1.SelectionStart > 0 ? textBox1.SelectionStart - 1 : 0);
    

    Edit 2: In retrospect, I think the behavior isn't so odd, since the SelectionStart at the end of a textbox returns the index where the next character will be typed, not where the last character actually is. Since GetPositionFromCharIndex will return an character position, the index of a not yet existing char returns apparently 0,0.

    Edit 3: With mine and MikeJ's code combined and slightly reworked, you can get the exact position of the caret:

    SizeF size = g.MeasureString(textBox1.Text.Substring(textBox1.SelectionStart - 1, 1), textBox1.Font);
    pt.X += (int)size.Width;
    

    I admit, It's damn-ugly the way I typed it, but with some editing you should be able to get some nice code out of this.

提交回复
热议问题