<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ## 1.2 GDI+的特色 本節介紹 GDI+的幾個主要新增特性與功能,說明 GDI+在編程模式上的改變。 ### 1.2.1 GDI+新增特性 與 GDI 相比,GDI+新增的特性主要有漸變畫刷、樣條和貝塞爾曲線、持久路徑、矩陣 變換、伸縮區域、α 混色和對多種圖像格式的支持。 (1)漸變畫刷 ![image](https://box.kancloud.cn/2016-04-18_57144a7d06772.jpg) GDI+中新增加的漸變畫刷(gradient brush,梯度刷),通過提供用于填充圖形、路徑和 區域的顏色線性漸變和路徑漸變的畫刷,擴展了 GDI 的功能。漸變畫刷可用于繪制直線、 曲線和路徑,參見圖 14-4。 ![image](https://box.kancloud.cn/2016-04-18_57144a7d1bd64.jpg) a)(水平)線性漸變 b)(貝塞爾)路徑漸變 圖 14-4 漸變畫刷 圖 14-5 基樣條曲線與折線 (2)曲線方法 GDI+支持基樣條(cardinal splines)和貝塞爾(Bezier)方法,可以由若干控制點生成 光滑的曲線,參見圖 14-5。 (3)持久路徑對象 GDI 中的路徑(path)屬于設備上下文,并且會在繪制時被毀壞。而 GDI+則可以創建 并維護多個與 Graphics 對象分開的持久(persistent)路徑對象——GraphicsPath 對象,在繪 圖操作時也不會破壞,因此可多次使用同一個 GraphicsPath 對象來繪制路徑。 (4)變換和矩陣對象 GDI+提供了 Matrix(矩陣)對象,它是一種可以使(縮放、旋轉和平移等)變換(transformation)簡易靈活的強 大工具,矩 陣對象一般 與變換對 象聯合使用 。例如,GraphicsPath 對象具有 Transform 方法,此方法接收 Matrix 對象作為參數。參見圖 14-6。 (5)可伸縮區域 GDI+通過對可伸縮區域(scalable region)的支持極大地擴展了 GDI。在 GDI 中,區域 被存儲在設備坐標中,而且,可應用于區域的惟一變換是平移。而 GDI+在全局坐標中存儲 區域,并且允許區域發生任何可存儲在變換矩陣中的變換(如縮放和旋轉)。圖 14-7 顯示一 個區域在執行三種變換(縮放、旋轉和平移)前后的情況。 ![image](https://box.kancloud.cn/2016-04-18_57144a7d2b8dc.jpg) 圖 14-6 路徑變換 ![image](https://box.kancloud.cn/2016-04-18_57144a7d3dfec.jpg) 圖 14-7 區域變換 ![image](https://box.kancloud.cn/2016-04-18_57144a7d6f555.jpg) 圖 14-8 不同透明度 (6)α混色 在圖 14-7 中,可以在變換區域(用藍色陰影畫筆填充)中看到未變換區域(用紅色填充),這是由 GDI+支持的α 混色(alpha blending,透明混合)實現的。使用α 混色,可以指定填充顏色的透明度。透明色與背景色相混合———填充色越透明,透出的背景色就越多。 圖 14-8 顯示四個用相同顏色(紅色)填充、但透明層次不同的橢圓。 (7)豐富的圖像格式支持 GDI+提供 Image、Bitmap 和 Metaf ile 類,可以用不同的格式加載、保存和操作圖像。 GDI+支持 BMP、GIF、JPEG、EXIF、PNG、TIFF、ICON、WMF、EMF 共 9 種常見的圖像 格式。這些已經被 ATL/MFC 中的基于 GDI+的 CImage 類所體現。 (8)GDI+的不足 雖然,相對于 GDI 來說,GDI+確實增加了許多新特性,而且功能更強大,使用也更方 便。但是,這并不等于 GDI+就能夠完全代替 GDI。 因為 GDI+實際上是 GDI 的高層封裝和功能擴展,GDI+的執行效率一般要低于 GDI 的。 另外,GDI+不支持圖形的位運算,那么就不能進行異或繪圖等操作。而且在 Visual C++中, GDI+還不直接支持雙緩存機制(如內存 DC 和顯示 DC),這將大大影響 GDI+在高速圖形、 圖像、動畫和視頻等方面的應用。 ### 1.2.2 編程模式的改變 GDI+的出現,也使基于 GDI 的編程模式產生了很大變化:GDI+用一個“無狀態模式”, 取代了 GDI 中(需要先將各種工具和項目選入 DC 對象后,才能進行繪圖的)“狀態模式”。 主要體現在以下幾個方面: (1)DC 句柄和圖形對象 設備上下文(DC)是 GDI 中使用的一種結構,用于存儲與特定顯示設備相關的的繪制 工具及屬性的信息,用于屏幕顯示的 DC 還與特定窗口相關聯。為了使用 GDI API 進行繪圖, 必須首先獲得一個 DC 的句柄(HDC),然后將該句柄作為參數,傳遞給實際進行繪圖的 GDI 函數。在 MFC 中,DC 及其繪圖功能被封裝在 CDC 類中,DC 句柄成為了成員變量,繪圖 函數變成了方法,不再需要顯式傳遞 HDC 參數。 使用 GDI+,不需要再(直接)使用句柄或設備上下文,而是只需(通過 HDC)創建一個 Graphics 對象,然后用熟悉的面向對象方式來調用其中的各種繪圖方法,例如: ``` myGraphicsObject.DrawLine(&pen, x1, y1, x2, y2); ``` 正如 DC 是 GDI 的核心,Graphics 對象也位于 GDI+的核心。DC 和 Graphics 對象的作 用相似,但在使用設備上下文(GDI)的基于句柄的編程模式和使用 Graphics 對象(GDI+) 的面向對象的編程模型之間,存在一些基本的差異。 Graphics 對象(像 DC 一樣)與屏幕上的特定窗口關聯,并具有指定如何繪制項目的屬 性(如 SmoothingMode 和 TextRenderingHint)。但是,Graphics 對象不受筆、刷、路徑、圖 像或字體的約束,這與設備上下文不同。例如,使用設備上下文繪制線條之前,必須先調用 SelectObject 將筆選入 DC 中,以使筆對象和 DC 關聯。在設備上下文中繪制的所有線條均 使用該筆,直到選擇另一支不同的筆為止。在 GDI+中,將 Pen 對象作為參數傳遞給 Graphics 類的 DrawLine 等畫線方法。可以在一系列的 DrawLine 調用的每個調用中,使用不同的 Pen 對象,而不必將給定的 Pen 對象與 Graphics 對象關聯。 (2)畫線的兩種方法 下面每個示例都從點(20, 10)到點(200, 100)繪制一條寬為 3 的紅色線條。第一個示例調 用 GDI,第二個示例則通過托管類接口調用 GDI+,這里都使用 MFC。也可以不使用 MFC, 而直接用 API 來進行 GDI+繪圖(由于篇幅有限,這里就不介紹了)。 1)用 GDI 畫線 利用 MFC 進行 GDI 繪圖,步驟與 API 的差不多,只是 MFC 將各種 GDI 功能封裝到了 不同的類中。例如,筆的類為 CPen、點的類為 CPoint、設備上下文的類為 CDC。而且所有 的繪圖函數都被封在 CDC 類中,所以只能作為其對象的方法才能被使用,當然也就不用再 帶 HDC 句柄作為輸入參數了。 ``` CDC *pDC = GetDC(); // 獲取 DC 對象 CPen pen(PS_SOLID, 3, RGB(255, 0, 0)); // 創建筆 pDC->SelectObject(&pen); // 選筆入 DC pDC->MoveTo(20, 10); // 將當前點移到直線的起點 pDC->LineTo(200, 100); // 從當前點畫線到直線的終點 ``` 2)用 GDI+畫線 利用 MFC 進行 GDI+繪圖,步驟與 API 的差不多。只是代碼改在 OnDraw 函數中,而且獲取 DC 句柄的方法不同。 ``` CDC *pDC = GetDC(); // 獲取 DC 對象 Graphics myGraphics(pDC->m_hDC); // 利用 DC 句柄創建圖形對象 Pen myPen(Color(255, 0 , 0), 3); // 創建筆 myGraphics.DrawLine(&myPen, 20, 10, 200, 100); // 畫直線 ``` (3)作為參數的繪圖工具 前面的示例顯示:在 GDI+中,創建和維護 Pen 對象,可以與提供繪制方法的 Graphics 對象分開。同樣,創建和維護 Brush、GraphicsPath、Image 和 Font 對象也可以與 Graphics 對象分開,Graphics 類提供的許多繪制方法,都將筆、刷、路徑、圖像和字體等對象,作為 參數接收。例如,Brush 對象作為參數傳遞至 FillRectangle 方法,GraphicPath 對象作為參數 傳遞至 DrawPath 方法。同樣,Image 和 Font 對象傳遞至 DrawImage 和 DrawString 方法。 這與 GDI 不同,在 GDI 中,需要先將筆、刷、路徑、圖像或字體等 GDI 工具對象選入 DC,然后(API)將 DC 的句柄作為參數傳遞至繪制函數或(MFC)采用 CDC 類對象的函 數使用 DC 中當前的筆、刷、路徑、圖像或字體來繪圖。 (4)無當前位置 GDI+從總體上已經放棄了當前位置的概念,如在前面所述的 DrawLine 方法中線條的起 點和終點均被作為參數接收。這與 GDI 方案不同,在 GDI 中,調用 MoveToEx(hdc, x1, y1, NULL) 或 pDC-&gt;MoveTo(x1, y1)來設置當前筆位置之后,再調用 LineTo(hdc, x2 , y2) 或 pDC-&gt;LineTo(x2, y2)來繪制一條從(x1, y1)到(x2 , y2)的線條。 (5)繪制和填充的不同方法 GDI 的 Rectangle 和 Ellipse 等函數,可一步完成繪制輪廓和填充內部的功能。輪廓由當 前選定的筆繪制,而內部則由當前選定的刷來填充。GDI+則必須分別調用繪制輪廓和填充 內部的兩個不同方法來做到這一點。例如,Graphics 類的 DrawRectangle 方法將 Pen 對象作 為其參數之一,而 FillRectangle 方法將 Brush 對象作為其參數之一。所以在繪制輪廓和填充 圖形內部時,GDI+要比 GDI 更靈活,但也更麻煩。 (6)構造區域 GDI 提供幾種用于創建區域的 函數(在 MFC 中,它們被 封裝在 CRng 類里): CreateRectRgn 、 CreateEllpticRgn 、 CreateRoundRectRgn 、 CreatePolygonRgn 和 CreatePolyPolygonRgn。您或許希望 GDI+中的 Region 類也有類似的構造函數,將矩形、橢 圓、圓角矩形和多邊形作為參數接收,但事實并非如此。GDI+中的 Region 類提供一個接收 Rectangle 對象的構造函數和另一個接收 GraphicsPath 對象的構造函數。如果想基于橢圓、 圓角矩形或多邊形構造區域,可以通過創建一個 GraphicsPath 對象(可包含橢圓的對象等), 然后將其傳遞至 Region 構造函數來輕松實現。 GDI+通過組合圖形和路徑,使得構成復雜區域十分簡單。Region 類具有 Union 和 Intersect 方法,可用于擴展具有路徑的現有區域或其它區域。GDI+方案一個很好的功能就是 GraphicsPath 對象在作為參數傳遞至 Region 構造函數時不會被破壞(在 GDI 中,可以使用 PathToRegion 方法將路徑轉換為區域,但在此過程中,路徑將被破壞)。另外,GraphicsPath 對象在作為參數傳遞給 Union 或 Intersect 方法時也不會被破壞,因此,在一些單獨的區域中, 可以將給定的路徑作為構造塊使用。例如: ``` Region region1(rect1); Region region2(rect2); region1.Union(onePath); region2.Intersect(onePath); ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看