• <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+創建特效字體

    發表于:2007-05-25來源:作者:點擊數: 標簽:GDI+VC++.NET特效字體創建
    來自于微軟.NET技術的C++托管擴展所包含的GDI+技術功能十分強大,本文將介紹如何使用GDI+的畫刷來繪制文本。 一、使用畫刷繪制文本的基本技術 本文所帶的例子程序允許用戶定義所要顯示的文本、字體尺寸、顯示文本所用的畫刷(網格畫刷或漸變畫刷)以及繪制文
     來自于微軟.NET技術的C++托管擴展所包含的GDI+技術功能十分強大,本文將介紹如何使用GDI+的畫刷來繪制文本。

      一、使用畫刷繪制文本的基本技術

      本文所帶的例子程序允許用戶定義所要顯示的文本、字體尺寸、顯示文本所用的畫刷(網格畫刷或漸變畫刷)以及繪制文本的顏色等。例子代碼下載GDIPlusTextWithBrushes.zip

      下面是GDI+中使用漸變畫刷或網格畫刷繪制文本的基本步驟:

      1、 在控件的繪制(Paint)事件中添加一個事件處理函數。

      在這個處理函數中進行繪制文本的相關處理,這樣控件才能正確地進行重繪。

      2、 獲取一個圖形(Graphics)對象。

      正如我們所熟悉的設備上下文一樣,圖形對象是NET封裝的一個繪制平面,例如,當在一個PictureBox控件上進行繪制時,可以調用PictureBox::CreateGraphics方法來獲取一個Graphics對象,并在控件上繪圖時使用這個圖形(Graphics)對象?;ヂ摼W上有很多例子都是這么做的,但是,有一個問題是,這樣得到的Graphics對象不是永久對象,如果用戶從當前程序轉到另一個應用程序并再次返回時,這個控件將無法正確地進行重繪。所以 ,要得當圖形對象應當使用傳遞給控件Paint方法的PaintEventArgs對象中的Graphics對象,代碼如下所示:

    clearcase/" target="_blank" >cc66" width="90%" align="center" bgcolor="#e3e3e3" border="1">
    private: System::Void picText_Paint(System::Object * sender,
    System::Windows::Forms::PaintEventArgs * e)
    {
    ...
    Graphics* g = e->Graphics;

      3、實例化一個字體對象

      在字體類的13個構造函數中,最基本的一個構造函數只需要你提供字體名及字體的大小。在下面的例子中,創建了一個20點,"Times New Roman"類的常規字體:

    using namespace System::Drawing;
    ...
    Font* font = new Font(S"Times new Roman", 20, FontStyle::Regular);

      4、測量將被繪制的文本尺寸

      為了繪制文本需要使用Graphics::MeasureString方法來測量文本尺寸??梢允褂肎raphics::MeasureString方法來完成這個任務。這個方法需要提供被測量的文本及字體對象,并返回SizeF結構對象,這個結構包含了將要進行繪制文本的尺寸。

    SizeF textSize = g->MeasureString(S"My Sample Text", font);

      5、實例畫刷對象

      可以使用各種各樣的畫刷進行繪制文本,包括網格畫刷、線性漸變畫刷、路徑漸變畫刷、實體畫刷及紋理畫刷等,只是在創建各個不同的實例畫刷時傳遞的參數有一些小小的不同而已。對各種畫刷進行探討不是本文的內容,在本文的實例中只使用兩種畫刷(網格畫刷及線性漸變畫刷)。

    // HatchBrush example
    Brush* brush = new HatchBrush(HatchStyle::Cross,
    Color::Black, Color::Blue);
    // LinearGradientBrush example
    RectangleF* rect = __nogc new RectangleF(PointF(0, 0), textSize);
    brush= new LinearGradientBrush(*rect, Color::Black, Color::Blue,
    LinearGradientMode::ForwardDiagonal);

      6、(選項)填充背景

      為了使應用程序有特色,可以在繪制文本前對背景進行顏色填充,這有兩個標準的方法。較簡單的方法是調用Graphics::Clear方法并定義將使用的顏色;但是有時需要更高級的控制,這時候需要使用Graphics::FillRectange方法。

      Graphics::FillRectange方法允許開發人員規定所選擇的畫刷對象并定義確切的矩形坐標位置。關于畫刷對象,可以使用實例化的自定義畫刷或者是系統畫刷SystemBrushes,系統畫刷定義了若干屬性成員,它們是實心畫刷,各自用來表現窗口的不同的元素,包括激活的邊框及標題條等。

    // Use the Windows-defined color for controls
    // and explicitly state the rectangle coordinates
    g->FillRectangle(SystemBrushes::Control, picText->Left, picText->Top,
    picText->Right - picText->Left, picText->Bottom - picText->Top);

    // Color the entire drawing surface using White
    g->Clear(Color::White);

      7、繪制文本

      一旦將所有的GDI+對象實例化后,下面所需要做的事就是調用Graphics::DrawString方法。下面的例子使用了這個方法,在這個方法里規定了需要顯示的文本、畫刷和字體及顯示文本的位置。

    // Center the text on the drawing surface
    g->DrawString(txtToDisplay->Text, font, brush,
    (picText->Width - textSize.Width) / 2,
    (picText->Height - textSize.Height) / 2);
     二、實現文本的3D效果

      上節探討了如何實現2D文字的顯示。這部分我們將探討如何實現陰影、塊狀、浮雕、雕刻文本效果。簡單的說,上述文字效果是通過對文本的多次繪制來實現的。首先在背景上繪制最遠的文本(也即是陰影),然后逐漸向最外層文本過度。換句話說,繪制3D文本就是多次繪制2D文本。這里,我將重點集中在如何實現3D效果的代碼上。

      注意:為了測試這些代碼片段,首先要在托管擴展程序的窗體上放置一個PictureBox控件,并將該控件命名為picText,然后將代碼拷貝到你的應用程序中,以此實現在PictureBox控件上繪制3D效果的文本。下面是例子程序(代碼程序下載:)界面效果圖。


      1、陰影效果文本

      為了取得陰影效果,你只需要繪制文本兩次。首先是陰影文本然后是最前面的文本。例如,下面的代碼繪制了一個陰影文本,陰影文本在前端文本后方5個像素處。


    圖二、陰影文本效果

    // Assumes a PictureBox on the form named picText
    // with this code being the picText object’s
    // Paint method
    private:
    System::Void picText_Paint( System::Object * sender,
    System::Windows::Forms::PaintEventArgs * e)
    {
     // Test string
     String* textToDisplay = S"Test string";
     // Obtain Graphics object
     Graphics* g = e->Graphics;
     // Create a Font object, Times New Roman, 25pt
     System::Drawing::Font* font = new System::Drawing::Font("Times New Roman", Convert::ToSingle(25),           FontStyle::Regular);
     // Obtain the size of the text to be rendered
     SizeF textSize = g->MeasureString(textToDisplay, font);
     // Text will be centered on PictureBox control
     Single x = (picText->Width - textSize.Width) / 2;
     Single y = (picText->Height - textSize.Height) / 2;
     // Clear background
     g->Clear(Color::White);
     // 注意:使用系統"光照"畫刷繪制陰影文本
     g->DrawString(textToDisplay, font, SystemBrushes::ControlLight, x + 5, y + 5);
     // 使用系統默認的文本畫刷繪制前端文本。
     g->DrawString(textToDisplay, font, SystemBrushes::ControlText, x, y);
    }

      2、實現塊狀文本

      為了實現塊狀文本效果,從希望的背景出開始一個像素一個像素地移動位置,并繪制文本。非常明顯,這時需要確定重復繪制文本的方向。本文示例程序繪制文本時將光源設置在右上角,這意味著要使用for循環,并在X方面上減少偏移量。如果將光源移動到左上角,只需要反過來增加偏移量就可以了。


    圖三、塊狀文本效果

    // Assumes a PictureBox on the form named picText
    // with this code being the picText object’s
    // Paint method
    private:
    System::Void picText_Paint( System::Object * sender,
    System::Windows::Forms::PaintEventArgs * e)
    {
     // Test string
     String* textToDisplay = S"Test string";
     // Get drawing surface for PictureBox and clear background
     Graphics* g = e->Graphics;
     // Create a Font object
     System::Drawing::Font* font = new System::Drawing::Font("Times New Roman", Convert::ToSingle(25), FontStyle::Regular);
     // Obtain the size of the text to be rendered
     SizeF textSize = g->MeasureString(textToDisplay, font);
     // Text will be centered on Picture Box control
     Single x = (picText->Width - textSize.Width) / 2;
     Single y = (picText->Height - textSize.Height) / 2;
     // Clear background
     g->Clear(Color::White);
     // 從背景處開始反復繪制陰影文本
     for (int i = Convert::ToInt32(5); i >= 0; i--)
     {
      g->DrawString(textToDisplay, font, SystemBrushes::ControlLight, x - i, y + i);
     }
     // 繪制前端文本
     g->DrawString(textToDisplay, font, SystemBrushes::ControlText, x, y);
    }

      3、浮雕及雕刻文本

      由于浮雕及雕刻是一種相反的效果,所以本文將這兩種效果放在一節中進行解釋。浮雕效果常常通過陰影文本技術來實現,深度設置為1個像素,前景文本的顏色設置為背景顏色。陰影的文本的顏色選擇黑色或灰色。雕刻效果的步驟相反,陰影文本相對于前面的文本向左上方偏移一個像素。


    圖四、浮雕效果


    圖五、雕刻效果

    // Assumes a PictureBox on the form named picText
    // with this code being the picText object’s
    // Paint method
    private:
    System::Void picText_Paint( System::Object * sender,
    System::Windows::Forms::PaintEventArgs * e)
    {
     // Test string
     String* textToDisplay = S"Test string";
     // Get drawing surface for PictureBox and clear background
     Graphics* g = e->Graphics;
     // Create a Font object
     System::Drawing::Font* font = new System::Drawing::Font("Times New Roman", Convert::ToSingle(25), FontStyle::Regular);
     // Obtain the size of the text to be rendered
     SizeF textSize = g->MeasureString(textToDisplay, font);
     // Text will be centered on Picture Box control
     Single x = (picText->Width - textSize.Width) / 2;
     Single y = (picText->Height - textSize.Height) / 2;
     // Clear background
     g->Clear(Color::White);
     // isEmbossed變量用來決定浮雕或雕刻效果
     bool isEmbossed = false;
     g->DrawString(textToDisplay, font, SystemBrushes::ControlText,
       x + Convert::ToSingle( (isEmbossed? 1 : -1)),
       y + Convert::ToSingle( (isEmbossed ? 1 : -1)));

     // Draw the foreground text
     g->DrawString(textToDisplay, font, new SolidBrush(Color::White), x, y);
     三、傾斜文本

      示例代碼下載:GDIPlusShearText.zip


    圖:顯示傾斜文本的例子程序界面

      1、存儲傾斜參數

      這里存在最終用戶定義文本傾斜參數的問題,在這種情況下,定義一個變量存儲這個值,然后調用PictureBox 控件的Paint 方法(例子代碼中,是通過"顯示文本"按鈕的單擊響應函數btnDisplayText_Click來調用這個方法)。有時你需要使用用戶鍵入的其他值,如字體大小等。在例子程序中,代碼如下:

    public __gc class Form1 : public System::Windows::Forms::Form
    {
     ...
     protected:
      String* textToDisplay;
      Decimal fontSize;
      Decimal shearSize;
      ...
     private: System::Void btnDisplayText_Click(System::Object * sender, System::EventArgs * e)
     {
      // Set up internal display values
      textToDisplay = txtToDisplay->Text;
      fontSize = spnFontSize->Value;
      shearSize = spnShear->Value;
      // Invalidate the control
      picText->Invalidate();
     }

      2、實現PictureBox控件的Paint方法

      文本將在PictureBox控件上進行繪制,所以實現Paint方法可以確保在需要的時候控件進行重繪。下面代碼的中的條件語句確保用戶已經輸入了需要顯示的文本。

    private: System::Void picText_Paint(System::Object * sender,
    System::Windows::Forms::PaintEventArgs * e)
    {
     if (textToDisplay)
     {
     }
    }

      下面步驟中的代碼全部放入到PictureBox對象的Paint方法中。

      3、獲取picture控件的Graphics對象

      可以通過PictureBox控件的CreateGraphics方法獲取Graphics對象。然而,當Graphics對象超出作用域范圍時,垃圾收集器將回收它。這時候,這個對象是不穩定的,所以,你需要的Graphics對象要從Paint 方法得到(經由PaintEventArgs::Graphics方法)。

    Graphics* g = e->Graphics;

      4、在用戶提供的字體大小基礎上實例化字體

      這個程序使用默認的"Times New Roman"字體,所以下面的代碼使用用戶規定的字體大小創建Times New Roman"字體。

    System::Drawing::Font* font = new System::Drawing::Font("Times New Roman",
    Convert::ToSingle(fontSize), FontStyle::Regular);

      5、獲取所要顯示的文本的尺寸

      Graphics::MeasureString方法通常來測量字符串的尺寸,它將返回所要按某種字體顯示的文本的尺寸。

    SizeF textSize = g->MeasureString(textToDisplay, font);

      6、對PictureBox控件進行清除操作

      通過PictureBox::Clear方法來初始化PictureBox控件并定義所需要的顏色,下面的代碼使用了用戶為控件定義的值。

    g->Clear(SystemColors::Control);

      7、計算文本在PictureBox控件上顯示的位置

      下面的代碼決定了居中顯示文本坐標位置(X,Y)。

    Single x = (picText->Width - textSize.Width) / 2;
    Single y = (picText->Height - textSize.Height) / 2;

      8、對PictureBox控件的平移矩陣進行平移

      為了正確衡量文本,你必須重新衡量整個graphics對象,所以,首先必須重新定位最初的Graphics對象到(X,Y)處,你通過Graphics::TranslateTransform方法來完成上述任務。

    g->TranslateTransform(x, y);

      9、返回新產生的變換矩陣

      一旦你對一個給定的PictureBox控件產生了一個"世界坐標的轉換",它可以通過Graphics::Transform屬性返回一個矩陣對象,這個矩陣將用來傾斜文本。

    Matrix* transform = g->Transform;

      10、使用用戶定義的值傾斜轉換矩陣

      矩陣對象有一個Shear方法,這個方法就可以來實現文本傾斜。它使用水平及垂直因子,這個例子中只使用了水平傾斜值,但是這兩個值可以非常簡單地進行定義。然而需要注意的是,這種平移技術只有在一個值為零時才能實現真正的傾斜。

    transform->Shear(Convert::ToSingle(shearSize), 0);

      11、將新得到的轉換矩陣賦于圖形對象的轉換矩陣

      一旦本地的矩陣經過Shear方法進行了修改,就需要將Graphic對象的transform設置為這個新值。

    g->Transform = transform;

      12、繪制文本

      既然已經設置了PictureBox控件的繪制區域,最后就可以調用Graphics::DrawString方法來繪制文本了。

    g->DrawString(textToDisplay, font, Brushes::Black, 0, 0);

      四、繪制反射文本

      示例程序下載:GDIPlusReflectedText.zip

      首先,實現PictureBox 控件的Paint事件。注意,在實現這種顯示效果時,它前面的5個步驟與上例中一樣,讀者朋友可以參考上例。

      1、對PictureBox控件的平移矩陣進行平移

      不久,你就需要測量Graphics對象,這樣才能繪制反向的文本。然而,測量影響到了整個Graphics對象,不僅僅是需要繪制的文本,所以,你需要將Graphics對象重新定位到你希望顯示文本的位置。

    g->TranslateTransform(x, y);

      2、計算顯示文本的高度

      你需要在最初文本的下面顯示反射文本,雖然你通過Measurestring方法得到文本的高度,但這個高度包括空白高度,而我們需要的是純字體的高度,下面的代碼得到了純文本的高度。

    int lineAscent = font->FontFamily->GetCellAscent(font->Style);
    int lineSpacing = font->FontFamily->GetLineSpacing(font->Style);
    Single lineHeight = font->GetHeight(g);
    Single cy = lineHeight * lineAscent / lineSpacing;

      3、繪制最初的文本

      注意XY的坐標值在(0,0)處,這是由于你前期調用TranslateTransform方法產生的結果。

    g->DrawString(textToDisplay, font, Brushes::Black, 0, 0);

      4、對graphic對象的transformation 矩陣使用必須的比例因子

      為了反射文本,你需要使用ScaleTransform方法,在這個方法中使用-1,使文本按次序進行反射。

    g->ScaleTransform(1, -1.0F);
      
      5、繪制反射文本

      一旦比例因子建立以后,你只要簡單地繪制反射文本就可以了,注意Y值被設置為文本高度的-2倍,這樣它才能顯示在文本的下方。

    g->DrawString(textToDisplay, font, Brushes::Gray, 0, -(cy*2));

    原文轉自: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>