ProgressBar с невидимой рамкой

ProgressBar с невидимой рамкой Автор: VS Заказчик моего проекта обратился с просьбой - "Сделать прогресс индикатор как в приложениях Нортона. Чтоб был в статус строке и НИКАКИХ рамок". ProgressBar в StatusBar - нет проблем, но как быть с рамкой от ProgressBar? ProgressBar всегда вычерчивает рамку и не имеет методов ее управления. Однако появилась интересная идея, воплотившаяся в компонент с новым свойством ShowFrame. Решение оказалось на удивление простым. На рисунке сравнение стандартного ProgressBar и ProgressBar с невидимой рамкой.

unit vsprgs;
interface
uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ComCtrls;
type
 TNProgressBar = class(TProgressBar)
  procedure WMNCPAINT(var Msg: TMessage); message WM_NCPAINT;
 private
  FShowFrame: boolean;
  procedure SetShowFrame(Value: boolean);
 protected
 public
  constructor Create(AOwner: TComponent); override;
 published
  property ShowFrame: boolean read FShowFrame write SetShowFrame;
 end;
procedure Register;
implementation
{ TNProgressBar }
constructor TNProgressBar.Create(AOwner: TComponent);
begin
 inherited;
 FShowFrame := True;
end;
procedure TNProgressBar.SetShowFrame(Value: boolean);
begin
 if FShowFrame <> Value then
 begin
  FShowFrame := Value;
  RecreateWnd;
 end;
end;
procedure TNProgressBar.WMNCPAINT(var Msg: TMessage);
var
 DC: HDC;
 RC: TRect;
begin
 if ShowFrame then
 begin
  inherited;
  Invalidate;
 end
 else
 begin
  DC := GetWindowDC(Handle);
  try
  Windows.GetClientRect(Handle, RC);
  with RC do
  begin
  Inc(Right, 2);
  Inc(Bottom, 2);
  end;
  Windows.FillRect(DC, RC, Brush.Handle);
  finally
  ReleaseDC(Handle, DC);
  end;
 end;
end;
procedure Register;
begin
 RegisterComponents('Controls', [TNProgressBar]);
end;
end.
http://delphiworld.narod.ru/ DelphiWorld 6.0

Отправить комментарий

Проверка
Антиспам проверка
Image CAPTCHA
...