亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#創建不規則窗體的4種方式詳解

2020-01-24 01:25:11
字體:
來源:轉載
供稿:網友

現在,C#創建不規則窗體不是一件難事,下面總結一下:

一、自定義窗體

一般為規則的圖形,如圓、橢圓等。

做法:重寫Form1_Paint事件(Form1是窗體的名字),最簡單的一種情況如下:

System.Drawing.Drawing2D.GraphicsPath shape = new System.Drawing.Drawing2D.GraphicsPath(); shape.AddEllipse(0,0,this.Height, this.Width); this.Region = new Region(shape); 

即重繪窗體的規則。

二、利用背景圖片實現

1. 設置窗體的背景圖片,其中背景圖片是24位(不包括24)以下的位圖(BMP圖片),并且要設置TansparencyKey的值,一般為你背景圖片的背景色,即創建不規則圖片時的底色,一般設為你圖片中沒有的顏色。

這種做法的不好的地方就是背景圖片一定要16位或者更低的,而且還要確??蛻舳说娘@示。如果監視器的顏色深度設置大于 24 位,則不管 TransparencyKey 屬性是如何設置的,窗體的非透明部分都會產生顯示問題。若要避免出現這種問題,請確?!帮@示”控制面板中的監視器顏色深度的設置小于 24 位。當開發具有這種透明功能的應用程序時,請牢記應使您的用戶意識到此問題。

實現步驟如下:

1. 新建windows application

2. 選擇窗體,找到BackgroundImage屬性,點擊打開新的窗口,選擇下面的導入資源文件,選擇你的不規則的BMP圖片

3. 找到窗體的TansparencyKey,將它設置為你背景圖片的背景色(如黃色)

4. 找到窗體的FormBorderStyle,將其設置為none,即不顯示標題欄

5. 運行

<!--[endif]-->

2. 跟背景圖片一樣的圖形,不過是動態加載,遍歷位圖以實現不規則窗體。它的原理是這樣的,在Form的load事件中寫方法使得窗體的描繪區域發生改變。

實現步驟如下:

1. 建立winform應用程序

2. 找到窗體的Load事件,雙擊進行編輯

3. 編寫方法,主要的代碼如下:

