How draw a shadow effect in a complete Bitmap image?
How draw a shadow effect in a complete Bitmap image?
I want know if is possible draw a shadow effect in a complete Bitmap image already existent and after have a effect similar to this example below, where all area behind modal Form is my new Bitmap image already with the shadow effect? =>
1 Answer
1
This is pretty easy. First we need a routine that fades a given bitmap:
procedure FadeBitmap(ABitmap: TBitmap);
type
PRGBTripleArray = ^TRGBTripleArray;
TRGBTripleArray = array[word] of TRGBTriple;
var
SL: PRGBTripleArray;
y: Integer;
x: Integer;
begin
ABitmap.PixelFormat := pf24bit;
for y := 0 to ABitmap.Height - 1 do
begin
SL := ABitmap.ScanLine[y];
for x := 0 to ABitmap.Width - 1 do
with SL[x] do
begin
rgbtRed := rgbtRed div 2;
rgbtGreen := rgbtGreen div 2;
rgbtBlue := rgbtBlue div 2;
end;
end;
end;
Then, when we want to display our modal message, we create a bitmap 'screenshot' of our current form, fade it, and place it on top of all controls of the form:
procedure TForm1.ButtonClick(Sender: TObject);
var
bm: TBitmap;
pn: TPanel;
img: TImage;
begin
bm := GetFormImage;
try
FadeBitmap(bm);
pn := TPanel.Create(nil);
try
img := TImage.Create(nil);
try
img.Parent := pn;
pn.BoundsRect := ClientRect;
pn.BevelOuter := bvNone;
img.Align := alClient;
img.Picture.Bitmap.Assign(bm);
pn.Parent := Self;
ShowMessage('Hello, Faded Background!');
finally
img.Free;
end;
finally
pn.Free;
end;
finally
bm.Free;
end;
end;
Hint: If you have more than one modal dialog to display in your application, you probably want to refactor this. To this end, have a look at TApplicationEvent
's OnModalBegin
and OnModalEnd
events.
TApplicationEvent
OnModalBegin
OnModalEnd
i already have a
TImage
component on Form (not runtime created) and not use TPanel
, then how apply this shadow only to stay above TImage
and instead of ShowMessage
show a Form2
?– user9672569
May 14 at 12:17
TImage
TPanel
TImage
ShowMessage
Form2
To display Form2 instead of a message box, replace
ShowMessage('Hello, Faded Background!');
with with TForm2.Create(Self) do try ShowModal; finally Free; end;
. But this is Delphi basics, so you can read all about it in any Delphi tutorial.– Andreas Rejbrand
May 14 at 12:25
ShowMessage('Hello, Faded Background!');
with TForm2.Create(Self) do try ShowModal; finally Free; end;
not must
ShowModal
, only Show
(normal). I tested showing normally,and shadow effect not worked.– user9672569
May 14 at 12:28
ShowModal
Show
And also i not need of a
TPanel
. Only TImage
+ Form2.Show
+ shadow effect behind Form2
– user9672569
May 14 at 12:35
TPanel
TImage
Form2.Show
Form2
@KKK: In your question, you specifically wrote "modal". Of course it doesn't work with only
Show
, because Show
returns immediately, so the shadow removal code is executed directly. If you want to use a non-modal popup form, you need to move the shadow removal code to the time when you close the popup. Further, since a TImage
is a graphic control, it cannot be on top of windowed controls. Hence the panel.– Andreas Rejbrand
May 14 at 12:54
Show
Show
TImage
By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.
idownvotedbecau.se/noattempt idownvotedbecau.se/nocode
– Dave Nottage
May 14 at 5:42