Winapi 在GDI win32中从左上角0,0到左下角0,0
如何将窗口中的坐标从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) 我甚至尝试过谷歌的解
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+,因为我很固执,老实说,我会打自己的脚:)祝你圣诞快乐。