class BitmapRegion {   public BitmapRegion()   { }     /// <summary>    /// Create and apply the region on the supplied control   /// 創建支持位圖區域的控件(目前有button和form)   /// </summary>    /// <param name="control">The Control object to apply the region to控件</param>    /// <param name="bitmap">The Bitmap object to create the region from位圖</param>    public static void CreateControlRegion(Control control, Bitmap bitmap)   {     // Return if control and bitmap are null     //判斷是否存在控件和位圖     if (control == null || bitmap == null)       return;      // Set our control''s size to be the same as the bitmap     //設置控件大小為位圖大小     control.Width = bitmap.Width;     control.Height = bitmap.Height;     // Check if we are dealing with Form here      //當控件是form時     if (control is System.Windows.Forms.Form)     {       // Cast to a Form object       //強制轉換為FORM       Form form = (Form)control;       // Set our form''s size to be a little larger that the bitmap just        // in case the form''s border style is not set to none in the first place        //當FORM的邊界FormBorderStyle不為NONE時,應將FORM的大小設置成比位圖大小稍大一點       form.Width = control.Width;       form.Height = control.Height;       // No border        //沒有邊界       form.FormBorderStyle = FormBorderStyle.None;       // Set bitmap as the background image        //將位圖設置成窗體背景圖片       form.BackgroundImage = bitmap;       // Calculate the graphics path based on the bitmap supplied        //計算位圖中不透明部分的邊界       GraphicsPath graphicsPath = CalculateControlGraphicsPath(bitmap);       // Apply new region        //應用新的區域       form.Region = new Region(graphicsPath);     }     // Check if we are dealing with Button here      //當控件是button時     else if (control is System.Windows.Forms.Button)     {       // Cast to a button object        //強制轉換為 button       Button button = (Button)control;       // Do not show button text        //不顯示button text       button.Text = "";        // Change cursor to hand when over button        //改變 cursor的style       button.Cursor = Cursors.Hand;       // Set background image of button        //設置button的背景圖片       button.BackgroundImage = bitmap;        // Calculate the graphics path based on the bitmap supplied        //計算位圖中不透明部分的邊界       GraphicsPath graphicsPath = CalculateControlGraphicsPath(bitmap);       // Apply new region        //應用新的區域       button.Region = new Region(graphicsPath);     }   }   /// <summary>    /// Calculate the graphics path that representing the figure in the bitmap    /// excluding the transparent color which is the top left pixel.    /// //計算位圖中不透明部分的邊界   /// </summary>  /// <param name="bitmap">The Bitmap object to calculate our graphics path from</param>    /// <returns>Calculated graphics path</returns>    private static GraphicsPath CalculateControlGraphicsPath(Bitmap bitmap)   {     // Create GraphicsPath for our bitmap calculation      //創建 GraphicsPath     GraphicsPath graphicsPath = new GraphicsPath();     // Use the top left pixel as our transparent color      //使用左上角的一點的顏色作為我們透明色     Color colorTransparent = bitmap.GetPixel(0, 0);     // This is to store the column value where an opaque pixel is first found.    // This value will determine where we start scanning for trailing opaque pixels.     //第一個找到點的X     int colOpaquePixel = 0;     // Go through all rows (Y axis)      // 偏歷所有行(Y方向)     for (int row = 0; row < bitmap.Height; row++)     {       // Reset value        //重設       colOpaquePixel = 0;       // Go through all columns (X axis)        //偏歷所有列(X方向)       for (int col = 0; col < bitmap.Width; col++)       {     // If this is an opaque pixel, mark it and search for anymore trailing behind          //如果是不需要透明處理的點則標記,然后繼續偏歷         if (bitmap.GetPixel(col, row) != colorTransparent)         {           // Opaque pixel found, mark current position           //記錄當前           colOpaquePixel = col;        // Create another variable to set the current pixel position            //建立新變量來記錄當前點           int colNext = col;         // Starting from current found opaque pixel, search for anymore opaque pixels        // trailing behind, until a transparent  pixel is found or minimum width is reached            ///從找到的不透明點開始,繼續尋找不透明點,一直到找到或則達到圖片寬度          for (colNext = colOpaquePixel; colNext < bitmap.Width; colNext++)             if (bitmap.GetPixel(colNext, row) == colorTransparent)               break;       // Form a rectangle for line of opaque  pixels found and add it to our graphics path            //將不透明點加到graphics path       graphicsPath.AddRectangle(new Rectangle(colOpaquePixel, row, colNext - colOpaquePixel, 1));           // No need to scan the line of opaque pixels just found            col = colNext;         }       }     }     // Return calculated graphics path      return graphicsPath;   } } 

4.運行

<!--[endif]-->

三、調用類庫實現

主要就是根據一些坐標,然后根據這些坐標繪制窗體

代碼如下:

public Form3()     {       InitializeComponent();       //創建不規則窗體       POINTAPI[] poin;       poin = new POINTAPI[5];       poin[0].x = 90;       poin[0].y = 90;       poin[1].x = this.Width;       poin[1].y = 0;       poin[2].x = Width;       poin[2].y = this.Height / 2;       poin[3].x = Width / 2;       poin[3].y = Height / 2;       poin[4].x = 0;       poin[4].y = Width;       Boolean flag = true;       IntPtr hRgn = CreatePolygonRgn(ref poin[0], 8, 1);       SetWindowRgn(this.Handle, hRgn, ref flag);       this.BackColor = Color.BurlyWood;     }     [StructLayout(LayoutKind.Sequential)]     private struct POINTAPI     {       internal int x;       internal int y;     }     [DllImport("gdi32.dll")]  private static extern IntPtr CreatePolygonRgn(ref POINTAPI lpPoint,int nCount,int nPolyFillMode);     [DllImport("user32.dll")]  private static extern IntPtr SetWindowRgn(IntPtr hWnd,IntPtr hRgn, ref Boolean bRedraw);     //設置窗體顯示狀態     [DllImport("user32.dll")] private static extern int SetWindowPos(IntPtr hwnd,int hWndInsertAfter,int x,int y,int cx,int cy,int wFlags);     private void Start_Btn_Click(object sender, EventArgs e)     {//始終顯示在前面       SetWindowPos(this.Handle, -1, 0, 0, 0, 0, 1);     }     private void button1_Click(object sender, EventArgs e)     {       //最小化始終顯示在前面       SetWindowPos(this.Handle, -1, 0, 0, 0, 0, 0);     } 

當然,我們也可以自定義窗體的動作,如按著某個軌跡一定,下面的代碼中的BackgroundForm程序中就小試了一下,效果還不錯,下面是這些程序的效果圖: 

代碼是.Net 2.0的,也可以轉換為其他版本的,只要運行主程序即可。

以上的四種方法有利也有弊,希望大家提意見或者更好的解決方案。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品高清一区二区三区| 亚洲一区美女视频在线观看免费| 3344国产精品免费看| 91亚洲va在线va天堂va国| 日本不卡视频在线播放| 亚洲va久久久噜噜噜| 欧美wwwxxxx| 久久99精品久久久久久琪琪| 97av在线视频免费播放| 日韩久久免费视频| 91中文在线观看| 国产精品av免费在线观看| 欧美日韩午夜剧场| 最好看的2019的中文字幕视频| 亚洲色图50p| 中文日韩在线视频| 激情成人在线视频| 性色av一区二区三区红粉影视| 97国产一区二区精品久久呦| 成人久久一区二区三区| www.美女亚洲精品| 欧美xxxx18性欧美| 欧美极品少妇xxxxx| 色噜噜久久综合伊人一本| 欧美专区第一页| 亚洲aⅴ日韩av电影在线观看| 亚洲女同精品视频| 亚洲一区二区三区777| 欧美日韩亚洲网| 97人人做人人爱| 81精品国产乱码久久久久久| www欧美xxxx| 日韩精品在线观看网站| 国产香蕉一区二区三区在线视频| 欧美在线激情网| 亚洲香蕉伊综合在人在线视看| 色狠狠av一区二区三区香蕉蜜桃| 亚洲肉体裸体xxxx137| 国产精品亚洲视频在线观看| 成人女保姆的销魂服务| 国产99视频精品免视看7| 日韩精品一区二区三区第95| 国产欧美最新羞羞视频在线观看| 一本色道久久88综合亚洲精品ⅰ| 亚洲热线99精品视频| 日韩中文在线视频| 奇门遁甲1982国语版免费观看高清| 日本久久久久亚洲中字幕| 亚洲欧洲国产精品| 91中文字幕在线观看| 色噜噜狠狠狠综合曰曰曰| 日本免费在线精品| 国产精品久久久久久亚洲调教| 欧美日韩久久久久| 国产一区二区色| 91视频8mav| 午夜精品在线观看| 久久福利视频网| 亚洲国产精品成人va在线观看| 国内精品免费午夜毛片| 最近2019年中文视频免费在线观看| 欧美大尺度激情区在线播放| 欧美日韩加勒比精品一区| 国产精品自拍视频| 欧美高清一级大片| 欧美大成色www永久网站婷| 欧美三级欧美成人高清www| 亚洲国内高清视频| 久久久亚洲天堂| 亚洲欧美激情精品一区二区| 9.1国产丝袜在线观看| 国产中文日韩欧美| 日韩风俗一区 二区| 中文字幕日本精品| 日韩视频在线免费| 91在线观看免费观看| 欧美重口另类videos人妖| 在线观看欧美成人| 羞羞色国产精品| 亚洲欧美日本伦理| 国产亚洲精品久久久久久777| 日韩亚洲成人av在线| 亚洲精品在线不卡| 久久精品在线视频| 日韩高清电影免费观看完整版| 亚洲一区二区久久久久久久| 欧美性xxxxxx| 国产成人精品免费视频| 91精品国产91久久久久久久久| 国产欧美精品一区二区三区-老狼| 91亚洲精品一区二区| 97国产真实伦对白精彩视频8| 日本高清不卡的在线| 91精品国产高清久久久久久| 国产精品影院在线观看| 国产精品99久久99久久久二8| 成人做爽爽免费视频| 91精品国产777在线观看| 国产精品久久久久久久电影| 亚洲无限乱码一二三四麻| 国产精品尤物福利片在线观看| 国产区亚洲区欧美区| 亚洲午夜色婷婷在线| 亚洲免费中文字幕| 黑人巨大精品欧美一区二区一视频| 国产99久久久欧美黑人| 色婷婷综合成人| 色偷偷888欧美精品久久久| 欧美日韩成人黄色| 国产精品久久久久一区二区| 久久偷看各类女兵18女厕嘘嘘| 亚洲精品视频在线播放| 色综合视频一区中文字幕| 亚洲最新中文字幕| 日韩欧美国产黄色| 欧美成人第一页| 亚洲精品v欧美精品v日韩精品| 久久久av一区| 国产精品久久久久久久av电影| 777午夜精品福利在线观看| 色老头一区二区三区| 色爱精品视频一区| 91精品在线看| 日韩福利伦理影院免费| 亚洲欧美日韩高清| 日韩精品有码在线观看| 国产精品久久久久久久久久东京| 亚洲天堂第一页| 久久男人av资源网站| 高清欧美一区二区三区| 国产精品视频成人| 久久久久久久久国产| 亚洲一区www| 精品视频久久久久久久| 国产91精品青草社区| 日韩欧美在线字幕| 日韩精品在线免费观看| 亚洲女同精品视频| 亚洲最大的网站| 国产精品成人一区二区| 精品人伦一区二区三区蜜桃网站| 国产精品第三页| 国产精品一区久久久| 一区二区成人av| 亚洲а∨天堂久久精品9966| 国产成人精品在线视频| 日韩中文字在线| 91精品免费看| 久久综合久久88| 亚洲www在线观看| 中文在线资源观看视频网站免费不卡| 精品美女久久久久久免费| 91av中文字幕| 欧美精品午夜视频| 国产精品久久77777| 亚洲欧美综合图区| 亚洲人高潮女人毛茸茸| 2019精品视频| 久久精品亚洲94久久精品| 亚洲女人天堂网| 成人黄色激情网| 国产午夜精品久久久| 欧美富婆性猛交| 精品国偷自产在线视频99|