网站导航网学 原创论文 原创专题 网站设计 最新系统 原创论文 论文降重 发表论文 论文发表 UI设计定制 论文答辩PPT格式排版 期刊发表 论文专题
返回网学首页
网学原创论文
最新论文 推荐专题 热门论文 论文专题
当前位置: 网学 > 设计资源 > .Net编程 > 正文

C#实现TrackBar控件美化换肤【附源码下载】

论文降重修改服务、格式排版等 获取论文 论文降重及排版 论文发表 相关服务

TrackBar控件没有像其他控件那样,直接提供给用户重绘的函数,要实现个性化的TrackBar控件,一种方法是继承Control完全的自己实现,这种方法就是实现标准的Windows控件功能需要自己处理很多东西,例如:实现一样的属性、键盘的操作、鼠标滚动改变TrackBar的值等;另一种方法就是直接继承TrackBar控件,利用TrackBar的一些Windows消息,获取TrackBar控件的信息,然后自己完全重绘,这种方法的好处是保留TrackBar控件的标准操作和属性,但是需要比较清楚的了解TrackBar控件的Windows消息。本文将介绍使用第二种方法实现对TrackBar控件的美化。

 【本文示例源码下载

首先,看看TrackBar控件美化后的效果:

 

下面来了解一下实现TrackBar控件美化需要的一些API消息。TrackBar控件相关的一些消息都是以TBM(TackBar Message)开头的,在TrackBar控件的美化中,主要用到了以下三个消息:

l         TBM_GETCHANNELRECT  获取轨道的位置和大小。

l         TBM_GETTHUMBRECT  获取滑块的位置和大小。

l         TBM_GETNUMTICS  获取刻度的总个数。

要获取这些信息,只需要向TrackBar控件发送相应的消息即可,例如需要获取取轨道的位置和大小:

  1. SendMessage(hWnd, TBM.TBM_GETCHANNELRECT, 0, ref trackRect) 

有了上面的知识,接下来就是重绘TrackBar控件了。重绘TrackBar控件,需要重写WndProc函数,在WM_PAINT消息实现重绘就行了:

  1. protected override void WndProc(ref Message m) 
  2.  
  3.         { 
  4.  
  5.             switch (m.Msg) 
  6.  
  7.             { 
  8.  
  9.                 case WM.WM_PAINT: 
  10.  
  11.                     if (!_bPainting) 
  12.  
  13.                     { 
  14.  
  15.                         _bPainting = true
  16.  
  17.  
  18.  
  19.                         PAINTSTRUCT ps = new PAINTSTRUCT(); 
  20.  
  21.  
  22.  
  23.                         NativeMethods.BeginPaint(m.HWnd, ref ps); 
  24.  
  25.                         DrawTrackBar(m.HWnd); 
  26.  
  27.                         NativeMethods.ValidateRect(m.HWnd, ref ps.rcPaint); 
  28.  
  29.                         NativeMethods.EndPaint(m.HWnd, ref ps); 
  30.  
  31.  
  32.  
  33.                         _bPainting = false
  34.  
  35.                         m.Result = Result.TRUE; 
  36.  
  37.                     } 
  38.  
  39.                     else 
  40.  
  41.                     { 
  42.  
  43.                         base.WndProc(ref m); 
  44.  
  45.                     } 
  46.  
  47.                     break
  48.  
  49.                 default
  50.  
  51.                     base.WndProc(ref m); 
  52.  
  53.                     break
  54.  
  55.             } 
  56.  
  57.         } 

