Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

Видеокурс программиста и крэкера 5D 2O17
(актуальность: октябрь 2O17)
Свежие инструменты, новые видеоуроки!

  • 400+ видеоуроков
  • 800 инструментов
  • 100+ свежих книг и статей

УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

БОЛЬШОЙ FAQ ПО DELPHI



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.
 




<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ



Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS