程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 用C#開發類似QQ輸入法的不規則窗體的程序詳解+代碼打包分享

用C#開發類似QQ輸入法的不規則窗體的程序詳解+代碼打包分享

編輯:C#入門知識

 

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

 

作者:博客園中的艾偉

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved