熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

Windows窗體中如何使用透明圖片和標簽

2013-11-13 10:01:23  來源: .NET編程 

  昨天一朋友問到Windows窗體中圖片透明的問題剛上網看看了在CodeProject上看到了這篇文章覺得寫的不錯再者自己一直想學學翻譯技術文章所以就將其翻譯成了中文希望能給大家帶來點幫助
  申明初次翻譯此類文章屬處女作難免有不對之處歡迎大家拍磚指教!^_^
  OK開始正文……
  
  引言——沒有透明度的Windows窗體

  如果你制作一些包括圖片和標簽的復雜的窗體你可能會發現Windows窗體不支持真正的透明你可能撕裂了你的頭皮了——但仍沒有解決!

  即使你在圖片或標簽的BackColor屬性上使用了透明值來控制但結果是你仍然發現不能使其透明那麼這是為什麼呢?為什麼明明設置成透明了卻沒有透明呢?到底都發生了些什麼呢?

  實際上當你在BackColor屬性上設置透明值來控制的時候只是將其背景設置成與父窗體——Windows窗體一樣的背景而已並沒有真正的透明!所以當它們重疊放在一起的時候你仍然會發現它們相互之間並沒有透明如下圖所示
  
  在本文中我們將向你展示一個簡單的方法來使得標簽的後面圖片作為背景並如何使圖片和文字真正的變成透明
  
   如何制作透明標簽
   使圖片作為背景而標簽或文字在其前面進行顯示是否真的很容易?
   在下面我們將講解如何使標簽的背景透明
  
   有二種方法你可以使用它來很標簽的背景透明(其實有更多的方法可以做到這一點但是我們只去談論較為簡單些的)
   . 通過設置Panel的BackGroundImage屬性並且將標簽Lable放到它的裡面
   . 將Lable的父窗體設置成PictureBox(labelParent = pictureBox)
   這樣我們將不需要編寫任何的代碼並且我們可以在設計器裡馬上看到其透明的效果
  
  首先拖一個Panel控件到窗體中並將其BackgroundImage屬性設置成一張你希望看到的圖片來作為背景(你可以使用其BackgroundImageLayout來控制其排列的方式)
  
  最後添加一個Lable標簽並將其BackColor屬性設置成透明的(Web選項卡的第一個選項)最終的結果應該是類似下面的圖片
  
  這樣我們就可以將標簽設成透明了但圖片仍然沒有透明(上面的二張圖片之間仍然沒有實現相互透明)!不要擔心下面我們就來討論它們透明的問題
  
   使用GDI+來繪制圖片的透明度
  使繪制的圖像真正的透明有一點麻煩因為我們不能使用默認的控件來配置NET中的 Windows窗體
  
  對於更為復雜的圖像和圖形處理我們可以使用GDI + 它是一個圖形設備接口(你可以在SystemDrawing命名空間中找到它)
  
  我們會做的是建立一個通用的控件我們就可以任意繼承它並提取圖片和文字了這可以在本項目的源代碼中看到但如果你想了解它如何工作請繼續住下閱讀
  
   繪制通用圖像控件
  首先創建一個繼承於Panel的新類稱其為DrawingArea 這個類有一個抽象的OnDraw方法並且我們在子類中要對此方法進行重寫所以我們還需要將DrawingArea類聲名為抽象類
  此外我們還會添加一個Graphics圖形對象來繪制圖片你應該像這樣
  
  
  using System;
  using SystemDrawing;
  using SystemWindowsForms;
  using SystemDrawingDrawingD;
  
  /// <summary>
  ///自定義繪制圖形和文字的透明度
  ///繼承DrawingArea和覆蓋OnDraw方法
  /// </summary>
  abstract public class DrawingArea : Panel
  {
   /// <summary>
   /// 在OnDraw方法中使用此對象
   /// </summary>
   protected Graphics graphics;
  
   /// <summary>
   /// 在子類中應該要重寫此方法
   /// </summary>
   abstract protected void OnDraw();
  }
  
  
  
   我們需要確保我們的控件背景透明度進行正確的處理為此我們需要重寫CreateParams屬性以確保其風格與控件實例的正確(感謝Bob Powell的提示)
  
  
  
  
  protected override CreateParams CreateParams
   {
   get
   {
   CreateParams cp = baseCreateParams;
   cpExStyle |= x; //WS_EX_TRANSPARENT
  
   return cp;
   }
  }
  
  
  
  現在只有兩件事情是必須的
  
  首先我們必須確保背景不會被繪制出來我們要做到這一點

  首先要重寫OnPaintBackground方法
  
  第二件事是需重寫OnPaint方法這使我們能夠確定程序在將我們的控制下進行繪制
  
  
  
  
  protected override void OnPaintBackground(PaintEventArgs pevent)
   {
   // 不要繪制背景
   }
  
   protected override void OnPaint(PaintEventArgs e)
   {
   thisgraphics = eGraphics;
  
   // 設置顯示的效果質量屬性
   thisgraphicsTextRenderingHint =
   SystemDrawingTextTextRenderingHintAntiAlias;
   thisgraphicsInterpolationMode =
   SystemDrawingDrawingDInterpolationModeHighQualityBilinear;
   thisgraphicsPixelOffsetMode =
   SystemDrawingDrawingDPixelOffsetModeHighQuality;
   thisgraphicsSmoothingMode =
   SystemDrawingDrawingDSmoothingModeHighQuality;
  
   OnDraw();
   }
  
  
  
  我還定義了一個DrawText方法以及一些變量以便更容易的寫文字我在這裡不進行講解但你可以在項目的源代碼中找到它
  使用控制繪制圖片和文字與透明
  
  現在我們如何使用這個控件嗎?我們需要一個新的類來繼承DrawingArea 這是非常簡單容易的事情在這裡我提供了一個例子
  
  
  class BroculosDrawing : DrawingArea
  {
   protected override void OnDraw()
   {
   // 獲取資源
   Image broculoImage = global::WindowsApplicationPropertiesResourcesbroculo;
  
   // 設置圖片的屬性
   int width = broculoImageSizeWidth;
   int height = broculoImageSizeHeight;
   Rectangle big = new Rectangle( width height);
   Rectangle small = new Rectangle( (int)( * width)
   (int)( * height));
  
   // 繪制二張圖片
   thisgraphicsDrawImage(broculoImage big);
   thisgraphicsDrawImage(broculoImage small);
  
   // 設置文字的屬性並將其繪制出來
   float fontSize = f;
   Point textPosition = new Point( );
   DrawText( Microsoft Sans Serif fontSize
   FontStyleUnderline BrushesBlue textPosition);
   }
  }
  
  
  這將使用兩個圖片和一些文字(類似於之前的) 但現在是真正透明度!
  我們可以像其它控件一樣使用這個控件對其進行編譯這個新的控件應該會出現在工具箱中拖動它到新的窗體中!你便可以看到如下圖所示的結果
  
   結論
  
  現在你知道如何利用圖像的透明度了吧最大的缺點是它在NET中內置的Windows窗體控件上不太容易使用默認的控件在使用更先進的圖像操作時是非常有限的所以我們使用GDI +來克服這一點
  應用這方面的知識並做更多一點的工作應該有可能做出TransparentPictureBox

  希望它能給你帶來幫助
  
  
  原文地址_controls_netaspx
   本文源碼下載
  
  作者asidy
  出處
  版權說明本文版權歸作者博客園及CSDN共有歡迎轉載但未經作者同意必須保留此段聲明且在文章頁面明顯位置給出原文連接否則保留追究法律責任的權利


From:http://tw.wingwit.com/Article/program/net/201311/12306.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.