Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как заставить полосу прокрутки `TCustomControl` рисовать себя после возвращения окна на экран

Delphi , Компоненты и Классы , Компоненты

Проблема с полосой прокрутки в компоненте TCustomControl

Разработчики, работающие с Delphi и Pascal, иногда сталкиваются с проблемой, когда систематическая полоса прокрутки в пользовательском компоненте TCustomControl не отображается должным образом. Это может произойти, если окно, содержащее компонент, частично выходит за пределы экрана, а затем возвращается обратно. В результате полоса прокрутки может не отображаться (не рисоваться) после возвращения окна на экран.

Пример кода

Пример кода, представленный в контексте, демонстрирует создание компонента TSuperList, который является потомком TCustomControl и включает в себя системутическую полосу прокрутки. Для создания такого компонента необходимо добавить поддержку вертикальной прокрутки в CreateParams и переопределить метод Paint для рисования содержимого компонента.

unit SuperList;
interface
uses
  Windows, Controls, Graphics, Classes, Messages, SysUtils, StdCtrls, Forms;
type
  TSuperList = class(TCustomControl)
  public
    DX, DY: Integer;
    procedure Paint; override;
    constructor Create(AOwner: TComponent); override;
    procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN;
    procedure CreateParams(var Params: TCreateParams); override;
  published
    property TabStop default True;
    property Align;
  end;
procedure Register;
implementation
procedure Register;
begin
  RegisterComponents('Marus', [TSuperList]);
end;
procedure TSuperList.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.Style := Params.Style or WS_VSCROLL;
end;
procedure TSuperList.WMLButtonDown(var Message: TWMLButtonDown);
begin
  DX := Message.XPos;
  DY := Message.YPos;
  Invalidate;
  inherited;
end;
constructor TSuperList.Create(AOwner: TComponent);
begin
  inherited;
  DoubleBuffered := True;
  TabStop := True;
  Color := clBtnFace;
  BevelKind := bkFlat;
  Width := 200; Height := 100;
  DX := 50; DY := 50;
end;
procedure TSuperList.Paint;
begin
  Canvas.Brush.Color := clWindow;
  Canvas.FillRect(Canvas.ClipRect);
  Canvas.TextOut(10, 10, 'Press left mouse button !');
  Canvas.Brush.Color := clRed;
  Canvas.Pen.Color := clBlue;
  Canvas.Rectangle(DX, DY, DX + 30, DY + 20);
end;
end.

Решение проблемы

Проблема исчезновения полосы прокрутки связана с настройкой свойства BevelKind := bkFlat; в конструкторе компонента. Это свойство вызывает перерисовку неклиентской области компонента, что приводит к перекрытию полосы прокрутки.

Подтвержденный ответ предлагает быстрое решение: переопределить обработчик сообщения WMNCPaint и изменить область рисования на всю неклиентскую область. Это заставит Delphi перерисовать всю область, что может помочь в решении проблемы.

procedure TSuperList.WMNCPaint(var Message: TWMNCPaint);
var
  TmpRgn: HRGN;
begin
  TmpRgn := Message.RGN;
  try
    Message.RGN := 1;
    inherited;
  finally
    Message.RGN := TmpRgn;
  end;
end;

Альтернативное решение заключается в самостоятельной реализации рисования бивела, что позволит уменьшить мерцание экрана.

Рекомендации

  • Не устанавливайте DoubleBuffered в коде компонента. Это может быть не лучшей практикой.
  • Если компонент использует WMNCCalcSize для расчета неклиентской области (что происходит, если установлено свойство BevelKind), то бивель следует рисовать в обработчике WM_NCPaint.
  • В случае желания реализовать рисование бивела самостоятельно, рассмотрите возможность использования WM_NCPaint для этого.

Заключение

При работе с компонентами TCustomControl в Delphi, важно понимать, как работают неклиентские области и полосы прокрутки. Правильная настройка обработчиков сообщений и свойств компонента может помочь избежать проблем с отображением полосы прокрутки.

Создано по материалам из источника по ссылке.

Проблема заключается в неправильном отображении полосы прокрутки в пользовательском компоненте `TCustomControl` в Delphi, которая может возникать из-за настройки свойства `BevelKind`, вызывающей перерисовку компонента.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Компоненты ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-07-16 03:28:16/0.0036740303039551/0