C++ 旧设备上下文太粗糙

C++ 旧设备上下文太粗糙,c++,winapi,graphics,mfc,gdi,C++,Winapi,Graphics,Mfc,Gdi,我有一个过程控制系统。它有一个巨大的2D工作空间,所有的逻辑都在这里布置。 二维工作空间是一个坐标系。 您通常不会一次看到整个工作区,而是会看到其中一些放大的部分,重点关注受控流程的某些部分。这些子系统视图被添加到预定义的命名图像中(发电机1、柴油发电机、主润滑泵等) 此工作区与许多遗留MFC软件组件交互,这些组件分别向工作区贡献图形(设备上下文传递给所有贡献者) 现在,其中一个软件组件将AutoCAD图形渲染到曲面上。但是,设备上下文的分辨率不足以显示此作业的详细信息。不幸的是,设备上下文逻辑

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

此工作区与许多遗留MFC软件组件交互,这些组件分别向工作区贡献图形(设备上下文传递给所有贡献者)

现在,其中一个软件组件将AutoCAD图形渲染到曲面上。但是,设备上下文的分辨率不足以显示此作业的详细信息。不幸的是,设备上下文逻辑分辨率是由我们自己的坐标系决定的,在高缩放级别下,坐标系与设备单位(像素)大不相同。 例如,使用

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

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

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

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

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


有人知道该怎么办吗

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

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

谢谢您的回复。设备上下文绝对不应具有由显示的地理模型区域决定的逻辑分辨率。问题是所有其他遗留组件对公共DC的遗留使用,这是非常少的。我正在寻找一个解决方案,最大限度地减少对其他组件的绘图逻辑的影响。我正在考虑制作包装高分辨率DC的DC包装器,遗留API仍然接受粗略的模型坐标,但添加支持小数的重载。仍然会有舍入误差,但要少得多。透明度如何?不同的组件提供不同的元素类型(一个提供静态文本,一个提供过程符号,一个提供实时数据)。这些元素到处都是,可以重叠(符号内的测量等)。它们是基本体,而不是单独的控件。一个高分辨率DC可以在另一个的渲染上透明地绘制吗?使用BitBlt可以实现透明性,但这留下了z顺序的问题。在这种情况下,你写一个特殊的DC将低分辨率坐标转换成高分辨率的想法对我来说更合适。你们用MM_LOMETRIC和MM_HIMETRIC还是其他的?我不这么认为。我假设映射模式是“文本”。事实上,我从来没有摆弄过。有什么适合我的吗?以下是有关映射模式的一些信息: