¿Cómo quitar el marco (borde) de una barra de progreso (ProgressBar)?

Barra de progreso sin marco

Por Vladimir S. <shvetadvipa@mtu-net.ru>

Help & Manual authoring tool

La barra de progreso (ProgressBar) de Delphi siempre tiene marco. Si desea ponerla en una barra de estado (StatusBar) no se ve muy lindo que digamos. Puede hacer un pequeño cambio en el componente y así obtener un nuevo componente sin borde.

Vea la figura (progress.gif). Puede ver tres barras de progreso. Una es el componente estándar de Delphi con marco y el resto de ellas son el componente con una propiedad nueva. Ahora puede quitar el marco de la barra de progreso.

unit NewProgress;

// By Vladimir S. <shvetadvipa@mtu-net.ru>

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);
  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.
LMD-Tools 6.1 - 300+ componentes para varias tareas de desarrollo!