c#控制位置精度

时间:2010-04-14 22:10:50

标签: c# winforms controls

当表单上的puttng控件时,我需要更精确的基于整数的位置。 似乎control.location只支持Point。 有解决方法吗?

点p =新点(100,200); this.Location = p; //这当然有效

PointF pF =新PointF(100.04f,200.08f); this.Location = pF; //这当然不起作用,因为Location需要Point而不是PointF

基础表单上是否有一些设置,或者我可以设置基本控件以获得更多的位置精度?

4 个答案:

答案 0 :(得分:4)

您可以将Windows Presentation Foundation(WPF)与XAML一起使用(两者都可以在Visual Studio中很好地工作),它允许控件的子像素定位。

但是,假设您使用的是Windows窗体而不是WPF,为什么还需要将控件放在非整数(子像素)位置?

答案 1 :(得分:1)

不,WinForms中的控件渲染基本上都是基于像素的。 是一种可以实现子像素定位的方式(不使用WPF),但它可以起作用,我真的不确定为什么你还需要它。

该方法的要点是创建一个用户控件,其中包含您正在尝试放置的控件的隐藏实例(可能是子像素)。您连接所有用户控件的事件,以便它们传递给隐藏控件,并在每个事件传递后调用隐藏控件的DrawToBitmap方法来获取控件的快照。然后使用Graphics.DrawImage将快照复制到用户控件的表面。 DrawImage不限于像素,因此您可以将绘图偏移小于一个像素,以实现您正在寻找的精确定位。

警告:请不要实际执行此操作,因为当您可以使用WPF时没有理由这样做。这将是很多的工作,因为“通过控件的事件传递”并不像听起来那么简单。以这种方式正确渲染焦点也存在一个问题,因为隐形控件不能给予关注(我甚至不会告诉你这个问题的可怕解决方案是什么)。

更新:值得重新审视有关WPF的决定 - 它非常适合您正在做的事情,并会让您的生活更加简单。我一直对WPF感到不知所措,因为我认为虽然它非常强大,但它最常被用于最常用的用途(即无聊的商业应用程序)。但是,在您的情况下,它提供了您在应用中实际需要的粒度。

但是,如果您遇到WinForms,最好的方法是编写应用程序所需的文本编辑控件的UserControl版本。在其核心,TextBox只是一个正方形,您可以绘制边框和一些文本。 .Net Graphics方法(DrawRectangleDrawString)可以使用浮点指定绘图坐标。

有很多关于所有者绘制的用户控件和GDI +图形的StackOverflow问题。

答案 2 :(得分:1)

虽然GDI +能够使用浮点坐标系,但Win32(Winforms所基于的)不是。我推荐转向WPF,它具有基于设备无关虚拟像素的无处不在的浮点坐标系。

答案 3 :(得分:0)

1点是1像素,因此需要最大分辨率。

这就是为什么0,0映射到左角,1024映射到右边,分辨率为1024x768