Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何自定义滚动条颜色?_Delphi_Scrollbar - Fatal编程技术网

Delphi 如何自定义滚动条颜色?

Delphi 如何自定义滚动条颜色?,delphi,scrollbar,Delphi,Scrollbar,我发现了一些示例代码,如下所示,用于尝试自定义滚动条颜色: 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;

我发现了一些示例代码,如下所示,用于尝试自定义滚动条颜色:

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中实现它?

本机api中没有
WM\u CTLCOLOR
消息。相反,您可以使用
CN\u CTLCOLORSCROLLBAR
控件通知,该通知由VCL发送给子控件以响应API的请求


或者,如果您不想派生新控件,只要将滚动条放置在表单上:

  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;

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


我试过了,但没用。它是否仅在我的表单具有TSCRLLBAR时才起作用?我的演示代码只有一个带有滚动条的TMemo设置为ssbot,您需要将代码附加到正确的窗口!我看不出这个问题中有提到TMemo。你希望我们怎么知道这些?@Leo-David是对的,你在问题中给出的代码是一个滚动条控件,你可以在IDE的标准组件工具面板中找到它。带有滚动条的备忘录是一个带有
WS_VSCROLL
WS_HSCROLL
样式的窗口,备忘录中没有单独的滚动条控件。你在问题中给出的代码,或者这个答案中的代码都不适用于这种情况。很抱歉有误导性,我认为这个案例应该足够简单,可以陈述我的问题,我只想知道WM_CTLCOLOR是否适用于Delphi中的普通控件,比如TMemo或TStringGrid或任何其他内置滚动条的控件。而且Windows消息似乎只适用于Delphi中的TScrollBar,然后谢谢你们两位guys@David,我想您理解了我的意思,我正在试图找到一种在Delphi中定制通用控件的滚动条颜色的方法,例如TMemo、TStringGrid、TListView或TListBox,等等。我不想禁用内置滚动条并替换为我的滚动条,但只想自定义内置滚动条,但到目前为止,我什么也没有得到
  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;
{ 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;