在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
答
注意,传递给CreateCaret所的尺寸以像素为单位。推测你的字体高度等等。
另请注意,应在控件获得焦点时创建插入符号,然后在控件失去焦点时将其销毁。一次只能有一个插入符号,因此在焦点转到另一个窗口(该窗口可能需要插入符号)时维护一个插入符号是不正确的。
答
我的第一个想法是,由于MeasureString如何针对单个字符进行操作,因此您看起来像获得等宽字体。
跟踪整个字符串,为每个字符添加每个按键并重新绘制/测量插入位置,而不是整个字符。
准确的字符串测量不可能正确。只需绘制OnPaint()方法,在KeyPress事件处理函数中调用Invalidate()以强制重绘。在OnPaint中,测量并绘制*整个*字符串,而不是单个字符。 – 2011-03-03 19:38:55