Przyciemnienie okna

0

Mam następujący problem z uzyskaniem efektu przyciemnienia okna na czas pokazania komunikatu, jak niżej. Do dynamicznego TImage wczytuję za pośrednictwem TPngObject grafikę z przeźroczystością.
Jak widać wszystko jest niby dobrze, ale TImage ląduje pod spód komponentów.
Wszystkie kontrolki przechodzą na wierzch.

user image
user image

uses PngImage;

var
 Png: TPngObject;
 Img: TImage;
begin
 Png := TPngObject.Create;
 try
  Png.LoadFromFile(ExtractFilePath(Application.ExeName) + 'background.png');
  Img := TImage.Create(Self);
  with Img do
    begin
     Parent      := Self;
     AutoSize    := False;
     Transparent := True;
     Left        := 0;
     Top         := 0;
     Height      := Form2.Height;
     Width       := Form2.Width;
     Name        := 'Img';
     Stretch     := True;

     BringToFront;
     Picture.Assign(Png);
    end;
 finally
  Png.Free;
 end;

 ShowMessage('ok');

 Img.Free;
end;

W jaki sposób uzyskać taki efekt, przy czym wszystkie komponenty mają być zasłonięte przez wczytaną grafikę.

0

Strzelam że TPngObject rysuje bezpośrednio na canvasie formularza, podobnie jak robi to zwykły TImage. Najłatwiej chyba dodać dodatkowe płótno (dowolny element z canvasem), który przesłoni cały formularz i na nim rysować (osadzić) obrazek.

0

Rozwiązanie:

Użyłem przeźroczystego panelu, a na nim TImage.

type
  TSkinPanel = class(TCustomPanel)
  private
    procedure WMEraseBkGnd(var Msg: TWMEraseBkGnd); message WM_ERASEBKGND;
  protected
   procedure Paint; override;
  public
   constructor Create(AOwner: TComponent); override;
   destructor Destroy; override;
  end;


constructor TSkinPanel.Create(AOwner: TComponent);
begin
 inherited Create(AOwner);
end;

destructor TSkinPanel.Destroy;
begin
 inherited Destroy;
end;

procedure TSkinPanel.Paint;
var
 i: SmallInt;
 Rect: TRect;
begin
 i := SaveDC(Canvas.Handle);
 MoveWindowOrg(Canvas.Handle, Left, Top);
 Parent.Perform(WM_PAINT, Canvas.Handle, 0);
 RestoreDC(Canvas.Handle, i);
 Rect := ClientRect;
end;

procedure TSkinPanel.WMEraseBkGnd(var Msg: TWMEraseBkGnd);
begin
 Msg.Result := 0;
end;


procedure TForm2.Button1Click(Sender: TObject);
var
 Png: TPngObject;
 Img: TImage;
 Pan: TSkinPanel;
begin
 Png := TPngObject.Create;
 Pan := TSkinPanel.Create(Self);
 with Pan do
   begin
    Parent      := Self;
    AutoSize    := False;
    Left        := 0;
    Top         := 0;
    Height      := Form2.Height;
    Width       := Form2.Width;
    Name        := 'Pan';
    BringToFront;
   end;

 Img := TImage.Create(Pan);
 try
  Png.LoadFromFile(ExtractFilePath(Application.ExeName) + 'background.png');
  with Img do
    begin
     Parent      := Self;
     AutoSize    := False;
     Transparent := True;
     Left        := 0;
     Top         := 0;
     Height      := Form2.Height;
     Width       := Form2.Width;
     Name        := 'Img';
     Stretch     := True;
     Picture.Assign(Png);
    end;
 finally
  Png.Free;
 end;

 ShowMessage('ok');

 Img.Free;
 Pan.Free;
end;
0

Nie pisze się "prze<font size="2">ź</span>roczystego" tylko prze<font size="2">z</span>roczystego

0

TPngObject dziedizczy po TGraphicControl (tak samo jak TImage, TPaintBox, TShape i podobne) a one są ZAWSZE POD komponentami dziedziczącymi po TWinControl. Jedyne rozwiązanie jest takie jak Twoje - tzn coś co jest TWinControl i dopiero na to TGraphicControl

0

Albo ukryć wszystke komponenty w odpowiednim momencie :)

0
Juhas napisał(a)

Albo ukryć wszystke komponenty w odpowiednim momencie :)

Właśnie o to chodzi, aby były widoczne komponenty pod spodem...

0
Literówka napisał(a)

Nie pisze się "prze<font size="2">ź</span>roczystego" tylko prze<font size="2">z</span>roczystego

http://www.sjp.pl/co/prze%BCroczysty
a od kiedy?
//sorry za offtop :P

0
abc napisał(a)
Literówka napisał(a)

Nie pisze się "prze<font size="2">ź</span>roczystego" tylko prze<font size="2">z</span>roczystego

http://www.sjp.pl/co/prze%BCroczysty
a od kiedy?
*sorry za offtop :P
http:*www.sjp.pl/co/przezroczysty :-D
również przepraszam za off-top :p

1 użytkowników online, w tym zalogowanych: 0, gości: 1