在C#

问题描述:

我自己的编辑器用户控制我有一个图片框,我已经使用这个方法:在C#

CreateCaret(pictureBox1.Handle,IntPtr.Zero,1,font.Height); 
ShowCaret(pictureBox1.Handle); 

现在我已经创建插入符号。通过下面的代码,我要画上的图片框:

gr = pictureBox1.CreateGraphics(); 

现在我已经使用这个代码来衡量一个字符宽度:

font = new Font("Arial", 20, GraphicsUnit.Pixel); 
char_width = (int)gr.MeasureString("a", font).Width; 

和Form1_keypress:

if (e.KeyChar !=(char)Keys.Enter) 
{ 
    gr.DrawString(e.KeyChar.ToString(), font, Brushes.Black, caretpos.X, caretpos.Y); 
    caretpos.X += char_width; 
} 

但字符之间的空间非常大,大约26像素。我该如何解决这个问题?

像这样:

 甲   乙     Ç      d

+0

准确的字符串测量不可能正确。只需绘制OnPaint()方法,在KeyPress事件处理函数中调用Invalidate()以强制重绘。在OnPaint中,测量并绘制*整个*字符串,而不是单个字符。 – 2011-03-03 19:38:55

注意,传递给CreateCaret所的尺寸以像素为单位。推测你的字体高度等等。

另请注意,应在控件获得焦点时创建插入符号,然后在控件失去焦点时将其销毁。一次只能有一个插入符号,因此在焦点转到另一个窗口(该窗口可能需要插入符号)时维护一个插入符号是不正确的。

我的第一个想法是,由于MeasureString如何针对单个字符进行操作,因此您看起来像获得等宽字体。

跟踪整个字符串,为每个字符添加每个按键并重新绘制/测量插入位置,而不是整个字符。

有一点要记住的是,Graphics.MeasureString()会给你一个不同的结果TextRenderer.MeasureText()

一般情况下,你将要使用的TextRenderer版本。