C# WinForm制作異形窗體與控件的方法
本文實(shí)例講述了C# WinForm制作異形窗體與控件的方法。分享給大家供大家參考,具體如下:
制作異形窗體或控件的思路一般都是想辦法生成一個(gè)region,然后設(shè)置給指定的窗口或控件。生成region的方法有很多,最常用的就是從一幅圖片生成,把該圖片中的透明色部分“摳”掉,剩下的部分作為一個(gè)region。設(shè)置窗口或控件的region可以用SetWindowRgn API,不過(guò).NET framework封裝了這個(gè)操作,在C#中只要對(duì)窗口或控件的Region屬性賦值就可以了。下面我就把我在C#中實(shí)現(xiàn)異形窗體的核心代碼貼出來(lái)給大家看看,有什么意見(jiàn)盡管提,別客氣哦
首先,是一個(gè)根據(jù)Bitmap對(duì)象生成Region的方法:
/// <summary> /// 取得一個(gè)圖片中非透明色部分的區(qū)域。 /// </summary> /// <param name="Picture">取其區(qū)域的圖片。</param> /// <param name="TransparentColor">透明色。</param> /// <returns>圖片中非透明色部分的區(qū)域</returns> private Region BmpRgn(Bitmap Picture, Color TransparentColor) { int nWidth = Picture.Width; int nHeight = Picture.Height; Region rgn = new Region(); rgn.MakeEmpty(); bool isTransRgn;//前一個(gè)點(diǎn)是否在透明區(qū) Color curColor;//當(dāng)前點(diǎn)的顏色 Rectangle curRect = new Rectangle(); curRect.Height = 1; int x = 0, y = 0; //逐像素掃描這個(gè)圖片,找出非透明色部分區(qū)域并合并起來(lái)。 for(y = 0; y < nHeight; ++y) { isTransRgn = true; for (x = 0; x < nWidth; ++x) { curColor = Picture.GetPixel(x,y); if(curColor == TransparentColor || x == nWidth - 1)//如果遇到透明色或行尾 { if(isTransRgn == false)//退出有效區(qū) { curRect.Width = x - curRect.X; rgn.Union(curRect); } } else//非透明色 { if(isTransRgn == true)//進(jìn)入有效區(qū) { curRect.X = x; curRect.Y = y; } }//if curColor isTransRgn = curColor == TransparentColor; }//for x }//for y return rgn; }
原理很簡(jiǎn)單,就是對(duì)該圖片逐行掃描,在每一行中把那些非透明色的矩形(只有一個(gè)像素高)合并(union)到一個(gè)Region對(duì)象中,當(dāng)掃描完整個(gè)圖片,得到的也就是我們想要的Region了。這種算法在很多文章里都有介紹的。
有了region,下面就簡(jiǎn)單了:
this.Region = BmpRgn(new Bitmap("d:\\a.bmp"), Color.FromArgb(0, 0, 0));
上面的代碼就是把d:\a.bmp的輪廓作為主窗口的region的,假設(shè)該圖片的背景黑色(Color.FromArgb(0, 0, 0))。
其實(shí)不光是Form,任何控件都可以用這個(gè)方法設(shè)置Region,制作出異形控件。
更多關(guān)于C#相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《C#窗體操作技巧匯總》、《C#數(shù)據(jù)結(jié)構(gòu)與算法教程》、《C#常見(jiàn)控件用法教程》、《C#面向?qū)ο蟪绦蛟O(shè)計(jì)入門(mén)教程》及《C#程序設(shè)計(jì)之線程使用技巧總結(jié)》
希望本文所述對(duì)大家C#程序設(shè)計(jì)有所幫助。
上一篇:C#實(shí)現(xiàn)文件上傳以及多文件上傳功能
欄 目:C#教程
下一篇:IIS下調(diào)用證書(shū)出現(xiàn)異常的解決方法 (C#)
本文標(biāo)題:C# WinForm制作異形窗體與控件的方法
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/5733.html
您可能感興趣的文章
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10WinForm實(shí)現(xiàn)仿視頻 器左下角滾動(dòng)新聞效果的方法
- 01-10C#實(shí)現(xiàn)Winform中打開(kāi)網(wǎng)頁(yè)頁(yè)面的方法
- 01-10winform實(shí)現(xiàn)創(chuàng)建最前端窗體的方法
- 01-10WinForm實(shí)現(xiàn)自定義右下角提示效果的方法
- 01-10.net2.0+ Winform項(xiàng)目實(shí)現(xiàn)彈出容器層
- 01-10winform 實(shí)現(xiàn)控制輸入法
- 01-10WinForm實(shí)現(xiàn)程序一段時(shí)間不運(yùn)行自動(dòng)關(guān)閉的方法
- 01-10Winform消除button按下出現(xiàn)的虛線簡(jiǎn)單實(shí)現(xiàn)方法


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 01-10C#通過(guò)反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁(yè)無(wú)法打開(kāi)的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
- 01-10WinForm實(shí)現(xiàn)仿視頻 器左下角滾動(dòng)新
- 01-10C#停止線程的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#通過(guò)重寫(xiě)Panel改變邊框顏色與寬度的
- 01-10C#實(shí)現(xiàn)讀取注冊(cè)表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 01-10delphi制作wav文件的方法
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 04-02jquery與jsp,用jquery
- 01-10C#中split用法實(shí)例總結(jié)