【问题标题】:The legacy device context is too coarse遗留设备上下文太粗略
【发布时间】:2011-01-02 15:19:10
【问题描述】:

我有一个过程控制系统。它有一个巨大的 2D 工作区,所有逻辑都在其中布局。 2D 工作空间是一个坐标系。 您通常不会一次看到整个工作区,而是其中一些放大的部分专注于受控过程的某些部分。此类子系统视图被标记为预定义的命名图像(发电机 1、柴油发电机、主润滑泵等)。

此工作区与许多旧版 MFC 软件组件交互,这些组件单独将图形贡献到工作区(设备上下文传递给所有贡献者)。

现在,其中一个软件组件将 AutoCAD 绘图渲染到表面上。但是,设备上下文的分辨率对于这项工作的细节来说是不够的。不幸的是,设备上下文逻辑分辨率是由我们自己的坐标系决定的,在高缩放级别下,它与设备单位(像素)完全不同。 例如,使用

绘制的线
DC.MoveTo(1,1); 
DC.LineTo(1,2);

.... 实际上,即使它只是通过增加一个逻辑单元直接绘制到设备上下文上,也会在屏幕上覆盖相当长的距离。但是线的宽度仍然只有一个设备像素。圆看起来很高分辨率,但它的数据(中心点和半径)只能以粗略的增量完成。

我考虑了以下选项: * 加载和显示预定义图像时,创建具有更合适分辨率的设备上下文。那么问题将是其他图形提供者使用旧的逻辑单元与其交互,当用于新的 DC 时会导致图形元素太小和移位。

  • 我想知道我是否可以创建一些 DC 包装器,通过不同的 API 接受这两种坐标,然后在内部将其转换为高分辨率坐标。

  • 是否可以有两个具有不同逻辑/设备单元比率的 DC?并将它们都渲染到屏幕上?

我提到过一个像素的宽度可以很好地渲染一个圆,即使它的位置和半径受到限制。垂直线也被渲染得很漂亮,即使端点只能在粗坐标中给出。这让我相信,在 DC 逻辑坐标中只能用小数描述的区域在技术上是可行的。

有人知道该怎么做吗?

【问题讨论】:

    标签: c++ winapi graphics mfc gdi


    【解决方案1】:

    您需要缩放模型,而不是设备上下文。

    【讨论】:

    • 感谢您的回复。设备上下文绝对应该具有由显示的地理模型区域决定的逻辑分辨率。问题是所有其他遗留组件对公共 DC 的遗留使用,这是相当少数的。我正在寻找一种解决方案,以最大限度地减少对其他组件的绘图逻辑的影响。我正在考虑制作包装高分辨率 DC 的 DC 包装器,旧 API 仍然接受粗略的模型坐标,但添加了支持小数的重载。仍然会有舍入错误,但要少得多。
    【解决方案2】:

    您可以在新窗口中将高清图像绘制到另一个 DC,然后将该窗口放在您的低分辨率绘图上。当然,你必须自己处理剪辑。

    【讨论】:

    • 透明度怎么样?各种组件提供不同的元素类型(一种提供静态文本,一种提供过程符号,一种提供实时数据)。这些元素无处不在,并且可以重叠(符号内的测量等)。它们是原语,而不是单独的控件。一个高分辨率 DC 能否在另一个的渲染之上透明地绘制?
    • 使用 BitBlt-ing 可以实现透明度,但这会留下 z 顺序的问题。在这种情况下,您编写一个将低分辨率坐标转换为高分辨率的特殊 DC 的想法对我来说听起来更好。你用的是 MM_LOMETRIC 和 MM_HIMETRIC 还是其他的?
    • 我不这么认为。我假设映射模式是“文本”。事实上,我从来没有摆弄过这个。有什么适合我的吗?
    • 这里是一些关于映射模式的信息:msdn.microsoft.com/en-us/library/hzy9cbxf%28VS.80%29.aspx
    猜你喜欢
    • 1970-01-01
    • 2014-09-05
    • 2014-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    相关资源
    最近更新 更多