Winapi 在GDI win32中从左上角0,0到左下角0,0

Winapi 在GDI win32中从左上角0,0到左下角0,0,winapi,coordinate-systems,Winapi,Coordinate Systems,如何将窗口中的坐标从0,0左上角变换为0,0左下角 我用 SetMapMode(hdc,MM_文本), SetViewportExtEx(hdc,0,-clientrect.bottom,NULL) SetViewPortOrgEx(hdc,0,-clientrect.bottom,NULL) SetWindowOrgEx(hdc,0,-clientrect.bottom,NULL) SetWindowExtEx(hdc,0,-clientrect.bottom,NULL) 我甚至尝试过谷歌的解

如何将窗口中的坐标从0,0左上角变换为0,0左下角

我用
SetMapMode(hdc,MM_文本)
SetViewportExtEx(hdc,0,-clientrect.bottom,NULL)
SetViewPortOrgEx(hdc,0,-clientrect.bottom,NULL)
SetWindowOrgEx(hdc,0,-clientrect.bottom,NULL)
SetWindowExtEx(hdc,0,-clientrect.bottom,NULL)
我甚至尝试过谷歌的解决方案,但没有成功,所以我求助于互联网上更有经验的人

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

我使用的是win32 api,我想我可以跳过代码,因为屏幕坐标系在所有系统上几乎都是相同的,我的意思是,如果您将其保留为标准2d窗口和帧,则0,0在屏幕上“始终”位于左上角

我真的不想要一个完整的代码样本来减轻你们打字的痛苦,但我想要一些指导,因为我似乎无法理解在win32 api中翻转坐标的简单概念

谢谢,圣诞快乐

编辑

我想补充我自己对这个问题的答案,因为我用简单的数学来扭转这种观点


例如,如果我得到一个值对x,y(150,57)和另一个值对x,y(100,75),那么我使用了这个公式
height+(-1*y)
,瞧,我得到了一个合适的笛卡尔坐标域:)当然,在这个例子中,高度是未定义的变量,但在我的应用程序中,它的高度是200px,您通常希望使用它或
SetWindowOrgEx
,但不能同时使用两者。也就是说,您可能希望视口原点为
(0,clientrect.bottom)
,而不是
-clientrect.bottom

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

请参见上的示例。有关转换的一般信息:

其他信息:

我没有在直接的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函数进行缩放

还请注意,报告中说:

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

  • 嗯(HIENGLISH)
  • MM_Himmetric
  • MM_LOENGLISH
  • 毫米计量
  • MM_文本
  • MM_TWIPS

我应该提到的是,我不仅同时尝试了两种方法,而且两种方法都尝试过。通过使用您的解决方案,我仍然会遇到一个问题,即我需要否定所有向上的值,因此我使用了-clientrect.bottom,正如我从MSDN中了解到的那样。谢谢Jim Mischel,我将继续我单调乏味的想法,因为它应该会起作用。我不会使用GDI+,因为我很固执,老实说,我会打自己的脚:)祝你圣诞快乐。