QQ窗體是圓角的,Kugoo窗體也是圓角的,QQ的輸入法皮膚窗體是不規則的。。。等N多日常使用的程序主窗體都不是四四方方的,其實都是調用2D繪畫函數按指定的路徑畫出來的,那麼這一課我給入門級學者講解的是關於C#實現這一功能。
先來看看實現效果(左邊的字體也是窗體的一部分):
其實其核心就是圍繞Drawing2D來實現的,用GraphicsPath的方法GetPixel取左上角的一點的顏色作為我們透明色,然後橫堅循環遍歷每一個像素坐標點,如果發現其為透明色,則不加入繪制窗體區域。
下面看怎麼實現的,看圖:
關鍵點:
第一、設置當前窗體為無邊框的(this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;);
第二、排除捕獲對錯誤線程的調用,CheckForIllegalCrossThreadCalls = false;
第三、計算位圖中不透明部分的邊界,代碼如下:
#region //計算位圖中不透明部分的邊界
private GraphicsPath CalculateControlGraphicsPath(Bitmap bitmap)
{
//創建GraphicsPath
GraphicsPath graphicsPath = new GraphicsPath();
//使用左上角的一點的顏色作為我們透明色
Color colorTransparent = bitmap.GetPixel(0, 0);
// 偏歷所有行(Y方向)
for (int row = 0; row < bitmap.Height; row++)
{
//第一個找到點的X
int colOpaquePixel = 0;
//偏歷所有列(X方向)
for (int col = 0; col < bitmap.Width; col++)
{
//如果是不需要透明處理的點則標記,然後繼續偏歷
if (bitmap.GetPixel(col, row) != colorTransparent)
{
//記錄當前
colOpaquePixel = col;
///從找到的不透明點開始,繼續尋找不透明點,一直到找到或則達到圖片寬度
while (col < bitmap.Width)
if (bitmap.GetPixel(col++, row) == colorTransparent)
break;
//將不透明點加到graphicspath
graphicsPath.AddRectangle(new Rectangle(colOpaquePixel, row, col - colOpaquePixel - 1, 1));
}
}
}
return graphicsPath;
}
#endregion
第四、設置當前窗體的繪制路徑區域
this.Region = new Region(this.CalculateControlGraphicsPath(this.BackgroundImage as Bitmap));
代碼下載地址 http://www.BkJia.com/uploadfile/2011/1106/20111106044816864.rar
作者:博客園中的艾偉