gpt4 book ai didi

delphi - 修复了与滚动条结合的 BorderWidth > 0 的错误?

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

在编写自定义控件期间,在尝试正确实现默认的 BorderWidth 属性时,我似乎偶然发现了显示滚动条时绘画行为中的一个错误:滚动条之间的空格并且控件的范围未绘制。

要重现该错误,请为新项目的主窗体实现以下 OnCreate 处理程序:

procedure TForm1.FormCreate(Sender: TObject);
begin
AutoScroll := True;
BorderWidth := 20;
SetBounds(10, 10, 200, 200);
with TGroupBox.Create(Self) do
begin
SetBounds(300, 300, 50, 50);
Parent := Self;
end;
end;

D7 和 XE2 的结果:

enter image description here

看来这个问题终于在 Delphi XE2 中得到了解决。这个错误可能存在于 TWinControl.WMNCPaint 中,但查看 Controls.pas,我找不到 D7 和 XE2 之间的实现有任何显着差异。

我想得到以下问题的答案:

  • 如何针对这种奇怪现象编写错误修复程序,
  • 这个 bug 似乎从哪个 Delphi 版本开始得到修复。

最佳答案

从哪个 Delphi 版本修复?

search results在 QualityCentral 的 BorderWidth 中显示,以前没有报告过此错误。错误QC 2433 (已在 D2010 更新 4 中解决)似乎相关,但从评论中我了解到该错误在 D2007 中不存在。

不过,这里更需要来自社区的验证。

如何修复

重写WM_NCPAINT消息处理程序:

  private
procedure WMNCPaint(var Message: TWMNCPaint); message WM_NCPAINT;

procedure TForm1.WMNCPaint(var Message: TWMNCPaint);
{$IF CompilerVersion < 19}
var
DC: HDC;
WindowStyle: Longint;
TotalBorderWidth: Integer;
{$IFEND}
begin
{$IF CompilerVersion < 19}
DC := GetWindowDC(Handle);
try
WindowStyle := GetWindowLong(Handle, GWL_STYLE);
if WindowStyle and WS_VSCROLL <> 0 then
TotalBorderWidth := (Width - ClientWidth - GetSystemMetrics(SM_CXVSCROLL)) div 2
else
TotalBorderWidth := (Width - ClientWidth) div 2;
if WindowStyle and WS_HSCROLL <> 0 then
FillRect(DC, Rect(0, Height - TotalBorderWidth, Width, Height), Brush.Handle);
if WindowStyle and WS_VSCROLL <> 0 then
FillRect(DC, Rect(Width - TotalBorderWidth, 0, Width, Height), Brush.Handle);
finally
ReleaseDC(Handle, DC);
end;
{$IFEND}
inherited;
end;

两个绘制的矩形故意太大,以便在调整大小时提供更好的效果。

关于delphi - 修复了与滚动条结合的 BorderWidth > 0 的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14798240/

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