如何移除/隐藏TTrackBar控件的边框?
解决TTrackBar移除边框仅保留箭头的问题
TTrackBar是封装的Windows原生通用控件,VCL自带的Bevel、Border类属性对它不生效,必须通过Windows API或自定义绘制来实现需求,以下是两种可行方案:
方案一:修改控件样式+拦截颜色消息
1. 自定义TrackBar控件拦截消息
继承TTrackBar并重写WndProc,处理WM_CTLCOLORTRACKBAR来设置背景色:
type TCustomTrackBar = class(TTrackBar) protected procedure WndProc(var Message: TMessage); override; end; procedure TCustomTrackBar.WndProc(var Message: TMessage); var DC: HDC; begin inherited; if Message.Msg = WM_CTLCOLORTRACKBAR then begin DC := Message.WParam; // 将背景色设置为clBtnFace SetBkColor(DC, ColorToRGB(clBtnFace)); // 返回系统画刷句柄,确保背景填充生效 Message.Result := LRESULT(GetStockObject(DC_BRUSH)); end; end;
2. 调整控件样式隐藏轨道和边框
在控件构造函数或窗体创建事件中,通过API修改TrackBar的原生样式:
// 移除轨道显示样式,仅保留箭头(刻度)样式 SetWindowLongPtr(Self.Handle, GWL_STYLE, GetWindowLongPtr(Self.Handle, GWL_STYLE) and not (TBS_HORZ or TBS_VERT) or TBS_NOTICKS); // 缩小控件高度,仅显示箭头区域 Self.Height := 16;
方案二:完全自定义绘制(跨系统更稳定)
如果系统主题导致样式修改失效,直接重写WM_PAINT消息自行绘制箭头:
procedure TCustomTrackBar.WndProc(var Message: TMessage); var PaintStruct: TPaintStruct; DC: HDC; LeftArrowRect, RightArrowRect: TRect; begin if Message.Msg = WM_PAINT then begin DC := BeginPaint(Handle, PaintStruct); try // 填充背景为clBtnFace FillRect(DC, ClientRect, GetStockObject(DC_BRUSH)); // 绘制左箭头(水平TrackBar场景) LeftArrowRect := Rect(0, 0, 16, ClientHeight); DrawFrameControl(DC, LeftArrowRect, DFC_SCROLL, DFCS_SCROLLLEFT or DFCS_HOT); // 绘制右箭头 RightArrowRect := Rect(ClientWidth - 16, 0, ClientWidth, ClientHeight); DrawFrameControl(DC, RightArrowRect, DFC_SCROLL, DFCS_SCROLLRIGHT or DFCS_HOT); // 如需显示滑块,可根据Position属性自行绘制滑块位置 finally EndPaint(Handle, PaintStruct); end; Exit; end; inherited; end;
补充:快速修改背景色(无需自定义控件)
如果仅需修改背景色,可在窗体的OnControlColor事件中处理:
procedure TForm1.FormControlColor(Sender: TObject; Control: TWinControl; var Color: TColor); begin if Control is TTrackBar then Color := clBtnFace; end;
但此方法无法隐藏轨道和边框,需配合方案一中的样式修改使用。
内容的提问来源于stack exchange,提问作者HeartWare
相关产品推荐
相关产品推荐

