自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

C#動(dòng)態(tài)圖像按鈕創(chuàng)建步驟

開(kāi)發(fā) 后端
本文介紹C#動(dòng)態(tài)圖像按鈕,制作圖片按鈕肯定是要為這個(gè)button賦值一個(gè)圖像文件的,我們需要公開(kāi)一個(gè)屬性。

前一陣子參與一個(gè)項(xiàng)目開(kāi)發(fā),好友總是抱怨工具欄按鈕太簡(jiǎn)陋了:要是弄得炫一點(diǎn)該多好啊,看看人家mac的桌面工具欄!事實(shí)也的確如此,現(xiàn)在越來(lái)越多的程序界面做的是相當(dāng)?shù)目岚。瑹o(wú)論是什么平臺(tái)mac、windows還是linux,其界面元素越來(lái)越豐富,一個(gè)小小的button背景都要在鼠標(biāo)的不同事件激活下漸變來(lái)漸變?nèi)?。但是,遍歷VS IDE中默認(rèn)的工具集合我們是無(wú)論如何也找不到如此復(fù)雜的控件的,所以,我們必須借助強(qiáng)大的.Net框架以及GDI+自己動(dòng)手來(lái)制作類(lèi)似的工具欄按鈕控件。

我們要?jiǎng)?chuàng)建的控件簡(jiǎn)單說(shuō)就是一個(gè)動(dòng)態(tài)漸變的C#動(dòng)態(tài)圖像按鈕

這個(gè)button控件依舊繼承自UserControl,UserControl是制作自定義UI控件絕對(duì)的父類(lèi),這里不再細(xì)說(shuō)。我們?yōu)檫@個(gè)button取名為DynamicImageButton。制作圖像按鈕當(dāng)然離不開(kāi)繪制,所以還得用到GDI+,我曾經(jīng)寫(xiě)過(guò)多篇關(guān)于界面元素的文章,比如”利用.Net繪圖技術(shù)制作水晶按鈕控件”、” 利用C#實(shí)現(xiàn)任務(wù)欄通知窗口”、” 利用C#為數(shù)碼照片添加拍照日期”、” C#實(shí)現(xiàn)運(yùn)行時(shí)拖動(dòng)控件并調(diào)整控件大小”等等,其中都會(huì)涉及到GDI+的諸多方面,可見(jiàn)GDI+在設(shè)計(jì)制作UI上是多么的重要啊!

