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

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ## 1.3 GDI+的 MFC 編程 本節介紹利用 MFC 進行 GDI+編程的必要的準備,并通過例子說明 GDI+編程的具體步 驟,最后給出如何解決存在的 new 操作符問題的方法。 C++封裝的 GDI+的(英文)幫助內容,位于 VS08 的“目錄/Win32 和 COM 開發/Graphics and Multimedia/GDI+”,主要的參考資料位于其子目錄“GDI+ Reference”中。 ### 1.3.1 設置與初始化 封裝了 GDI+ API 的各種 C++類、函數、常量、枚舉和結構,都被定義在 Gdiplus.h 頭 文件所包含的一系列頭文件中。所以,采用 MFC 進行 GDI+編程,必須包含 Gdiplus.h 頭文 件。 從 14.1.2 的有關 GDI+平面 API 的討論可知,封裝在 GDI+類中方法,最后都需要調用GDI+平面 API 中的相關底層函數,才能完成實際的操作。所以,為了運行 GDI+應用程序,在操作系統平臺中,必須安裝動態鏈接庫 Gdiplus.dll。對 Windows XP 及以上版本,該 DLL已經自動被操作系統包含。 該動態鏈接庫所對應的靜態庫文件為 GdiPlus.lib,而且它在 VC08 及之前的早期版本中 不是 C++和 MFC 的默認鏈接庫。所以,對早期的 VC 版本必須在項目設置,添加該庫作為 鏈接器輸入的附加依賴項。但是對 VC08 SP1 及 VC10,該庫已經成為標準鏈接庫之一,不 必再為鏈接器輸入的附加依賴項添加此庫。 因為在 Gdiplus.h 頭文件中,將所有的 GDI+的類、函數、常量、枚舉和結構等都定義在 了命名空間 Gdiplus 中。所以,一般在 GDI+程序中,都應該使用如下的命名空間聲明: ``` using namespace Gdiplus; ``` (1)VC 中的設置 為了在 MFC 應用程序中能使用 GDI+,必須包含 GDI+頭文件、使用 GDI+命名空間。 對 VC08 及之前的版本,還要為項目添加 GDI+鏈接庫。 1) 包含頭文件、使用命名空間——在要使用 GDI+的文件(如視圖類的頭文件或代碼 文件)頭部包含 GDI+的頭文件: ``` #include &lt;gdiplus.h&gt; ``` 并加上使用 GDI+命名空間的 using 指令(區分大小寫,注意首字母大寫): ``` using namespace Gdiplus; ``` 2) 添加鏈接庫(對 VC08 SP1 及 VC10 不必添加)——在 VS08 及其早期版本中,選 “項目/*屬性”菜單項,打開項目的屬性頁窗口,先選“所有配置”,再選“配置 屬性/鏈接器/輸入”項,在右邊上部的“附加依賴項”欄的右邊,鍵入 GdiPlus.lib(參見圖 14-9)后按“應用”鈕,最后按“確定”鈕關閉對話框。 (2)GDI+的初始化與清除 為了在 MFC 應用程序中使用采用 C++封裝的 GDI+ API,必須在 MFC 項目的應用程序 類 中 , 調 用 GDI+ 命 名 空 間 中 的 GDI+ 啟 動 函 數 GdiplusStartup 和 GDI+ 關 閉 函 數 GdiplusShutdown,來對 GDI+進行初始化(裝入動態鏈接庫 Gdiplus.dll,或鎖定標志+1)和 清除(卸載動態鏈接庫 Gdiplus.dll,或鎖定標志-1)工作。它們一般分別在應用程序類的InitInstance 和 ExitInstance 重載方法中調用。 ![image](https://box.kancloud.cn/2016-04-18_57144a7d82d90.jpg) 圖 14-9 在項目屬性對話框中添加靜態鏈接庫 函數 GdiplusStartup 和 GdiplusShutdown,都被定義在 GdiplusInit.h 頭文件中: ``` Status WINAPI GdiplusStartup( OUT ULONG_PTR *token, const GdiplusStartupInput *input, OUT GdiplusStartupOutput *output); void GdiplusShutdown(ULONG_PTR token); ``` 其中: 類型 ULONG_PTR,是用無符號長整數表示的指針,被定義在 basetsd.h 頭文件中: ``` typedef _W64 unsigned long ULONG_PTR; ``` 輸出參數 token(權標),供關閉 GDI+的函數使用,所以必須設置為應用程序類的 成員變量(或全局變量,不提倡)。 結構 GdiplusStartupInput 和 GdiplusStartupOutput,都被定義在 GdiplusInit.h 頭文件中。 GDI+啟動輸入結構指針參數 input,一般取默認構造值即可,即(設:無調 試事件回調過程、不抑制背景線程、不抑制外部編解碼): ``` input = GdiplusStartupInput(NULL, FALSE, FALSE); ``` GDI+啟動輸出結構指針參數 output,一般不需要,取為 NULL 即可。 注意,采用 MFC 進行 GDI+ API 編程時,在使用任何 GDI+的功能調用之前,必須先調用 GDI+啟動函數 GdiplusStartup 來進行初始化 GDI+的工作;在完成所有的 GDI+功能調用 之后,必須調用 GDI+關閉函數 GdiplusShutdown 來進行清除 GDI+的工作。 (3)過程框圖 圖 14-10 是使用 MFC 進行 GDI+編程的設置、準備與初始化過程的邏輯框圖。 ![](https://box.kancloud.cn/2016-04-18_57144a7d98257.png) 圖 14-10 GDI+的設置、準備與初始化 ### 1.3.2 編程例子 下面通過一個簡單的例子,來說明如何使用 GDI+進行應用程序開發。 (1)創建和設置 創建一個名為 Gdip 的傳統界面 MFC 單文檔應用程序項目,在應用程序類和視圖類的CPP 代碼文件中,包含頭文件并使用命名空間: ``` #include <gdiplus.h> using namespace Gdiplus; ``` 對 VC08 及之前的版本還需在項目屬性中添加鏈接庫 GdiPlus.lib。 (2)初始化與清除 然后再進行 GDI+系統的初始化,這需要在應用程序類 CGdipApp 中聲明一個成員變量: ``` ULONG_PTR m_gdiplusToken; // ULONG PTR 為 int64 類型 并在該類的初始化函數 CGdipApp::InitInstance()中加入以下代碼來對 GDI+進行初始化: GdiplusStartupInput gdiplusStartupInput; GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL); ``` 注意:這兩個語句必須加在應用程序類的 InitInstance 函數中的 ``` CWinApp::InitInstance(); ``` 語句之前,不然以后會造成視圖窗口不能自動重畫、程序中不能使用字體等等一系列問題。 還要在 CGdipApp::ExitInstance()中加入以下代碼來關閉 GDI+: ``` GdiplusShutdown(m_gdiplusToken); ``` 上面的 InitInstance 和 ExitInstance 都是應用程序類的重寫型方法。而且,默認時 VC08 SP1 及其以前版本是不會自動生成 ExitInstance 方法代碼的(不過 VC10 會自動生成此方法),需 要自己利用屬性窗口來添加(不要手工添加)。 (3)繪圖 接下來就可以利用 GDI+進行繪圖了。下面的代碼段是在 OnDraw 函數中畫一個帶網格 的透明度連續變化的圖: ``` CGdipView::OnDraw(CDC* pDC) { …… Graphics graph(pDC-&gt;m_hDC); // 創建圖形對象 Pen bluePen(Color(0, 0, 255)); // 創建藍色筆 Pen redPen(Color(255, 0, 0)); // 創建紅色筆 int y = 255; // y 的初值 for (int x = 0; x &lt; 256; x += 5) { // 繪制紅藍網線 graph.DrawLine(&bluePen, 0, y, x, 0); graph.DrawLine(&redPen, 255, x, y, 255); y -= 5; } // 畫一組綠色透明度垂直漸變的水平線(填滿正方形) for (y = 0; y &lt; 256; y++) { Pen pen(Color(y, 0, 255, 0)); // α 隨 y 變的綠色筆 graph.DrawLine(&pen, 0, y, 255, y); } // 畫一組品紅色透明度水平漸變的垂直線(填滿扁矩形) for (int x = 0; x &lt; 256; x++) { Pen pen(Color(x, 255, 0, 255)); // α 隨 x 變的品紅色筆 graph.DrawLine(&pen, x, 100, x, 200); } } ``` 運行的結果如圖 14-11 所示。其中,左圖為第一個循環所繪制的結果、中圖為前兩個循 環所繪制的結果、右圖為全部三個循環所繪制的結果。 ![image](https://box.kancloud.cn/2016-04-18_57144a7db42f7.jpg) ![image](https://box.kancloud.cn/2016-04-18_57144a7dc809d.jpg) ![image](https://box.kancloud.cn/2016-04-18_57144a7dd93bb.jpg) 圖 14-11 透明度的連續變化 ### 1.3.3 new 問題 在 VC08(包括 SP1)中使用 GDI+時,不能用 new 來動態創建 GDI+對象。解決辦法有 如下兩種: (1)修改 GdiplusBase 類 打開(默認)位于“C:\Program Files\Microsoft SDKs\Windows\v6.0A\ Include\”目錄中 的 Gdiplus Base.h 頭文件,并注釋掉里面 Gdiplus Base 類的內容(該類其實只含 new、new[]、 delete 和 delete[]這四個運算符的重載),使其成為一個空類(但不要刪除整個類)。 為了不修改原始安裝目錄中的 Gdiplus Base.h 頭文件,可以: + 將該頭文件復制到你的項目目錄中。 + 注釋掉該頭文件里面 Gdiplus Base 類的內容(保留類定義)。 + 在項目中所有的#include <gdiplus.h>語句之前,包含"Gdiplus Base.h"頭文件,形如: ``` #include "gdiplusBase.h" #include &lt;gdiplus.h&gt; ``` + 則編譯系統會優先包含項目目錄中的 gdiplus Base.h 頭文件,從而屏蔽掉原來位于 平臺 SDK 的 Include 目錄中的同名頭文件。 (2)用&代替 new 也可以在有些使用 new 的地方改用&,例如將代碼 Pen *pPen = **new** Pen(Color::Red); 改 為 Pen *pPen = **&**Pen(Color::Red);。
                  <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>

                              哎呀哎呀视频在线观看