Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何在完整的位图图像中绘制阴影效果?_Delphi - Fatal编程技术网

Delphi 如何在完整的位图图像中绘制阴影效果?

Delphi 如何在完整的位图图像中绘制阴影效果?,delphi,Delphi,我想知道是否有可能在已经存在的完整位图图像中绘制阴影效果,以及之后是否有类似于以下示例的效果,其中模式表单后面的所有区域都是已经具有阴影效果的新位图图像?=> 这很容易。首先,我们需要一个淡入给定位图的例程: procedure FadeBitmap(ABitmap: TBitmap); type PRGBTripleArray = ^TRGBTripleArray; TRGBTripleArray = array[word] of TRGBTriple; var SL: PRGBT

我想知道是否有可能在已经存在的完整位图图像中绘制阴影效果,以及之后是否有类似于以下示例的效果,其中模式表单后面的所有区域都是已经具有阴影效果的新位图图像?=>


这很容易。首先,我们需要一个淡入给定位图的例程:

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;
然后,当我们想要显示模式消息时,我们为当前表单创建一个位图“屏幕截图”,将其淡入淡出状态,并将其放置在表单所有控件的顶部:

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;


提示:如果您的应用程序中要显示多个模式对话框,您可能需要重构它。为此,请看一下
TApplicationEvent
OnModalBegin
OnModalEnd
事件。

这非常简单。首先,我们需要一个淡入给定位图的例程:

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;
然后,当我们想要显示模式消息时,我们为当前表单创建一个位图“屏幕截图”,将其淡入淡出状态,并将其放置在表单所有控件的顶部:

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;


提示:如果您的应用程序中要显示多个模式对话框,您可能需要重构它。为此,请查看
TApplicationEvent
OnModalBegin
OnModalEnd
事件。

我已经在表单上有了
TImage
组件(未创建运行时)并且没有使用
TPanel
,那么,如何仅将此阴影应用于
TImage
上方,而不是
ShowMessage
显示
Form2
?要显示Form2而不是消息框,请替换
ShowMessage('Hello,褪色的背景!')使用
使用TForm2。创建(自我)尝试ShowModal;终于自由了;结束。但这是Delphi基础知识,所以您可以在任何Delphi教程中阅读所有关于它的内容。不必
showmodel
,只需
Show
(正常)。我测试显示正常,阴影效果不起作用。而且我不需要
TPanel
。只有
TImage
+
Form2。显示
Form2
@KKK后面的阴影效果:在你的问题中,你特别写了“模态”。当然,它不仅仅适用于
Show
,因为
Show
会立即返回,所以阴影移除代码会直接执行。如果要使用非模式弹出窗体,则需要将阴影移除代码移动到关闭弹出窗体的时间。此外,由于
TImage
是一个图形控件,因此它不能位于窗口控件之上。因此面板。我已经在表单上有一个
TImage
组件(不是运行时创建的)并且没有使用
TPanel
,那么如何仅将此阴影应用于
TImage
上方,而不是
ShowMessage
显示
Form2
?要显示Form2而不是消息框,请替换
ShowMessage('Hello,ladded Background!';
with
with TForm2.Create(Self)do try showmodel;finally Free;end;
。但这是Delphi基础知识,所以您可以在任何Delphi教程中阅读所有内容。不必
showmodel
,只需
Show
(正常).我测试显示正常,阴影效果不起作用。而且我不需要
TPanel
。只需要
TImage
+
Form2.显示
+Form2后面的阴影效果
@KKK:在你的问题中,你特别写了“模态”。当然,它不仅仅适用于
Show
,因为
Show
会立即返回,因此阴影移除代码会直接执行。如果要使用非模式弹出窗体,则需要将阴影移除代码移动到关闭弹出窗体的时间。此外,由于
TImage
是一个图形控件,因此无法打开窗口控件的顶部。因此是面板。