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

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 5.2 繪畫工具 在wxWidgets中,繪畫操作就象是一個技術非常高超的藝術家,快速的選擇顏色,繪畫工具,然后畫場景的一小部分,然后換不同的顏色,不同的工具,再繪畫場景的其它部分,周而反復的操作。因此,接下來我們來介紹一下wxColour,wxPen, wxBrush, wxFont和wxPalette這些繪畫工具。還有其它的一些內容也是有幫助的,比如wxRect,wxRegion,wxPoint和wxSize,我們會在第13章,?數據結構類?中對它們進行介紹。 注意這些類使用了?引用記數?的方法,使用內部指針以避免大塊的內存拷貝,在大多數情況下,你可以直接以局部變量的方式定義顏色,畫筆,畫刷和字體對象而不用擔心性能。如果你的程序確實因此而擁有性能上的問題,你才需要考慮采取一些方法來提高性能,比如將其中的一些局部變量改變成類的成員。 wxColour 你可以使用wxColour類來定義各種各樣的顏色。(因為wxWidgets開始于愛丁堡,它的API使用英式拼寫,不過對于那些對拼寫很敏感的人,wxWidgets還是給wxColor定義了一個別名wxColour)。 你可以使用SetTextForeground和SetTextBackground函數來定義一個設備上下文中文本的顏色,也可以使用wxColour來創建畫筆和刷子。 wxColour對象有很多種創建方法,你可以使用RGB三元色的值(0到255)來構建wxColour,或者通過一個標準的字符串,比如WHITE或者CYAN,或者從另外一個wxColour對象創建。或者你還可以直接使用系統預定的顏色對象指針: wxBLACK, wxWHITE, wxRED, wxBLUE, wxGREEN, wxCYAN,和 wxLIGHT_GREY.還有一個wxNullColour對象用來代表未初始化的顏色,它的Ok函數總是返回False。 使用wxSystemSettings類可以獲取很多系統默認的顏色,比如3D表面顏色,默認的窗口背景顏色,菜單文本顏色等等。請參考相關文檔中wxSystemSettings::GetColour的部分來獲取詳細的列表。 下面的例子演示了創建wxColour的方法: ``` wxColour color(0, 255, 0); // green wxColour color(wxT("RED")); // red // 使用面板的三維表面系統顏色 wxColour color(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE)); ``` wxTheColourDatabase指針用來在系統之類的顏色和顏色名之間建立映射,通過顏色名尋找對應的顏色對象或者通過顏色對象來尋找對應的顏色名,如下所示: ``` wxTheColourDatabase->Add(wxT("PINKISH"), wxColour(234, 184, 184)); wxString name = wxTheColourDatabase->FindName( wxColour(234, 184, 184)); wxString color = wxTheColourDatabase->Find(name); ``` 下面列出了目前支持的標準顏色:aquamarine, black, blue, blue violet, brown, cadet blue, coral, cornflower blue, cyan, dark gray, dark green, dark olive green, dark orchid, dark slate blue, dark slate gray dark turquoise, dim gray, firebrick, forest green, gold, goldenrod, gray, green, green yellow, indian red, khaki, light blue, light gray, light steel blue, lime green, magenta, maroon, medium aquamarine, medium blue, medium forest green, medium goldenrod, medium orchid, medium sea green, medium slate blue, medium spring green, medium turquoise, medium violet red, midnight blue, navy, orange, orange red, orchid, pale green, pink, plum, purple, red, salmon, sea green, sienna, sky blue, slate blue, spring green, steel blue, tan, thistle, turquoise, violet, violet red, wheat, white, yellow, 和 yellow green. wxPen 你可以使用SetPen函數指定一個設備上下文使用的畫筆(wxPen)。畫筆指定了隨后的繪畫操作中線條的顏色,粗細以及線條類型。wxPen的開銷很小,你可以放心的在你的繪圖代碼中創建局部變量類型的畫筆對象而不用對它們進行全局存儲。 下表列出了目前支持的畫筆線條類型,其中Hatch和stipple類型目前的GTK+版本不支持: | 線形 | 示例 | 描述 | |:--- |:--- |:--- | | wxSOLID | ![](img/mht8198%281%29.tmp) | 純色線. | | wxTRANSPARENT | 透明顏色. | | wxDOT | ![](img/mht819B%281%29.tmp) | 純點線. | | wxLONG_DASH | ![](img/mht81AE%281%29.tmp) | 長虛線. | | wxSHORT_DASH | ![](img/mht81B1%281%29.tmp) | 短虛線.在windows平臺上等同于wxLONG_SASH. | | wxDOT_DASH | ![](img/mht81B4%281%29.tmp) | 短線和點間隔線. | | wxSTIPPLE | ![](img/mht81C6%281%29.tmp) | 使用一個位圖代替點的點虛線,這個位圖是其構造函數的第一個參數 | | wxUSER_DASH | ![](img/mht81C9%281%29.tmp) | 自定義虛線. 參考用戶手冊. | | wxBDIAGONAL_HATCH | ![](img/mht81CC%281%29.tmp) | 反斜線虛線. | | wxCROSSDIAG_HATCH | ![](img/mht81DF%281%29.tmp) | 交叉虛線. | | wxFDIAGONAL_HATCH | ![](img/mht81E2%281%29.tmp) | 斜線虛線. | | wxCROSS_HATCH | ![](img/mht81F4%281%29.tmp) | 十字虛線. | | wxHORIZONTAL_HATCH | ![](img/mht81F7%281%29.tmp) | 水平線段虛線. | | wxVERTICAL_HATCH | ![](img/mht820A%281%29.tmp) | 垂直線段虛線. | 使用SetCap定義粗線條的末端的樣子:wxCAP_ROUND是默認的設置,只是粗線條的末端應該使用圓形,wxCAP_PROJECTING則只是使用方形并且有一個凸起,wxCAP_BUTT則只是直接使用方形。 使用SetJoin函數來設置當有線段相連時候的聯結方式,默認的值是wxJOIN_ROUND,這種情況下轉角是圓形的,其它可選的值還有wxJOIN_BEVEL和wxJOIN_MITER. 你也可以直接使用預定的畫筆對象:wxRED_PEN, wxCYAN_PEN, wxGREEN_PEN, wxBLACK_PEN, wxWHITE_PEN, wxtrANSPARENT_PEN, wxBLACK_DASHED_PEN, wxGREY_PEN, wxMEDIUM_GREY_PEN 和 wxLIGHT_GREY_PEN.這些都是指針,所以在SetPen函數中使用的時候,應該使用"*"號指向它們的實例。還有一個預定義的對象(不是指針)wxNullPen,可以用來復位設備上下文中的畫筆。 下面是創建畫筆的一些演示代碼,都用來產生一個純紅色的畫筆: ``` wxPen pen(wxColour(255, 0, 0), 1, wxSOLID); wxPen pen(wxT("RED"), 1, wxSOLID); wxPen pen = (*wxRED_PEN); wxPen pen(*wxRED_PEN); ``` 上面例子中的最后兩行使用了引用記數的方法,實際上內部指向同一個對象。這種引用記數的方法在繪畫對象中很常用,它使得對象賦值和拷貝的系統開銷非常小,不過同時它意味著一個對象的改變將會影響到其它所有使用同一個引用的對象。 一個既可以簡化畫筆對象的創建和釋放過程,又不需要將畫筆對象存儲在自己的對象中的方法,是使用全局指針wxThePenList來創建和存儲所有你需要的畫筆對象,如下所示: ``` wxPen* pen = wxThePenList->FindOrCreatePen(*wxRED, 1, wxSOLID); ``` 這個wxThePenList指向的對象將負責存儲所有的畫筆對象并且在應用程序退出的時候自動釋放所有的畫筆。很顯然,你應該小心不要過量使用這個對象以免畫筆對象占用大量的系統內存,而且也要注意前面我們提到過的使用引用對象的問題,你可以使用RemovePen函數從 wxThePenList中刪除一個畫筆但是卻不釋放它所占的內存。 wxBrush 設備上下文當前使用的畫刷對象可以用SetBrush函數指定,它決定設備上下文中圖像的填充方式。你也可以使用它來定義設備上下文的默認背景,這樣的定義方式可以使得背景不只是簡單的純色。和畫筆對象一樣,畫刷對象的系統消耗也非常小,你可以直接使用局部變量的方式定義它。 畫刷的構造函數采用一個顏色參數和一個畫刷類型參數,如下表所示: | 畫刷類型 | 例子 | 描述 | |:--- |:--- |:--- | | wxSOLID | ![](img/mht820D%281%29.tmp) | 純色畫刷. | | wxTRANSPARENT | 透明畫刷. | | wxBDIAGONAL_HATCH | ![](img/mht8210%281%29.tmp) | 反斜線畫刷. | | wxCROSSDIAG_HATCH | ![](img/mht8223%281%29.tmp) | 交叉畫刷. | | wxFDIAGONAL_HATCH | ![](img/mht8226%281%29.tmp) | 斜線畫刷. | | wxCROSS_HATCH | ![](img/mht8238%281%29.tmp) | 十字畫刷. | | wxHORIZONTAL_HATCH | ![](img/mht823B%281%29.tmp) | 水平線畫刷. | | wxVERTICAL_HATCH | ![](img/mht823E%281%29.tmp) | 垂直線畫刷. | | wxSTIPPLE | ![](img/mht8251%281%29.tmp) | 位圖畫刷, 其位圖在構造函數中指定. | 你也可以直接使用下面這些系統預定義的畫刷:wxBLUE_BRUSH, wxGREEN_BRUSH, wxWHITE BRUSH, wxBLACK_BRUSH, wxGREY_BRUSH, wxMEDIUM_GREY_BRUSH, wxLIGHT_GREY_BRUSH, wxtrANSPARENT_BRUSH, wxCYAN_BRUSH和 wxRED_BRUSH. 這些都是指針,類似的還有wxNullBrush用來復位設備上下文的畫刷。 下面是創建紅色純色畫刷的例子: ``` wxBrush brush(wxColour(255, 0, 0), wxSOLID); wxBrush brush(wxT("RED"), wxSOLID); wxBrush brush = (*wxRED_BRUSH); // a cheap operation wxBrush brush(*wxRED_BRUSH); ``` 和畫筆一樣,畫刷也有一個用來保存列表的全局指針指針: wxTheBrushList,你可以象下面這樣使用它: ``` wxBrush* brush = wxTheBrushList->FindOrCreateBrush(*wxBLUE, wxSOLID); ``` 同樣要避免在應用程序過量使用以及要注意引用記數使用的問題。使用RemoveBrush來從wxTheBrushList中移除一個畫刷而不釋放其內存。 wxFont 你可以使用字體對象來設置一個設備上下文使用的字體,字體對象有下面一些屬性: 字體大小用來以點(1/72英寸)為單位指定字體中的最大高度。wxWidgets會選擇系統中最接近的字體。 字體家族用來指定一個家族系列,象下表中描述的那樣,指定一個字體家族而不指定一個字體的名字是為了移植的方便,因為你不大可能要求某個字體的名字存在于所有的平臺。 | 字體家族標識符 | 例子 | 描述 | |:--- |:--- |:--- | | wxFONTFAMILY_SWISS | ![](img/mht8254%281%29.tmp) | 非印刷字體,依平臺的不同通常是Helvetica或Arial. | | wxFONTFAMILY_ROMAN | ![](img/mht8267%281%29.tmp) | 一種正規的印刷字體. | | wxFONTFAMILY_SCRIPT | ![](img/mht826A%281%29.tmp) | 一種藝術字體. | | wxFONTFAMILY_MODERN | ![](img/mht827C%281%29.tmp) | 一種等寬字體.通常是Courier | | wxFONTFAMILY_DECORATIVE | ![](img/mht827F%281%29.tmp) | 一種裝飾字體. | | wxFONTFAMILY_DEFAULT | wxWidgets選擇一個默認的字體家族. | 字體類型可以是wxNORMAL, wxSLANT或wxITALIC。其中wxSLANT可能不是所有的平臺或者所有的字體都支持。 weight屬性的值則可以是wxNORMAL, wxLIGHT或wxBOLD. 下劃線可以被設置或者關閉。 字體名屬性是可選參數,用來指定一個特定的字體,如果其為空,則將使用指定字體家族默認的字體。 可選的編碼方式參數用來指定字體編碼和程序用設備上下文繪畫的文本的編碼方式的映射,詳情請參考第16章,?編寫國際化應用程序?。 你可以使用默認的構造函數創建一個字體,或者使用上表中列出的字體家族創建一個字體。 也可以使用下面這些系統預定義的字體: wxNORMAL_FONT, wxSMALL_FONT, wxITALIC_FONT和wxSWISS_FONT. 除了wxSMALL_FONT以外,其它的字體都使用同樣大小的系統默認字體(wxSYS_DEFAULT_GUI_FONT), 而wxSMALL_FONT則比另外的三個字體小兩個點.你可以使用wxSystemSettings::GetFont來獲取當前系統的默認字體。 要使用字體,你需要在進行任何字體相關的操作(比如DrawText和GetTextExtent)之前,使用wxDC::SetFont函數設置字體。 下面的代碼演示了怎樣構造一個字體對象: ``` wxFont font(12, wxFONTFAMILY_ROMAN, wxITALIC, wxBOLD, false); wxFont font(10, wxFONTFAMILY_SWISS, wxNORMAL, wxBOLD, true, wxT("Arial"), wxFONTENCODING_ISO8859_1)); wxFont font(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT)); ``` 和畫筆和畫刷一樣,字體也有一個全局列表指針wxTheFontList,用來查找以前創建的字體或者創建一個新的字體: ``` wxFont* font = wxTheFontList->FindOrCreateFont(12, wxSWISS, wxNORMAL, wxNORMAL); ``` 同樣的,避免大量使用這個全局指針,因為其分配的內存要到程序退出的時候才會釋放。你可以使用RemoveFont從中移除一個字體但是不釋放相關的內存。 在本章晚些時候我們會看到一些使用文本和字體的例子。同時你也可以看一下字體例子程序,它允許你選擇一個字體然后看看某些文本是什么樣子,也可以讓你更改字體的大小和別的屬性。 ![](img/mht8292%281%29.tmp) wxPalette 調色板是一個表,這個表的大小通常是256,表中的每一個索引被映射到一個對應的rgb顏色值。通常在不同的應用程序需要在同一個顯示設備上共享確定數目的顏色的時候使用。通過設置一個調色板,應用程序之間的顏色可以取得一個平衡。調色板也被用來把一個低顏色深度的圖片映射到當前可用的顏色,因此每個wxBitmap都有一個可選的調色板。 因為現在大多數電腦的顯示設備都支持真彩色,調色板已經很少使用了。應用程序定義的RGB顏色可以直接被顯示設備映射到最接近的顏色。 創建一個調色板需要提供一個調色板大小參數和三個分別代表紅綠藍三種顏色的數組。你可以通過GetColoursCount函數得到當前調色板中條目的數量。GetRGB函數通過索引找到其代替的顏色的RGB值,而GetPixel則通過RGB值得到其相應的索引。 使用wxDC::SetPalette函數給某個設備上下文指定一個調色板。比如,你可以給當前的設備上下文指定一個位于某個低顏色深度的wxBitmap對象中的調色板,一邊讓設備上下文知道怎樣把這個圖片中的索引顏色映射到真實的RGB顏色。當在一個指定了調色板的設備上下文中使用 wxColour繪畫的時候,系統會自動在設備上下文的調色板中查找最匹配的顏色的索引,因此你應該指定一個和你要用的顏色最接近的調色板。 wxPalette的另外一個用法是用來查詢一個低顏色深度圖像文件(比如GIF)中的圖像的不同的顏色。如果這個圖像擁有一個調色板,即時這個圖片已經被轉換成RGB格式,區分圖像中的不同顏色也仍然是個很容易的事。類似的,通過調色板,你也可以把一個真彩色的圖片轉換成低顏色深度的圖片,下面的代碼演示了怎樣將一個真彩色的PNG文件轉換成8bit的windows位圖文件: ``` // 加載這個PNG文件 wxImage image(wxT("image.png"), wxBITMAP_TYPE_PNG); // 創建一個調色板 unsigned char* red = new unsigned char[256]; unsigned char* green = new unsigned char[256]; unsigned char* blue = new unsigned char[256]; for (size_t i = 0; i &lt; 256; i ++) { red[i] = green[i] = blue[i] = i; } wxPalette palette(256, red, green, blue); // 設置調色板和顏色深度 image.SetPalette(palette); image.SetOption(wxIMAGE_OPTION_BMP_FORMAT, wxBMP_8BPP_PALETTE); // 存儲文件 image.SaveFile(wxT("image.bmp"), wxBITMAP_TYPE_BMP); ``` 降低顏色深度的更實用的方法請參考第10章,?在程序中使用圖片?中的?降低顏色深度?小節,介紹怎樣用wxQuantize類來作這件事。 wxWidgets定義了一個空的調色板對象wxNullPalette. (譯者注:這一小節翻譯的太費勁了)
                  <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>

                              哎呀哎呀视频在线观看