gpt4 book ai didi

delphi - TScrollBox 具有自定义平面边框颜色和宽度?

转载 作者:行者123 更新时间:2023-12-03 15:27:29 27 4
gpt4 key购买 nike

我正在尝试创建一个具有平坦边框的 TScrollBox,而不是丑陋的“Ctl3D”边框。

这是我尝试过的,但边框不可见:

type
TScrollBox = class(Forms.TScrollBox)
private
procedure WMNCPaint(var Message: TWMNCPaint); message WM_NCPAINT;
protected
public
constructor Create(AOwner: TComponent); override;
end;

...

constructor TScrollBox.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
BorderStyle := bsNone;
BorderWidth := 1; // This will handle the client area
end;

procedure TScrollBox.WMNCPaint(var Message: TWMNCPaint);
var
DC: HDC;
R: TRect;
FrameBrush: HBRUSH;
begin
inherited;
DC := GetWindowDC(Handle);
GetWindowRect(Handle, R);
// InflateRect(R, -1, -1);
FrameBrush := CreateSolidBrush(ColorToRGB(clRed)); // clRed is here for testing
FrameRect(DC, R, FrameBrush);
DeleteObject(FrameBrush);
ReleaseDC(Handle, DC);
end;

我做错了什么?

<小时/>

我想自定义边框颜色和宽度,所以我不能使用BevelKind = bkFlat,加上bkFlat“breaks” RTL BidiMode 看起来非常糟糕。

最佳答案

确实,您必须在 WM_NCPAINT 消息处理程序中绘制边框。使用 GetWindowDC 获取的设备上下文是相对于控件的,而使用 GetWindowRect 获取的矩形是相对于屏幕的。

获得正确的矩形,例如通过 SetRect(R, 0, 0, 宽度, 高度);

随后,根据您的意愿设置 BorderWidth,并且 ClientRect 应相应遵循。如果没有,则通过重写 GetClientRect 进行补偿。这是few examples .

在您自己的代码之前调用继承的消息处理程序链,以便正确绘制滚动条(需要时)。总而言之,它应该看起来像:

type
TScrollBox = class(Forms.TScrollBox)
private
procedure WMNCPaint(var Message: TWMNCPaint); message WM_NCPAINT;
protected
procedure Resize; override;
public
constructor Create(AOwner: TComponent); override;
end;

...

constructor TScrollBox.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
BorderWidth := 1;
end;

procedure TScrollBox.Resize;
begin
Perform(WM_NCPAINT, 0, 0);
inherited Resize;
end;

procedure TScrollBox.WMNCPaint(var Message: TWMNCPaint);
var
DC: HDC;
B: HBRUSH;
R: TRect;
begin
inherited;
if BorderWidth > 0 then
begin
DC := GetWindowDC(Handle);
B := CreateSolidBrush(ColorToRGB(clRed));
try
SetRect(R, 0, 0, Width, Height);
FrameRect(DC, R, B);
finally
DeleteObject(B);
ReleaseDC(Handle, DC);
end;
end;
Message.Result := 0;
end;

关于delphi - TScrollBox 具有自定义平面边框颜色和宽度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13564701/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com