来看看DrawTrackBar函数,DrawTrackBar函数的功能就是获取TrackBar控件的一些信息,然后分别调用四个函数来绘制TrackBar控件:
l OnRenderBackground函数,绘制TrackBar控件的背景。
l OnRenderTick函数,绘制TrackBar控件的刻度。
l OnRenderTrack函数,绘制TrackBar控件的轨道。
l OnRenderThumb函数,绘制TrackBar控件的滑块。
这四个函数都是可以重写的,如果想实现不同样式的TrackBar控件,重写这四个函数,进行相应的绘制即可。看看DrawTrackBar函数的具体代码:

  1. private void DrawTrackBar(IntPtr hWnd) 
  2.  
  3.         { 
  4.  
  5.             ControlState state = ControlState.Normal; 
  6.  
  7.             bool horizontal = base.Orientation == Orientation.Horizontal; 
  8.  
  9.             ImageDc tempDc = new ImageDc(base.Width, base.Height); 
  10.  
  11.             RECT trackRect = new RECT(); 
  12.  
  13.             RECT thumbRect = new RECT(); 
  14.  
  15.  
  16.  
  17.             Graphics g = Graphics.FromHdc(tempDc.Hdc); 
  18.  
  19.  
  20.  
  21.             NativeMethods.SendMessage( 
  22.  
  23.                 hWnd, TBM.TBM_GETCHANNELRECT, 0, ref trackRect); 
  24.  
  25.             NativeMethods.SendMessage( 
  26.  
  27.                 hWnd, TBM.TBM_GETTHUMBRECT, 0, ref thumbRect); 
  28.  
  29.  
  30.  
  31.             Rectangle trackRectangle = horizontal ? 
  32.  
  33.                 trackRect.Rect : 
  34.  
  35.                 Rectangle.FromLTRB( 
  36.  
  37.                 trackRect.Top, trackRect.Left, 
  38.  
  39.                 trackRect.Bottom, trackRect.Right); 
  40.  
  41.  
  42.  
  43.             if (ThumbHovering(thumbRect)) 
  44.  
  45.             { 
  46.  
  47.                 if (Helper.LeftKeyPressed()) 
  48.  
  49.                 { 
  50.  
  51.                     state = ControlState.Pressed; 
  52.  
  53.                 } 
  54.  
  55.                 else 
  56.  
  57.                 { 
  58.  
  59.                     state = ControlState.Hover; 
  60.  
  61.                 } 
  62.  
  63.             } 
  64.  
  65.  
  66.  
  67.             using (PaintEventArgs pe = new PaintEventArgs( 
  68.  
  69.                 g, ClientRectangle)) 
  70.  
  71.             { 
  72.  
  73.                 OnRenderBackground(pe); 
  74.  
  75.             } 
  76.  
  77.  
  78.  
  79.             int ticks = NativeMethods.SendMessage( 
  80.  
  81.                 hWnd, TBM.TBM_GETNUMTICS, 0, 0); 
  82.  
  83.  
  84.  
  85.             if (ticks > 0) 
  86.  
  87.             { 
  88.  
  89.                 List<float> tickPosList = new List<float>(ticks); 
  90.  
  91.  
  92.  
  93.                 int thumbOffset = horizontal ?  
  94.  
  95.                     thumbRect.Rect.Width : thumbRect.Rect.Height; 
  96.  
  97.                 int trackWidth = trackRect.Right - trackRect.Left; 
  98.  
  99.                 float tickSpace = (trackWidth - thumbOffset) / (float)(ticks - 1); 
  100.  
  101.                 float offset = trackRect.Left + thumbOffset / 2f; 
  102.  
  103.  
  104.  
  105.                 for(int pos = 0; pos < ticks; pos ++) 
  106.  
  107.                 { 
  108.  
  109.                     tickPosList.Add(offset + tickSpace * pos); 
  110.  
  111.                 } 
  112.  
  113.  
  114.  
  115.                 using (PaintTickEventArgs pte = new PaintTickEventArgs( 
  116.  
  117.                     g, trackRectangle, tickPosList)) 
  118.  
  119.                 { 
  120.  
  121.                     OnRenderTick(pte); 
  122.  
  123.                 } 
  124.  
  125.             } 
  126.  
  127.  
  128.  
  129.             using (PaintEventArgs pe = new PaintEventArgs( 
  130.  
  131.                 g, trackRectangle)) 
  132.  
  133.             { 
  134.  
  135.                 OnRenderTrack(pe); 
  136.  
  137.             } 
  138.  
  139.  
  140.  
  141.             using (PaintThumbEventArgs pe = new PaintThumbEventArgs( 
  142.  
  143.                 g, thumbRect.Rect, state)) 
  144.  
  145.             { 
  146.  
  147.                 OnRenderThumb(pe); 
  148.  
  149.             } 
  150.  
  151.  
  152.  
  153.             g.Dispose(); 
  154.  
  155.             IntPtr hDC = NativeMethods.GetDC(hWnd); 
  156.  
  157.             NativeMethods.BitBlt( 
  158.  
  159.                 hDC, 0, 0, base.Width, base.Height,  
  160.  
  161.                 tempDc.Hdc, 0, 0, 0xCC0020); 
  162.  
  163.             NativeMethods.ReleaseDC(hWnd, hDC); 
  164.  
  165.             tempDc.Dispose(); 
  166.  
  167.         } 

 

最后需要说明的是,扩展后的TrackBar控件还实现了一个ColorTable属性,只要通过ColorTable设置相应的颜色,就可以得到不同颜色效果的TrackBar控件了。看看TrackBar控件的完整类视图:

 

    TrackBar控件的美化换肤到此就实现了,希望对你了解TrackBar控件的美化有所帮助。

  • 下一篇资讯: JS关键字加亮
  • 设为首页 | 加入收藏 | 网学首页 | 原创论文 | 计算机原创
    版权所有 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2020 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号 常年法律顾问:王律师