2011-12-21 34 views
0

我怎樣才能改變窗口中的座標從0,0變爲0,0 bottomleft。從TopLeft 0,0到BottomLeft 0,0在GDI win32

我已經嘗試了各種解決方案與
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);
我甚至曾嘗試谷歌的解決方案,但沒有佔上風,所以我轉交給你更有經驗的人在網上。

這個想法是我創建了一個線性插值的自定義控件,我可以通過右上角的x,y來反轉座標系,但我希望它是正確的。此刻,當我嘗試繪製它時,我得到了一個反向線性插值,因爲我無法使座標左下角。

我使用的是win32 api,我懷疑我可以跳過代碼,因爲屏幕座標系在所有系統上幾乎是相同的,因此我的意思是0,0在屏幕上始終保持「始終」它標準的2D窗口和框架。

我真的不想讓整個代碼樣本緩解你們打字痛苦,但我想要一些方向,因爲我似乎無法理解在win32 API中翻轉coords的簡單概念。

感謝和聖誕快樂

編輯!

我想加我自己的回答這個問題,因爲我用簡單的數學顛倒視圖這麼說。

如果舉一個例子,我得到了valuepair x,y(150,57)和另一對x,y(100,75)然後我用這個公式height + (-1 * y)和瞧,我得到了一個正確的笛卡爾座標字段:) ofcourse in這個例子的高度是未定義的變量,但在我的應用程序中它的高度爲200px。

回答

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試過,但使用Graphics類(這大約是GDI +的包裝),它工作在C#中,如果我做到以下幾點:

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
+0

我應該提到,我試圖severeal解決方案不是在同一只兩,但我確實都嘗試過。通過使用你的解決方案,我仍然有一個問題,我需要否定所有值向上,因此我使用了-clientrect.bottom,正如我從MSDN瞭解的。 – 2011-12-22 10:47:44

+0

@ OMG-1:查看我的附加信息。 – 2011-12-22 15:30:55

+0

謝謝Jim Mischel,我會繼續我沉悶而愚蠢的想法,因爲它應該是有效的。我不會使用GDI +,因爲我很固執,並會在腳下開槍,說實話:)祝你聖誕快樂。 – 2011-12-22 23:24:02