【问题标题】:C# Scaling GDI positions but not font size or line thicknessC# 缩放 GDI 位置,但不缩放字体大小或线条粗细
【发布时间】:2010-12-03 06:19:14
【问题描述】:

我需要在间距为 12.5 像素 X 和 20 像素 Y(PICA 比例)的网格上进行大量绘图。字体需要具有特定的大小,并且线条仍然需要一个像素厚。目前,我将这些值保存在浮点数中并将它们相乘(例如,从第 3 行第 6 列开始的文本绘制为坐标 2f*cx,5f*cy)。我想通过使用比例变换来避免所有这些不必要的乘法,但不幸的是,这些也会影响字体大小和线条粗细。有没有办法避免这种情况?还是编译器会默默地为我做这件事,因为 cx/cy 值是常量?

【问题讨论】:

    标签: c# gdi+


    【解决方案1】:

    ...此外,如果您不想缩放线条,Microsoft 会为我们留下一点“技巧”。将线的宽度设置为0px,它总是会画一个像素宽。

    【讨论】:

    • 哇。我不知道。这很整洁。
    • 这太棒了,你是一个腿端。
    【解决方案2】:

    编译器应该将表达式的常量部分减少为单个常量,但是在运行时仍然必须进行乘法运算,因为在编译时您的浮点值是未知的。因此,如果 c 是常量,编译器可以将 (1 + 2 + c) * 6 * f 简化为 n * f。

    防止文本缩放的最佳选择可能是设置缩放变换,绘制所有您不关心保持最小线宽的非文本图形,然后在不使用变换的情况下绘制文本。您可以使用转换来定位文本应该开始的位置,从而不必独立计算 - 像 LPtoDP(逻辑点到设备点)这样的函数应该可以解决问题。

    解决此问题的另一种方法是在转换中渲染文本,但对文本大小本身应用反向缩放。因此,如果变换缩小 5%,则将字体大小放大 5%。这不会给出准确的结果,但可能足够接近视觉效果。

    【讨论】:

    • 图形类中是否有 LPtoDP 函数,还是我必须自己制作?有很多文本输出,但我希望它尽可能快(它实际上属于 OnPaintBackground)并且纵横比不是 1:1,所以我认为反向缩放不是一个好的选择。跨度>
    • LPtoDP 是一个 Win32 GDI API 函数。 .NET 图形类中可能有类似的,不确定。
    猜你喜欢
    • 1970-01-01
    • 2015-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-04
    • 2013-07-29
    • 1970-01-01
    • 2021-08-22
    • 2013-03-20
    相关资源
    最近更新 更多