2013-02-06 63 views
1

我发现像下面的一些示例代码,试图自定义滚动条颜色:如何自定义滚动条颜色?

HBRUSH CMainFrame::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)  
{ 
    HBRUSH hbr = CFrameWnd::OnCtlColor(pDC, pWnd, nCtlColor); 

    if(nCtlColor==CTLCOLOR_SCROLLBAR) 
     return m_brColor; 

    return hbr; 
} 

我发现下面的代码不起作用:

procedure TForm1.WMCTLColor(var msg: TWMCTLCOLOR); message WM_CTLCOLOR; 

我怎么能做到这一点在Delphi?

回答

2

本地api中没有WM_CTLCOLOR消息。相反,您可以使用CN_CTLCOLORSCROLLBAR控制通知,该通知由VCL发送到子控件,以响应API的WM_CTLCOLORSCROLLBAR

type 
    TScrollBar = class(TScrollBar) 
    protected 
    procedure WMCtlColor(var Message: TWMCtlColorScrollbar); message CN_CTLCOLORSCROLLBAR; 
    end; 

procedure TScrollBar.WMCtlColor(var Message: TWMCtlColor); 
begin 
    Message.Result := CreateSolidBrush(RGB(255, 255, 0)); 
end; 


或者,如果你不想得到一个新的控制,提供滚动条放置在窗体上:

TForm1 = class(TForm) 
    ... 
    protected 
    procedure WMCtlColorScrollbar(var Message: TWMCtlColorScrollbar); 
     message WM_CTLCOLORSCROLLBAR; 
    ... 
    end; 

procedure TForm1.WMCtlColorScrollbar(var Message: TWMCtlColorScrollbar); 
begin 
    if Message.ChildWnd = ScrollBar1.Handle then 
    Message.Result := CreateSolidBrush(RGB(255, 255, 0)); 
end; 
+0

我试过,但它不起作用。只有当我的表单有TScrollBar时它才能工作吗?我的演示代码只有一个TMemo,并将ScrollBar设置为ssBoth –

+3

显然,您需要将代码附加到正确的窗口!在这个问题中,我看不到任何关于TMemo的提及。你是如何期待我们知道的? –

+1

@Leo - David是对的,你在问题中给出的代码是一个滚动条控件,你可以在IDE的标准组件工具面板中找到它。带有滚动条的备忘录是一个带有'WS_VSCROLL'和'WS_HSCROLL'样式的窗口,备忘录中没有单独的滚动条控件。您在问题中提供的代码或此答案中的代码都不适用于此类情况。 –

1

这一改进通过反复调用避免了内存泄漏CreateSolidBrush()

{ TMyScrollBar } 
//****************************************************************************** 
constructor TMyScrollBar.Create(AOwner: TComponent); 
begin 
    inherited; 
    FHBrush := CreateSolidBrush(ColorToRGB(FBackColor)); 
end; 

//****************************************************************************** 
destructor TMyScrollBar.Destroy; 
begin 
    DeleteObject(FHBrush); 
    inherited; 
end; 

//****************************************************************************** 
procedure TMyScrollBar.SetBackColor(const Value: Tcolor); 
begin 
    FBackColor := Value; 
    DeleteObject(FHBrush); 
    FHBrush := CreateSolidBrush(ColorToRGB(FBackColor)); 
end; 

//****************************************************************************** 
procedure TMyScrollBar.WMCtlColor(var Message: TWMCtlColorScrollbar); 
begin 
    Message.Result := FHBrush; 
end;