對(duì)于按鈕圖片透明度漸變的操作則比較有技巧,采取了個(gè)人認(rèn)為比較另類(lèi)卻極其高效的方法。制作圖片按鈕肯定是要為這個(gè)button賦值一個(gè)圖像文件的,我們需要公開(kāi)一個(gè)屬性,代碼如下:

  1. public Bitmap Image  
  2. {  
  3. get { return bmp[0]; }  
  4. set  
  5. {  
  6. bmp[0] = value;  
  7. bmp[1] = returnAlpha(value, 60);  
  8. bmp[2] = returnAlpha(value, 120); ;  
  9. bmp[3] = returnAlpha(value, 180); ;  
  10. draw();  
  11. }  

大家注意到,當(dāng)給這個(gè)DynamicImageButton的 image屬性賦值一幅圖片后,立即就會(huì)對(duì)這個(gè)原始圖片經(jīng)過(guò)4種不同的alpha過(guò)濾后分別存放到bmp位圖數(shù)組下。bmp[0]保存原始圖像,bmp[3]的圖像則最透明。這就是本程序的特點(diǎn)所在,也就是在運(yùn)行時(shí)是不進(jìn)行圖像透明度漸變計(jì)算的,在給image屬性賦值時(shí)計(jì)算工作同時(shí)也已經(jīng)完成了,這樣可以省下鼠標(biāo)移動(dòng)事件的巨大計(jì)算量。

returnAlpha方法就是將原始圖像中的每一個(gè)像素按照相應(yīng)的alpha值進(jìn)行重新繪制后保存在bmp數(shù)組中,不同透明度的圖像作為bmp數(shù)組的不同元素進(jìn)行保存。代碼如下:

  1. public static Bitmap returnAlpha(Bitmap bmp, int alpha)  
  2. {  
  3. Color col;  
  4. Bitmap bmp2 = new Bitmap(bmp);  
  5. for (int i = 0; i < bmp.Width; i++)  
  6. for (int j = 0; j < bmp.Height; j++)  
  7. {  
  8. col = bmp.GetPixel(i, j);  
  9. if (col.A > 0)  
  10. bmp2.SetPixel(i, j, Color.FromArgb(min(col.A - alpha), col.R, col.G, col.B));  
  11. }  
  12. return bmp2;  

到這里大家可能就已經(jīng)明白我的用意了,沒(méi)錯(cuò)!從原始圖像到最終圖像的透明漸變我只設(shè)計(jì)了4幀!其實(shí),這對(duì)于一個(gè)小小的button動(dòng)畫(huà)來(lái)說(shuō)已經(jīng)完全足夠了。對(duì)于圖像的繪制方法我們?nèi)耘f采用雙緩沖區(qū)繪制,也就是內(nèi)存復(fù)制,實(shí)際上就是雙bitmap對(duì)象交替使用,這樣可以更好的防止圖像閃爍(參見(jiàn)我的另一篇文章” .NET框架下使用雙緩沖技術(shù)繪圖”)。相關(guān)代碼如下:

  1. private void DynamicImageButton_Paint(object sender, System.EventArgs e)  
  2. {  
  3. g2 = Graphics.FromImage(dblbuffer);  
  4. g2.Clear(this.BackColor);  
  5. curx = (int)((double)Width) / 6;  
  6. cury = (int)((double)Height) / 6;  
  7. curwidth = (int)((double)Width) / 3 * 2;  
  8. curheight = (int)((double)Height) / 3 * 2;  
  9. itvwidth = (Width - curwidth) / 2;  
  10. g2.DrawImage(bmp[3], curx, cury, curwidth, curheight);  
  11. g.DrawImageUnscaled(dblbuffer, 0, 0);  

然后就是對(duì)C#動(dòng)態(tài)圖像按鈕大小漸變的控制了,如下圖所示:

圖像按鈕大小

 

a、b、c和d四個(gè)矩形代表不同大小的4個(gè)幀,a幀是裝載圖像時(shí)的默認(rèn)大小,就是bmp[0]的圖像,也是4幀中***的一幀,width=75和 height=72是我們示例程序控件的大小,網(wǎng)友可以隨意對(duì)長(zhǎng)寬進(jìn)行重新設(shè)定。這兩個(gè)數(shù)值是基礎(chǔ),bmp[0]的圖像會(huì)完全填充到這個(gè)區(qū)域內(nèi),在這個(gè)給定的長(zhǎng)和寬的基礎(chǔ)上我們計(jì)算出b、c和d三幀的圖像大小和位置。然后創(chuàng)建一個(gè)計(jì)數(shù)器,當(dāng)鼠標(biāo)Enter或者Leave我們創(chuàng)建的這個(gè) DynamicImageButton時(shí)對(duì)圖像的透明度和大小的漸變進(jìn)行控制。相關(guān)代碼如下:

  1. private void timer1_Tick(object sender, EventArgs e)  
  2. {  
  3. if (mp == enumMousePosition.Enter)  
  4. {  
  5. if ((curx <= 0) || (cury <= 0) || (Width == curwidth) || (Height == curheight))  
  6. {  
  7. return;  
  8. }  
  9. g2 = Graphics.FromImage(dblbuffer);  
  10. g2.Clear(this.BackColor);  
  11. //g2.Clear(Color.White);  
  12. if (curx >= itvwidth-2)  
  13. {  
  14. g2.DrawImage(bmp[3], curx - 1, cury - 1, curwidth + 2, curheight + 2);  
  15. }  
  16. else if ((curx>= itvwidth / 3 * 2) && (curx < itvwidth))  
  17. {  
  18. g2.DrawImage(bmp[2], curx - 1, cury - 1, curwidth + 2, curheight + 2);  
  19. }  
  20. else if ((curx >= itvwidth / 3) && (curx <= itvwidth / 3 * 2))  
  21. {  
  22. g2.DrawImage(bmp[1], curx - 1, cury - 1, curwidth + 2, curheight + 2);  
  23. }  
  24. else if ((curx >= 0) && (curx <= itvwidth / 3))  
  25. {  
  26. g2.DrawImage(bmp[0], curx - 1, cury - 1, curwidth + 2, curheight + 2);  
  27. }  
  28. g.DrawImageUnscaled(dblbuffer, 0, 0);  
  29. curx--;  
  30. cury--;  
  31. curwidthcurwidth = curwidth + 2;  
  32. curheightcurheight = curheight + 2;  
  33. if ((curx <= 0) || (cury <= 0) || (Width == curwidth) || (Height == curheight))  
  34. {  
  35. timer1.Stop();  
  36. }  
  37. }  
  38. else if (mp == enumMousePosition.Leave)  
  39. {  
  40. if ((curx >= (int)((double)Width) / 6) ||  
  41. (cury >= (int)((double)Height) / 6) ||  
  42. (curwidth <= (int)((double)Width) / 3 * 2) ||  
  43. (curheight == (int)((double)Height) / 3 * 2))  
  44. {  
  45. return;  
  46. }  
  47. g2 = Graphics.FromImage(dblbuffer);  
  48. g2.Clear(this.BackColor);  
  49. //g2.Clear(Color.White);  
  50. if (curx >= itvwidth-2)  
  51. {  
  52. g2.DrawImage(bmp[3], curx - 1, cury - 1, curwidth + 2, curheight + 2);  
  53. }  
  54. else if ((curx >= itvwidth / 3 * 2) && (curx < itvwidth))  
  55. {  
  56. g2.DrawImage(bmp[2], curx - 1, cury - 1, curwidth + 2, curheight + 2);  
  57. }  
  58. else if ((curx >= itvwidth / 3) && (curx <= itvwidth / 3 * 2))  
  59. {  
  60. g2.DrawImage(bmp[1], curx - 1, cury - 1, curwidth + 2, curheight + 2);  
  61. }  
  62. else if ((curx >= 0) && (curx <= itvwidth / 3))  
  63. {  
  64. g2.DrawImage(bmp[0], curx - 1, cury - 1, curwidth + 2, curheight + 2);  
  65. }  
  66. g.DrawImageUnscaled(dblbuffer, 0, 0);  
  67. curx++;  
  68. cury++;  
  69. curwidthcurwidth = curwidth - 2;  
  70. curheightcurheight = curheight - 2;  
  71. if ((curx >= (int)((double)Width) / 6) ||  
  72. (cury >= (int)((double)Height) / 6) ||  
  73. (curwidth <= (int)((double)Width) / 3 * 2) ||  
  74. (curheight == (int)((double)Height) / 3 * 2))  
  75. {  
  76. timer1.Stop();  
  77. }  
  78. }  
  79. }  

至此,一個(gè)超酷的C#動(dòng)態(tài)圖像按鈕就制作完畢了,該程序在Windows XP SP3 +VS2005 C# SP1環(huán)境下編譯調(diào)試通過(guò)。

【編輯推薦】

  1. C#數(shù)據(jù)庫(kù)查詢(xún)和操作大全
  2. 淺析C#擴(kuò)展方法
  3. C# Singleton的使用及優(yōu)缺點(diǎn)探討
  4. 詳細(xì)分析C#數(shù)據(jù)庫(kù)連接池
  5. C#數(shù)據(jù)庫(kù)備份及還原的實(shí)現(xiàn)代碼
責(zé)任編輯:佚名 來(lái)源: IT168
相關(guān)推薦

2009-12-08 11:16:07

PHP動(dòng)態(tài)圖像創(chuàng)建

2024-09-11 14:46:48

C#旋轉(zhuǎn)按鈕

2009-08-18 14:25:05

C# 操作Excel

2009-09-02 16:20:22

C#動(dòng)態(tài)創(chuàng)建數(shù)組

2009-09-02 16:14:21

C#動(dòng)態(tài)創(chuàng)建數(shù)組

2009-01-19 10:03:58

C#XML動(dòng)態(tài)分層菜單

2010-09-13 09:03:49

Access數(shù)據(jù)庫(kù)

2010-09-09 08:52:19

JavascriptDIV

2009-09-02 10:58:02

C#動(dòng)態(tài)數(shù)組

2009-08-31 13:41:24

C#創(chuàng)建PDF文件

2009-08-25 17:13:57

C#串口編程

2009-08-13 17:15:44

C#屏幕保護(hù)程序

2009-08-14 15:02:24

Service模板C#創(chuàng)建

2009-09-17 18:14:05

C#動(dòng)態(tài)數(shù)組

2009-08-27 16:29:18

C#動(dòng)態(tài)編譯

2009-09-17 17:44:51

C#動(dòng)態(tài)數(shù)組

2009-09-17 17:40:36

C#動(dòng)態(tài)數(shù)組

2009-09-07 04:59:12

C#模式窗體

2009-06-09 15:52:40

C#指針圖像操

2009-07-31 18:28:46

實(shí)現(xiàn)C#顯示圖像
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)