• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • VC++.NET下GDI+編程之GDI+簡介

    發表于:2007-05-25來源:作者:點擊數: 標簽:編程GDI+VC++.NETGDI簡介
    一、GDI簡介 要實現繪畫功能就需要一個做畫的平臺及做畫的工具。最常用的繪畫平臺可能就是一張白紙,除此之外,還需要一個畫筆或一個畫刷,它顯示了繪畫的發展和進步。由于一個畫筆只能擁有或使用一種顏色,這對于實現你的目標來說,可能就顯的有些不夠用了
     一、GDI簡介

      要實現繪畫功能就需要一個做畫的平臺及做畫的工具。最常用的繪畫平臺可能就是一張白紙,除此之外,還需要一個畫筆或一個畫刷,它顯示了繪畫的發展和進步。由于一個畫筆只能擁有或使用一種顏色,這對于實現你的目標來說,可能就顯的有些不夠用了,因此你可能會最終需要很多畫筆。

      設備上下文是繪畫平臺及繪畫所需要工具的集合體,它還包括平臺的尺寸、方向、顏色和所有能實現你繪畫想象力的附件。

      當使用計算機時,肯定不能向通常那樣將工具放在桌子上。為了在Windows操作系統上作畫,微軟創造了圖形設備接口,簡稱為GDI,它是類、函數、變量和常量的集合,或者說是在應用程序中繪畫所需要的絕大部分對象。GDI由已安裝在計算機中的Gdi.dll動態庫來提供。

      二、GDI+

      GDI+是Windows系列操作系統用來執行繪畫及其他相關圖形操作的一套子系統。正如所看到的,新的操作系統Windows XP 和Windows Server 2003中,GDI+已經替換掉了GDI(圖形設備接口)。GDI+中的"+"表示相對于GDI來說,GDI+進行很大的改進,增加了新的特點,而這些在GDI中是很難實現的。GDI+允許你創建獨立于設備的應用程序,也就是說不用考慮應用程序將在什么樣的硬件上運行。

      微軟Windows XP和Windows Server 2003本身都帶有GDI+。如果想在以前的操作系統上使用GDI+,則必須進行安裝。GDI+通過三個方面來提供它的功能:

     ?。ㄒ唬┦噶繄D形

      它是連續繪畫所形成的區域,基于幾何形狀的圖形,包括直線、線集、圓和四邊形。它們在顯示器上或其他設備上被看作是點集。為了完成這些類型操作,GDI+系統提供了不同的類來執行不同的任務。例如,一個類可以負責創建和準備用于繪畫的工具,另外一個類則使用所提供的工具,來執行實際的繪畫任務。

     ?。ǘ┏上?br/>
      盡管創建一個帶有可識別顏色的矢量圖形看上去很簡單,但是在設備上繪畫或顯示高級的圖片卻是一個挑戰。正是因為這些原因,成像是用于處理這些復雜操作的范疇。

     ?。ㄈ┡庞?br/>
      排印主要是創建、操縱應用程序中的字體,它甚至包括制造一些可用字體。

      三、GDI+的基本工具

     ?。ㄒ唬﹫D形平臺

      在GDI中繪畫,必須獲取設備上下文的句柄,這通過聲明一個HDC變量或指向HDC的指針,然后調用類似于BeginPaint()的函數來初始化設備上下文來實現。同時,還需要創建繪畫所需的工具,例如一個畫筆或一個畫刷。一旦工具準備好了,必須將它們選入設備上下文,以使它們可以使用。畫完后,還需要釋放設備上下文。

      在GDI+中,使用一個graphic或 graphics 對象來進行繪畫。

     ?。ǘ┨畛渖?br/>
      顏色對于增強一個對象的美學外觀發揮了最基礎的作用。顏色是非空間對象,用于增強對象的視覺效果。為了支持色彩,GDI+庫提供了顏色結構。

      一個顏色被創建為包含四字節的值,第一字節的值代表alpha值,它絕大部分情況下是在內部使用,第二、三和四個字節的值分別代表R、G、B(紅、綠、蘭)的數值。


    圖一、GDI+中的顏色結構

      轉換成十進制,紅、綠、藍的值按照如下規則:

    27 + 26 + 25 + 24 + 23 + 22 + 21 + 20
    = 128 + 64 + 32 + 16 + 8 + 4 + 2 + 1
    = 255

      所以,每個值的波動范圍在0-255之間變化。Alpha部分是為操作系統保留的,另外三個值合成一個值,如下所示:


    圖二、顏色值的構成示意圖

      轉換成十進制,這個數字的值是255 * 255 * 255 = 16581375,這意味著我們大概有0.16億種可用的顏色。這讓人立即產生以下問題,我們怎么使用這些顏色?會產生什么效果?

      監視器的表面類似于一系列很細的水平和垂直的網格線,垂直和水平網格線的交點處被稱為一個像素,這個像素擁有、攜帶并顯示一種顏色,如圖所示:


    圖三、監視器表面示意圖

      因為相鄰的像素擁有不同的顏色,這種效果是一種非常好的失真,產生了富有美感的圖片。通過更改像素顏色,可以在圖片或圖形上產生顏色變幻效果。

      為了使顏色選擇更容易,Color結構提供了各種屬性,每個屬性代表了一個顏色的名字。使用這些顏色時,要在調用的Color結構后緊接著使用"::"操作符,然后是所想要的顏色。所有常用的顏色名字都已包括了進來,它們在Color結構中通過靜態屬性來代表。這些常用顏色包括Red, Green, Blue, Black, White, Yellow, Fuchsia, Silver, Gray, Brown和 Khaki等等,這只是一小部分,還有一些不常用的顏色。下面有一個例子:

    clearcase/" target="_blank" >cc66" width="90%" align="center" bgcolor="#dadacf" border="1">
    private: System::Void button1_Click(System::Object * sender, System::EventArgs * e)
    {
     this->BackColor = Color::Turquoise;
    }

      如果預先定義的顏色不合適,可以通過混合red、green和blue 值來定義自己的顏色。創建一個顏色使用如下方法:聲明一個Color類型的變量。為了指定顏色的特性,Color結構提供了FromArgb()靜態函數,它重載了四個版本:

    public: static Color FromArgb(int argb);
    public: static Color FromArgb(int alpha, Color baseColor);
    public: static Color FromArgb(int red, int green, int blue);
    public: static Color FromArgb(int alpha, int red, int green, int blue);

      第三種版本最常用,它允許在0-255范圍之內定義三種基本顏色的值。下面的例子將產生如圖四所示的效果:

    private: System::Void button1_Click(System::Object * sender, System::EventArgs * e)
    {
     this->BackColor = Color::FromArgb(26, 69, 174);
    }


    圖四、自定義顏色效果圖

      一種顏色無論是使用預定義的顏色屬性初始化還是使用FromArgb()方法,如果需要得到一個顏色的R、G、B值的話,可以使用R、G、B屬性來抽取對應的基本顏色值。這三個屬性都是字節類型。此外,還可以使用Color::ToArgb()來達到同樣的目的。它的語法是:

    public: int ToArgb();

      這個方法將返回一個整數值。
    ?。ㄈ┊嫻P

      盡管Graphics類提供了用以繪畫的平臺,但是還需要繪畫的工具??梢允褂玫淖罨镜墓ぞ呔褪钱嫻P。GDI+庫通過Pen類提供了一個畫筆。為了得到一個畫筆,可以聲明一個指向Pen類的指針,畫筆必須說明的一個最基本的信息是它的顏色,可能要使用下面的構造函數來說明畫筆的顏色:

    public: Pen(Color color);

      下面是一個例子代碼:

    private: System::Void button1_Click(System::Object * sender, System::EventArgs * e)
    {
     Color clrBlue = Color::Blue;
     Pen *penRed = new Pen(clrBlue);
    }

      如果已經創建了一個畫筆,為了更改顏色,可以分配一個所需要的顏色名或值給Pen::Color 屬性。

      Pen提供的細節遠遠不止這些,現在我們只是簡單地使用它。

     ?。ㄋ模﹫D形對象

      絕大多數的繪畫都是在一個圖形對象上進行。多數情況下,當需要使用圖形對象時它并不一定可用,你必須在所要繪畫的對象上對它提出申請或創建它。這兩種操作都很容易。

      1、得到一個圖形對象

      在GDI+中,圖形對象基于Graphics類,所以,在繪畫以前,需要獲取一個圖形對象。幸運的是,每一個窗體控件,也就是每一個基于Control的類自動繼承了一個稱為CreateGraphics()的方法,它提供了操作控件圖形部分的途徑。Control::CreateGraphics()方法的語法是:

    public: Graphics *CreateGraphics();

      正如所看到的,CreateGraphics()方法返回調用變量的圖形對象。下面的例子獲取窗體的圖形變量。

    private: System::Void button1_Click(System::Object * sender, System::EventArgs * e)
    {
     Graphics *graph = this->CreateGraphics();
    }

      獲取控件圖形對象的另外一種技術是調用靜態方法Control::FromHwnd(),它的語法是:

    public: static Graphics *FromHwnd(IntPtr hwnd);

      注意,這個方法是靜態的,傳遞給它的參數必須是你想要獲取的圖形對象所屬控件。所有窗體控件都有一個句柄叫Handle,下面的例子說明如何使用句柄獲取窗體的圖形對象:

    private: System::Void button1_Click(System::Object * sender, System::EventArgs * e)
    {
     Graphics *graph = Graphics::FromHwnd(this->Handle);
    }

      如果你正在使用窗體的Paint事件,它通過PaintEventArgs提供了一個非常方便使用的圖形對象,可以按照下面的代碼方式訪問圖形對象:

    private: System::Void Form1_Paint(System::Object * sender,
    System::Windows::Forms::PaintEventArgs * e)
    {
     e->Graphics . . .
    }

      四、繪畫步驟

     ?。ㄒ唬┇@取設備上下文

      正如上面提到的,在繪畫之前,確認已經有了一個圖形對象。為了進行實際繪畫,圖形對象提供了適合于各種圖形的方法,用來畫某種圖形的方法都有一個帶有"Draw"開頭的名字。此外,用于畫每個已知圖形的方法都需要一個Pen參數。所以,當繪畫時,你第一個要做的決定就是想要畫什么樣的圖形或圖形類型,第二個決定可能就是定義邊界的顏色。繪畫時另外兩個重要問題是:位置和尺寸。

     ?。ǘ﹫D形或形狀的起點

      為了跟蹤繪畫時的蹤跡,在其上面繪畫的對象都使用了坐標系,它的左上角是起點坐標點(0,0),如果在窗體上做畫,那么這個坐標原點就在標題條的左下角。


    圖五、窗體坐標系

      如何設定圖形或形狀的起點,要視形狀而定。

    原文轉自:http://www.kjueaiud.com

    評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)
    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>