代码之家  ›  专栏  ›  技术社区  ›  user9672569

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

  •  1
  • user9672569  · 技术社区  · 7 年前

    我想知道是否有可能在一个已经存在的完整位图图像中绘制阴影效果,并且在产生类似于下面这个示例的效果后,模态形式后面的所有区域都是我已经具有阴影效果的新位图图像=&燃气轮机;

    enter image description here

    1 回复  |  直到 7 年前
        1
  •  8
  •   Andreas Rejbrand    7 年前

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

    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;
    

    A VCL form with a faded background when a modal window is shown.

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