C#?TrackBar拖動(dòng)條改變滑塊顏色
本文實(shí)例為大家分享了C# TrackBar拖動(dòng)條改變滑塊顏色的具體代碼,供大家參考,具體內(nèi)容如下
原理
1.TrackBar拖動(dòng)條的滑塊的默認(rèn)顏色是(23,23,23)偏藍(lán)色,遍歷TrackBar控件中的每一個(gè)像素點(diǎn),獲取顏色是(23,23,23)的像素點(diǎn),用另外一種顏色在像素點(diǎn)的位置上繪制直徑為1的圓形。
2.添加布爾值,判斷鼠標(biāo)是否在TrackBar中。
3.在鼠標(biāo)進(jìn)入控件事件中,布爾值為true;在鼠標(biāo)離開控件事件中,布爾值為false。
4.加入1ms的定時(shí)器,在定時(shí)器事件中,如果布爾值為true,則引用改變顏色的方法。
缺陷
定位不是很精準(zhǔn),y方向會(huì)靠下一點(diǎn),在拖動(dòng)的時(shí)候,會(huì)有小bug。所以在應(yīng)用于縱向的TrackBar拖動(dòng)條時(shí),繪制的時(shí)候需要y - (float)0.5。此時(shí)的bug會(huì)不明顯,將就能夠使用。(依然存在的小bug,會(huì)在滑塊的尖兒上,留有痕跡,拖動(dòng)的時(shí)候會(huì)留下混跡,是一個(gè)小點(diǎn)兒,可以再改進(jìn))
代碼
改變顏色的方法:
public class ChangeSliderColor ? ? { ? ? ? ? //改變滑塊顏色(橫向控件) ? ? ? ? public void LevelChangeColor(Bitmap bitmap, Rectangle rectangle,Graphics graphics,Color color,TrackBar trackBar) ? ? ? ? { ? ? ? ? ? ? bitmap = new Bitmap(trackBar.Width, trackBar.Height); ? ? ? ? ? ? rectangle = new Rectangle(0, 0, trackBar.Width, trackBar.Height); ? ? ? ? ? ? graphics = trackBar.CreateGraphics(); ? ? ? ? ? ? trackBar.DrawToBitmap(bitmap, rectangle); ? ? ? ? ? ? for (int x = 0; x < trackBar.Width; x++) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? for (int y = 0;y < trackBar.Height; y++) ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? color = bitmap.GetPixel(x, y); ? ? ? ? ? ? ? ? ? ? if (color == Color.FromArgb(23,23,23)) ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? graphics.DrawEllipse(new Pen(Color.Red), x, y, 1, 1);//這里的new Pen即改變后的顏色 ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? //改變滑塊顏色(豎向控件) ? ? ? ? public void VerticalChangeColor(Bitmap bitmap, Rectangle rectangle, Graphics graphics, Color color, TrackBar trackBar) ? ? ? ? { ? ? ? ? ? ? bitmap = new Bitmap(trackBar.Width, trackBar.Height); ? ? ? ? ? ? rectangle = new Rectangle(0, 0, trackBar.Width, trackBar.Height); ? ? ? ? ? ? graphics = trackBar.CreateGraphics(); ? ? ? ? ? ? trackBar.DrawToBitmap(bitmap, rectangle); ? ? ? ? ? ? for (int x = 0; x < trackBar.Width; x++) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? for (int y = 0; y < trackBar.Height; y++) ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? color = bitmap.GetPixel(x, y); ? ? ? ? ? ? ? ? ? ? if (color == Color.FromArgb(23, 23, 23)) ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? graphics.DrawEllipse(new Pen(Color.Red), x, y - (float)0.5, 1, 1); ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? } ?}
引用:
Bitmap bitmap; Rectangle rectangle; Graphics graphics; Color color; ? ? ? ? bool isIntrackBar = false;//判斷鼠標(biāo)是否在trackBar中 ? ? ? ? private void timer_Tick(object sender, EventArgs e) ? ? ? ? { ? ? ? ? ? ? if (isIntrackBar == true) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ChangeSliderColor csc = new ChangeSliderColor(); ? ? ? ? ? ? ? ? csc.LevelChangeColor(bitmap, rectangle, graphics, color, trackBar); ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? //鼠標(biāo)進(jìn)入trackBar時(shí),布爾值為true ? ? ? ? private void trackBar_MouseEnter(object sender, EventArgs e) ? ? ? ? { ? ? ? ? ? ? isIntrackBar = true; ? ? ? ? } ? ? ? ? //鼠標(biāo)從trackBar中出來時(shí),布爾值為false ? ? ? ? private void trackBar_MouseLeave(object sender, EventArgs e) ? ? ? ? { ? ? ? ? ? ? isIntrackBar = false; ? ? ? ? }
如果是縱向TrackBar,則引用ChangeSliderColor的VerticalChangeColor方法。
如果在一個(gè)窗體中,存在多個(gè)TrackBar,則每個(gè)trackBar一個(gè)布爾值,并在每個(gè)trackBar的MouseEnter事件中加入timer.Start(),在MouseLeave事件中加入timer.Stop(),并在timer_Tick事件中加入判斷。
效果
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#傳值方式實(shí)現(xiàn)不同程序窗體間通信實(shí)例
Form2構(gòu)造函數(shù)中接收一個(gè)string類型參數(shù),即Form1中選中行的文本,將Form2的TextBox控件的Text設(shè)置為該string,即完成了Form1向Form2的傳值2013-12-12C#的靜態(tài)工廠方法與構(gòu)造函數(shù)相比有哪些優(yōu)缺點(diǎn)
這篇文章主要介紹了C#的靜態(tài)工廠方法與構(gòu)造函數(shù)對比的優(yōu)缺點(diǎn),文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07C#與PHP的md5計(jì)算結(jié)果不同的解決方法
今天在用C#接入我的登錄api發(fā)現(xiàn)了一個(gè)問題,登陸的時(shí)候無論如何都會(huì)出現(xiàn)用戶名和密碼錯(cuò)誤的問題,后來通過查找排除找的了問題的原因是因?yàn)镃#與PHP的md5計(jì)算結(jié)果不同導(dǎo)致的,下面就來看看如何解決這個(gè)問題吧。2016-12-12解析從源碼分析常見的基于Array的數(shù)據(jù)結(jié)構(gòu)動(dòng)態(tài)擴(kuò)容機(jī)制的詳解
本篇文章是對從源碼分析常見的基于Array的數(shù)據(jù)結(jié)構(gòu)動(dòng)態(tài)擴(kuò)容機(jī)制進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05