C# 实现TrackBar控件美化换肤
来源:互联网 发布:单片机卡尔曼滤波 编辑:程序博客网 时间:2024/06/03 16:48
http://www.vspub.com/viewthread.php?tid=6043
TrackBar控件没有像其他控件那样,直接提供给用户重绘的函数,要实现个性化的TrackBar控件,一种方法是继承Control完全的自己实现,这种方法就是实现标准的Windows控件功能需要自己处理很多东西,例如:实现一样的属性、键盘的操作、鼠标滚动改变TrackBar的值等;另一种方法就是直接继承TrackBar控件,利用TrackBar的一些Windows消息,获取TrackBar控件的信息,然后自己完全重绘,这种方法的好处是保留TrackBar控件的标准操作和属性,但是需要比较清楚的了解TrackBar控件的Windows消息。本文将介绍使用第二种方法实现对TrackBar控件的美化。
下面来了解一下实现TrackBar控件美化需要的一些API消息。TrackBar控件相关的一些消息都是以TBM(TackBar Message)开头的,在TrackBar控件的美化中,主要用到了以下三个消息:
TBM_GETCHANNELRECT 获取轨道的位置和大小。
TBM_GETTHUMBRECT 获取滑块的位置和大小。
TBM_GETNUMTICS 获取刻度的总个数。
要获取这些信息,只需要向TrackBar控件发送相应的消息即可,例如需要获取取轨道的位置和大小:SendMessage(hWnd, TBM.TBM_GETCHANNELRECT, 0, ref trackRect)。
有了上面的知识,接下来就是重绘TrackBar控件了。重绘TrackBar控件,需要重写WndProc函数,在WM_PAINT消息实现重绘就行了:
- protected override void WndProc(ref Message m)
- {
- switch (m.Msg)
- {
- case WM.WM_PAINT:
- if (!_bPainting)
- {
- _bPainting = true;
- PAINTSTRUCT ps = new PAINTSTRUCT();
- NativeMethods.BeginPaint(m.HWnd, ref ps);
- DrawTrackBar(m.HWnd);
- NativeMethods.ValidateRect(m.HWnd, ref ps.rcPaint);
- NativeMethods.EndPaint(m.HWnd, ref ps);
- _bPainting = false;
- m.Result = Result.TRUE;
- }
- else
- {
- base.WndProc(ref m);
- }
- break;
- default:
- base.WndProc(ref m);
- break;
- }
- }
来看看DrawTrackBar函数,DrawTrackBar函数的功能就是获取TrackBar控件的一些信息,然后分别调用四个函数来绘制TrackBar控件:
OnRenderBackground函数,绘制TrackBar控件的背景。
OnRenderTick函数,绘制TrackBar控件的刻度。
OnRenderTrack函数,绘制TrackBar控件的轨道。
OnRenderThumb函数,绘制TrackBar控件的滑块。
这四个函数都是可以重写的,如果想实现不同样式的TrackBar控件,重写这四个函数,进行相应的绘制即可。看看DrawTrackBar函数的具体代码:
- private void DrawTrackBar(IntPtr hWnd)
- {
- ControlState state = ControlState.Normal;
- bool horizontal = base.Orientation == Orientation.Horizontal;
- ImageDc tempDc = new ImageDc(base.Width, base.Height);
- RECT trackRect = new RECT();
- RECT thumbRect = new RECT();
- Graphics g = Graphics.FromHdc(tempDc.Hdc);
- NativeMethods.SendMessage(hWnd, TBM.TBM_GETCHANNELRECT, 0, ref trackRect);
- NativeMethods.SendMessage(hWnd, TBM.TBM_GETTHUMBRECT, 0, ref thumbRect);
- Rectangle trackRectangle = horizontal ? trackRect.Rect :Rectangle.FromLTRB(trackRect.Top, trackRect.Left,trackRect.Bottom, trackRect.Right);
- if (ThumbHovering(thumbRect))
- {
- if (Helper.LeftKeyPressed())
- {
- state = ControlState.Pressed;
- }
- else
- {
- state = ControlState.Hover;
- }
- }
- using (PaintEventArgs pe = new PaintEventArgs(g, ClientRectangle))
- {
- OnRenderBackground(pe);
- }
- int ticks = NativeMethods.SendMessage(hWnd, TBM.TBM_GETNUMTICS, 0, 0);
- if (ticks > 0)
- {
- List<float> tickPosList = new List<float>(ticks);
- int thumbOffset = horizontal ?thumbRect.Rect.Width : thumbRect.Rect.Height;
- int trackWidth = trackRect.Right - trackRect.Left;
- float tickSpace = (trackWidth - thumbOffset) / (float)(ticks - 1);
- float offset = trackRect.Left + thumbOffset / 2f;
- for (int pos = 0; pos < ticks; pos++)
- {
- tickPosList.Add(offset + tickSpace * pos);
- }
- using (PaintTickEventArgs pte = new PaintTickEventArgs(g, trackRectangle, tickPosList))
- {
- OnRenderTick(pte);
- }
- }
- using (PaintEventArgs pe = new PaintEventArgs( g, trackRectangle))
- {
- OnRenderTrack(pe);
- }
- using (PaintThumbEventArgs pe = new PaintThumbEventArgs( g, thumbRect.Rect, state))
- {
- OnRenderThumb(pe);
- }
- g.Dispose();
- IntPtr hDC = NativeMethods.GetDC(hWnd);
- NativeMethods.BitBlt( hDC, 0, 0, base.Width, base.Height,tempDc.Hdc, 0, 0, 0xCC0020);
- NativeMethods.ReleaseDC(hWnd, hDC);
- tempDc.Dispose();
- }
最后需要说明的是,扩展后的TrackBar控件还实现了一个ColorTable属性,只要通过ColorTable设置相应的颜色,就可以得到不同颜色效果的TrackBar控件了。
TrackBar控件的美化换肤到此就实现了,希望对你了解TrackBar控件的美化有所帮助。
- C# 实现TrackBar控件美化换肤
- C# WinForm ComboBox控件美化换肤
- C# WinForm ListView控件美化换肤
- C# 美化窗体(换肤)
- C#界面美化之换肤
- VC 换肤 美化
- 用 IrisSkin 为C# winform 换肤 美化
- C#实现窗体换肤
- MFC界面换肤美化
- C# SkinCrafter 换肤控件的使用
- C#界面美化之美化单个控件
- C# 控件提换
- C# TrackBar 控件调节 窗体透明度及颜色渐变
- C#实现按钮美化
- 跟我学做c#皮肤美化(七)----窗体换肤
- Skin控件 C# Winform窗体美化控件
- 用C#实现换肤功能 - winform
- C# WinForm控件美化扩展系列之实现点击收缩的SplitContainer控件
- ubuntu上安装mongodb
- libxml的使用(4)--xpath搜索节点树
- 代码实现退出app
- libxml读取xml文件的其他方法
- postgresql安装
- C# 实现TrackBar控件美化换肤
- VC得到当前电脑的CPU信息
- iPhone实战:操作SQLite
- 四种进程或线程同步互斥的控制方法
- Linux进程调度时机
- 上海纽约大学正式成立 大陆生每学年10万学费-上海纽约大学-学费-学生
- 如何下载并编译Android4.0内核源码goldfish(图文)
- AT&T汇编针对x86指令集格式
- android json解析及简单例子