5,388
社区成员
发帖
与我相关
我的任务
分享
var
BarInfo: TScrollBarInfo;
BarInfo.cbSize := SizeOf(BarInfo);
GetScrollBarInfo(Handle, Integer(OBJID_VSCROLL), BarInfo);
TWinScroll = class(TCustomControl)
procedure TWinScroll.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.Style := Params.Style or WS_CHILDWINDOW or WS_CLIPCHILDREN or WS_CLIPSIBLINGS;
Params.ExStyle := Params.ExStyle or WS_EX_NOPARENTNOTIFY or WS_EX_NOACTIVATE;
end;
2、设置自定义滚动条消息透明(不响应鼠标消息,直接由底部的滚动条实体处理滚动)
procedure TWinScroll.WMNCHitTest(var Msg: TWMNCHitTest);
begin
Msg.Result := HTTRANSPARENT;
end;
3、截获控件所有消息,优先处理
procedure TmtSkinScrollBars.SetControl(Value: TControl);
begin
if (FControl <> nil) and (@FDefaultWndProc <> nil) then
FControl.WindowProc := FDefaultWndProc;
FControl := Value;
FDefaultWndProc := FControl.WindowProc;
FControl.WindowProc := ssbWndProc;
4、缩小非客户去,用于滚动条变小
SCROLL_SHRINKWIDTH = 3; // 滚动条瘦身量
WM_NCCALCSIZE:
begin
FDefaultWndProc(Message);
if SCROLL_SHRINKWIDTH > 0 then
with TWMNCCalcSize(Message).CalcSize_Params^ do
begin
rgrc[0].Right := rgrc[0].Right + SCROLL_SHRINKWIDTH;
rgrc[0].Bottom := rgrc[0].Bottom + SCROLL_SHRINKWIDTH ;
end;
end;
5、计算位置,覆盖滚动条。
CalcScrollBarsRect;
UpdateScrollBarWindow;
PaintScrollBars;
/// 由于滚动体(非客户区)缩小,需要考虑缩小后出现的滚动条偏移问题。
/// Border TopLeft 偏移要考虑在内。
function TmtSkinScrollBars.GetBorderTopLeft: TPoint;
var
PWnd: HWND;
CP, PP: TPoint;
begin
Result := Point(0, 0);
PWnd := GetParent(Handle);
CP := Point(0, 0);
ClientToScreen(Handle, CP);
with GetBoundsRect do PP := Point(Left, Top);
ClientToScreen(PWnd, PP);
Result := Point(CP.X - PP.X, CP.Y - PP.Y);
end;
解决了滚动条问题。
procedure TMyGrid.WMNCCalcSize(var Message: TWMNCCalcSize);
begin
inherited;
// 这样确实能把滚动条挤边上去
Message.CalcSize_Params^.rgrc[0].Right := Message.CalcSize_Params^.rgrc[0].Right + 5;
end;