【问题标题】:From TopLeft 0,0 to BottomLeft 0,0 in GDI win32GDI win32中从TopLeft 0,0到BottomLeft 0,0
【发布时间】:2012-01-10 04:15:28
【问题描述】:

如何将窗口中的坐标从左上角 0,0 更改为左下角 0,0。

我尝试了各种解决方案
SetMapMode(hdc,MM_TEXT);,
SetViewportExtEx(hdc,0,-clientrect.bottom,NULL);
SetViewPortOrgEx(hdc,0,-clientrect.bottom,NULL);
SetWindowOrgEx(hdc,0,-clientrect.bottom,NULL);
SetWindowExtEx(hdc,0,-clientrect.bottom,NULL);
我什至尝试 google 寻求解决方案,但没有成功,所以我求助于互联网上更有经验的人。

我的想法是我正在为线性插值创建一个自定义控件,我可以通过右上角的 x,y 反转坐标系,但我希望它是正确的。目前,当我尝试绘制它时,我得到了一个反向线性插值,因为我无法让坐标位于左下角。

我正在使用 win32 api,我怀疑我可以跳过代码,因为屏幕坐标系在所有系统上几乎相同,我的意思是 0,0 是“始终”在屏幕上的左上角,如果你保留它到标准的二维窗口和框架。

我真的不想要一个完整的代码示例来减轻你们打字的痛苦,但我想要一些方向,因为我似乎无法掌握在 win32 api 中翻转坐标的简单概念。

谢谢,圣诞快乐

编辑!

我想为这个问题添加我自己的答案,因为我使用简单的数学来反转观点。

例如,如果我得到了值对 x,y (150,57) 和另一对 x,y (100,75),那么我使用了这个公式 height + (-1 * y),瞧,我得到了一个正确的笛卡尔坐标字段 :) 当然在此示例中,高度是未定义的变量,但在我的应用程序中,其高度为 200 像素。

【问题讨论】:

    标签: winapi coordinate-systems


    【解决方案1】:

    根据SetViewportOrgEx 的文档,您通常希望使用它或SetWindowOrgEx,但不能同时使用。也就是说,您可能希望视口原点为(0, clientrect.bottom),而不是-clientrect.bottom

    使用 GDI 设置变换总是让我抓狂。我认为你最好使用 GDI+。使用它,您可以创建一个矩阵来描述(0, clientRect.bottom) 的平移和(1.0, -1.0) 的缩放。然后你可以拨打SetWorldTransform

    参见Using Coordinate Spaces and Transformations 的示例。有关转换的一般信息:Coordinate Spaces and Transformations

    附加信息:

    我没有尝试过直接调用 Windows API,但如果我在 C# 中使用 Graphics 类(它是 GDI+ 的包装器)执行以下操作,它可以工作:

    Graphics g = GetGraphics();  // gets a canvas to draw on
    SetTranslateTransform(0, clientRect.Bottom);
    SetScaleTransform(1.0f, -1.0f);
    

    这将原点放在左下角,x 向右增加,y 随着您的上升而增加。如果你按照我的建议使用SetWorldTransform,上面的方法对你有用。

    如果您必须使用 GDI,那么您需要使用SetViewportOrgEx(0, clientRect.bottom),然后设置缩放。我不记得如何使用旧的 GDI 函数进行缩放。

    还要注意documentation for SetViewportExtEx 说:

    当设置了以下映射模式时,调用 SetWindowExtEx 和 SetViewportExtEx 函数被忽略。

    • MM_HIENGLISH
    • MM_HIMETRIC
    • MM_LOENGLISH
    • MM_LOMETRIC
    • MM_TEXT
    • MM_TWIPS

    【讨论】:

    • 我应该提到我尝试了严格的解决方案,不仅同时尝试了两种解决方案,而且我确实尝试了两种解决方案。通过使用您的解决方案,我仍然会遇到一个问题,即我需要否定所有值才能向上,因此我使用了 -clientrect.bottom,正如我从 MSDN 所了解的那样。
    • 谢谢吉姆·米歇尔,我将继续我那乏味的愚蠢的想法,因为它应该可以工作。老实说,我不会使用 GDI+,因为我很固执,而且会朝自己的脚开枪 :) 圣诞快乐。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-15
    • 2017-09-15
    • 1970-01-01
    相关资源
    最近更新 更多