我需要更多的精度,而不是基于整数的位置时,将控件放在一个窗体上。control.location似乎只支持Point。有没有解决这个问题的办法?
Point p= new Point(100,200);this.Location = p;//当然可以
PointF pF =新的PointF(100.04f,200.08f);this.Location = pF;//这当然不起作用,因为位置需要的是点而不是PointF
基窗体或基控件上是否有一些设置,我可以将其设置为具有更高的定位精度?
发布于 2010-04-15 06:16:39
您可以结合使用Windows Presentation Foundation (WPF)和XAML (两者在Visual Studio中都能很好地工作),它允许控件的亚像素定位。
但是,假设您使用的是Windows窗体而不是WPF,为什么还要将控件放在非整数(子像素)位置上呢?
发布于 2010-04-15 06:18:02
不,WinForms中的控件渲染基本上都是基于像素的。有一种方法可以实现亚像素定位(不使用WPF),但这将是您的工作,我真的不确定为什么你会需要这个。
这种方法的要点是创建一个用户控件,其中包含一个隐藏的控件实例(可能是子像素的)。您连接所有用户控件的事件,以便它们传递到隐藏控件,并且在传递每个事件之后,您可以调用隐藏控件的DrawToBitmap方法来获取控件的快照。然后使用Graphics.DrawImage将快照复制到用户控件的图面上。DrawImage并不局限于像素,因此您可以将绘图偏移不到一个像素,以实现所需的精确定位。
警告:请不要这样做,因为当您可以只使用WPF时,没有理由这样做。这将是大量的工作,因为“传递控件的事件”并不像听起来那么简单。以这种方式正确呈现焦点也有一个问题,因为不可见的控件无法获得焦点(我甚至不会告诉您这个问题的可怕的黑客解决方案是什么)。
这是值得重新考虑的关于的决定-它对你正在做的事情来说是理想的,并会让你的生活变得更简单。我通常对WPF不感兴趣,因为我认为虽然它非常强大,但对于它最常用的用途(即无聊的商业应用程序)来说,它基本上是无能为力的。然而,在你的例子中,它提供了你的应用程序中实际需要的粒度。
但是,如果您坚持使用WinForms,那么最好的方法是编写您的应用程序所需的文本编辑控件的UserControl版本。从本质上讲,TextBox只是一个方块,您可以在其周围绘制边框和一些文本。此函数的.Net Graphics方法(DrawRectangle和DrawString)可以具有以浮点形式指定的图形坐标。
关于所有者描述的用户控件和GDI+图形,有大量的StackOverflow问题。
发布于 2010-04-15 06:20:20
尽管GDI+能够使用浮点坐标系,但Win32 ( Winforms所基于的)不能。我再次推荐移动到WPF,它有一个基于设备无关虚拟像素的无处不在的浮点坐标系。
https://stackoverflow.com/questions/2641418
复制相似问题