天天看點

VC學習摘要4

1、CPoint對象隻能在相應 WM_PAINT消息的時候使用,一般被用在OnPaint消息處理函數中。其在構造的時候就執行了BeginPaint得到一個dc,在析構的時候執行 了EndPaint函數釋放一個dc。CClientDC對象被用來相應其他非WM_PAINT消息時使用,在構造的時候調用GetDC得到dc,在析構 的時候調用ReleaseDC函數釋放dc。

2、win32應用程式接口 (API)使用四種坐标空間:世界坐标系空間,頁面空間,裝置空間和實體裝置空間。應用程式運用世界坐标系空間對圖形輸出進行旋轉、斜切或者反射。一般把 世界坐标系空間和頁面空間稱為邏輯空間,實體裝置空間随所獲得的dc而異,通常指應用程式視窗的客戶區,但是它也指整個桌面、完整的視窗(包括架構、标題 欄和菜單欄)或列印機的一頁或繪圖儀的一頁。實體裝置的尺寸随顯示器、列印機或繪圖儀所設定的尺寸而變化。如果要在實體裝置上繪制輸出,windows一 般是把一個矩形區域從一個坐标空間映  射到另一個坐标空間,直至最終完整的輸出呈現在實體裝置上,如果該應用程式調用SetWorldTransform函數,則映射就從應用程式的世界坐标系 空間開始,否則映射從頁面空間中開始進行。頁面空間到裝置空間的轉化所用的是兩個矩形寬和高的比例(該比例稱為轉化因子),其中頁面空間中的矩形稱為窗 口,裝置空間中的矩形稱為視口(所看到的視窗),windows把視窗圓點映射到視口圓點,把視窗範圍映射到視口範圍,就完成了這種轉。裝置空間到實體空 間的轉化僅限于平移,并由windows的視窗管理部分控制,這種轉化的唯一用途是確定裝置空間的原點被映射到實體裝置上的适當點上。一旦應用程式建立的 裝置表述表(DC),并立即開始調用GDI繪圖或輸出函數,則運用預設頁面空間到裝置空間的轉化和裝置空間到實體裝置空間(客戶區)的轉。注意在預設的情 況下,裝置空間和實體裝置空間(使用裝置坐标)的y軸是正向朝下,負y軸向上,而邏輯空間(使用邏輯坐标)則是正常的y軸正向朝上,負y軸向下。

3、邏輯坐标和裝置坐标

        幾 乎在所有GDI函數中使用的坐标值都是采用的邏輯機關。windows必須将邏輯機關轉換成裝置機關(象素)。這種轉化是由映射方式、視窗和視口的原點以 及視窗和視口的範圍所控制的。windows對所有的消息(如WM_SIZE,WM_MOUSEMOVE,WM_LBUTTONDOWN, WM_LBUTTONUP),所有的非GDI函數和少數GDI函數(如GetDeviceCaps函數)永遠使用裝置坐标。視窗是基于邏輯坐标的,邏輯坐 标可以是象素、毫米、英寸等機關;視口是基于裝置坐标(象素)的。通常,視口和實體裝置空間(客戶區)是相同的(因其一一對應)。預設的映射模式是 MM_TEXT。在這種映射模式下,邏輯機關和裝置機關相同。

        CDC中提供了兩個成員函數 SetViewportOrg和SetWindowOrg,用來設定視口和視窗原點。如果将視口原點設定為(xViewOrg,yViewOrg),則邏輯點(0,0)就會被映射為裝置點(xViewOrg,yViewOrg)。如果将視窗原點改變為(xWinOrg,yWinOrg),則邏輯點 (xWinOrg,yWinOrg)将會被映射為裝置點(0,0),即左上角。

        不管對視窗和視口原點作什麼改變,裝置點(0,0)始終是客戶區的左上角。注意OnPrepareDC會随時根據滾動視窗的位置來調整視口的原點,用函數ptVpOrg = -GetDeviceScrollPosition();獲得卷軸框上滾動塊的位置(裝置坐标y軸正向朝下),然後pDC->SetViewportOrg(ptVpOrg);函數設定視口原點(邏輯坐标y軸正向朝上)。

       CDC的LPtoDP和DPtoLP被用來作邏輯坐标系和裝置坐标系之間的互相轉換。可以任務CDC的所有成員函數都以邏輯坐标作為其參數;可以認為 CWnd的成員函數都以裝置坐标作為其參數;所有選中測試操作(如CRect::PtInRect)都應考慮裝置坐标;注意如果用裝置坐标來儲存某點的坐 标時,如果使用者對序列槽進行一下滾動,則該點的坐标就不再有效了(因為裝置坐标的(0,0)點發生了變化)。

辨析下兩個概念(以用記事本打開的一個txt檔案為例):

視窗:打開的整個txt檔案。不管滾動條如何變化,其視窗點(0,0)永遠在該檔案的第一行,第一個字元之前。

視口:你看見的目前txt檔案顯示部分。其視口(0,0)永遠在你看的的顯示檔案部分的左上角(即客戶區左上角)。

在映射中,視口原點和視窗原點如果不做改變都是(0,0)點,映射永遠是把視窗原點映射到視口原點。