C# 實現TrackBar控制元件美化換膚
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控制元件的美化有所幫助。