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でそれを行うにはどうすればよいですか?

4

2 に答える 2

2

WM_CTLCOLORネイティブ API にメッセージはありません。代わりCN_CTLCOLORSCROLLBARに、API の に応答して VCL によって子コントロールに送信されるコントロール通知を使用できます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;
于 2013-02-06T17:16:14.517 に答える
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;
于 2016-10-21T06:49:10.950 に答える