日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

理解SetWindowOrg,SetViewportOrg,SetWindowExt,SetViewportExt

發布時間:2025/3/21 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 理解SetWindowOrg,SetViewportOrg,SetWindowExt,SetViewportExt 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

按習慣,(0,0)就原點,原點就是(0,0),但是如果用此來理解windows的map mode,就會走彎路。其實,稍微改變一下觀念,windows的map mode就比較好理解了。舉例說明:page space---->device spacepDC->SetMapMode(MM_LOMETRIC);pDC->SetWindowOrg(40,0); //這句“設定”page space的原點為(40,0),注意,//這時(40,0)就是原點,原點就是(40,0)這個點,其實,(0,0)與原點沒有必然聯系。這//一句對下面的畫圖函數在page space中所作的圖不會有任何影響。一句話:SetWindowOrg //就是指定一下,page space中哪個點為原點。pDC->Rectangle(0,0,100,-100);pDC->Rectangle(0,-100,50,-200);同理,SetViewportOrg也是指定一下,device space中哪個點為原點,兩個坐標系映射時,兩個原點重合。SetWindowExt設定page space的大小,SetViewportOrg設定device space的大小,其實,真正有意義的只是兩者的比例關系,例如,在一個1024*768的顯示屏上:pDC->SetMapMode(MM_ISOTROPIC);pDC->SetWindowExt(10240,7680);pDC->SetViewportExt(1024,768);pDC->Rectangle(0,0,100,100); 就會畫一個10 pixels*10 pixels的矩形。其本質就是,X方向,每個邏輯單位有1024/10240個象素,Y方向每個邏輯單位有768/7680個象素。因此,下面的代碼有相同的作用:pDC->SetMapMode(MM_ISOTROPIC);pDC->SetWindowExt(102400,76800);pDC->SetViewportExt(10240,7680);pDC->Rectangle(0,0,100,100);兩者本質一樣,前者更易于理解?
?
?
最近突然又很有激情的開始看Jeff Prosise的那本"Programming Windows with MFC, 2 ed."。盡管是英文版的,但是感覺這本書上手比喉結的那本所謂的 深入淺出MFC 要容易理解的多。候同學給人一種故弄玄虛故作深沉的感覺,而Jeff Prosise的這本書才真正的稱得上是深入淺出。
盡管如此,其中有關GDI繪圖中的坐標映射部分還是有一個問題沒有搞清楚,那就是SetWindowOrg和SetViewportOrg這兩個函數到底應該如何理解。潘愛民翻譯的那本VC內幕沒有講清楚;Jeff Prosise的這本書沒有講清楚;MSDN上的東西看的也是一頭霧水;Charles Petzold的那本書還沒有來得及看。因為這個問題,昨天晚上是帶著遺憾的困惑入睡的。
總的來說,我對這兩個函數的理解導致的結果是與實際程序運行的結果截然相反。依據MSDN上的解釋,有一個很嚴重的問題沒有闡述清楚,那就是:所謂的SetWindowOrg(x, y)函數,到底是表示set window origin to (x, y)還是set window origin as (x, y);to和as在執行的時候,其操作的效果是截然相反的。
set window origin to (x, y)表示將坐標原點設置到(x, y);即以(x, y)作為坐標原點,此時原點坐標不再為(0, 0);set window origin as (x, y)表示將原來的原點(0, 0)的坐標改為(x, y);即將所有點的坐標增加(+x, +y);
現在我的理解是:應該是 set window origin to (x, y)。這種理解基于以下幾個前提:1. 所有繪圖語句中給出的坐標,全部是邏輯坐標,即在 window 中的坐標(相對于viewport所表示的設備坐標而言);2. 所有用戶能看到的點,其設備坐標一定是位于(0, 0)和(1024, 768)范圍內;(假設顯示器為輸出設備,采用MM_TEXT映射方式,且屏幕分辨率為1024*768);3. 所謂“(0,0)就原點,原點的坐標一定就是(0,0)”這種理解,是錯誤的;4. Viewport中的坐標表示設備坐標;Window中的坐標表示邏輯坐標;5. 當在邏輯坐標中指定新的原點后,在執行映射時,設備坐標的原點一定要與邏輯坐標的新原點重合;反過來也是一樣,即兩個坐標系的原點一定要重合。
下面舉例說明:(MM_TEXT映射模式)
(1)CRect rect(0, 0, 200, 200);dc.rectangle(rect);上面的語句在屏幕的最左上角繪制一個正方形;(因為此時邏輯坐標與設備坐標沒有偏移)
(2)dc.SetViewportOrg(100, 100);CRect rect(0, 0, 200, 200);dc.rectangle(rect);將設備坐標的原點設置到(100, 100);即設備坐標的原點不在(0, 0)處,而是在(100, 100)處;此時若執行映射的話,邏輯坐標的原點(0, 0)需要與設備坐標的原點(100, 100)重合(參考前提5);那么此時繪制的矩形(0, 0, 200, 200)的坐標(為邏輯坐標,參考前提1)在設備坐標中就會映射為(100, 100, 300, 300),最終我們在顯示器上看到的會是一個向右下方偏移(100, 100)的一個邊長為200的正方形(用戶看到的點是在設備坐標中的,參考前提2)
(3)dc.SetWindowOrg(100, 100);CRect rect(0, 0, 200, 200);dc.rectangle(rect);將邏輯坐標的原點設置到(100, 100);即邏輯坐標的原點不在(0, 0)處,而是在(100, 100)處;此時若執行映射的話,設備坐標的原點(0, 0)需要與邏輯坐標的原點(100, 100)重合(參考前提5);那么此時繪制的矩形(0, 0, 200, 200)的坐標(為邏輯坐標,參考前提1)在設備坐標中就會映射為(-100, -100, 100, 100),最終我們在顯示器上看到的會是一個只有1/4個大小的矩形的一部分(事實上相當于向左上方偏移(100, 100)的一個邊長為200的正方形。注意:用戶看到的點是在設備坐標中的,參考前提2)
---------------------?
作者:benny5609?
來源:CSDN?
原文:https://blog.csdn.net/benny5609/article/details/1845645?
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

總結

以上是生活随笔為你收集整理的理解SetWindowOrg,SetViewportOrg,SetWindowExt,SetViewportExt的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。