显示对话框时,淡化应用程序的所有其他窗口?

Pav*_*van 12 delphi delphi-2009

如何在Delphi 2009中调暗/淡化应用程序的所有其他窗口.

Form具有AlphaBlend属性,但它仅控制透明度级别.但如果我们可以拥有这样的东西(浓缩窗口)会很好 .当我们尝试在帖子中插入链接/图像等时,甚至stackoverflow.com也会这样做.

我们如何在delphi应用程序中实现这一目标?

Rya*_*lls 22

这是我刚刚为你敲了一个单位.

要使用此单元,请在主窗体上放置一个TApplication组件,然后在OnModalBegin中调用_GrayForms,然后在OnModalEnd中调用_NormalForms方法.

这是一个非常简单的例子,可以很容易地变得更加复杂.检查多个呼叫级别等....

对于诸如系统(打开,保存等)对话框之类的东西,你可以在try ... finally块中包装对话框执行方法,调用相应的函数来获得类似的反应.

该单元应该适用于Win2k,WinXP,Vista,甚至可以在Win7上运行.

瑞安.

unit GrayOut;

interface

procedure _GrayForms;
procedure _GrayDesktop;
procedure _NormalForms;

implementation

uses windows, classes, forms, Contnrs, Types, Graphics, sysutils;

var
   gGrayForms : TComponentList;

procedure _GrayDesktop;
var
   loop : integer;
   wScrnFrm : TForm;
   wForm : TForm;
   wPoint : TPoint;

begin
   if not assigned(gGrayForms) then
   begin
      gGrayForms := TComponentList.Create;
      gGrayForms.OwnsObjects := true;

      for loop := 0 to Screen.MonitorCount - 1 do
      begin
         wForm := TForm.Create(nil);
         gGrayForms.Add(wForm);

         wForm.Position := poDesigned;
         wForm.AlphaBlend := true;
         wForm.AlphaBlendValue := 64;
         wForm.Color := clBlack;
         wForm.BorderStyle := bsNone;
         wForm.Enabled := false;
         wForm.BoundsRect := Screen.Monitors[loop].BoundsRect;
         SetWindowPos(wForm.handle, HWND_TOP, 0,0,0,0, SWP_NOSIZE or SWP_NOMOVE);
         wForm.Visible := true;
      end;
   end;
end;

procedure _GrayForms;
var
   loop : integer;
   wScrnFrm : TForm;
   wForm : TForm;
   wPoint : TPoint;
   wScreens : TList;

begin
   if not assigned(gGrayForms) then
   begin
      gGrayForms := TComponentList.Create;
      gGrayForms.OwnsObjects := true;

      wScreens := TList.create;
      try
         for loop := 0 to Screen.FormCount - 1 do
            wScreens.Add(Screen.Forms[loop]);

         for loop := 0 to wScreens.Count - 1 do
         begin
            wScrnFrm := wScreens[loop];

            if wScrnFrm.Visible then
            begin
               wForm := TForm.Create(wScrnFrm);
               gGrayForms.Add(wForm);

               wForm.Position := poOwnerFormCenter;
               wForm.AlphaBlend := true;
               wForm.AlphaBlendValue := 64;
               wForm.Color := clBlack;
               wForm.BorderStyle := bsNone;
               wForm.Enabled := false;
               wForm.BoundsRect := wScrnFrm.BoundsRect;
               SetWindowLong(wForm.Handle, GWL_HWNDPARENT, wScrnFrm.Handle);
               SetWindowPos(wForm.handle, wScrnFrm.handle, 0,0,0,0, SWP_NOSIZE or SWP_NOMOVE);
               wForm.Visible := true;
            end;
         end;
      finally
         wScreens.free;
      end;
   end;
end;

procedure _NormalForms;
begin
   FreeAndNil(gGrayForms);
end;

initialization
   gGrayForms := nil;

end.
Run Code Online (Sandbox Code Playgroud)

  • 有趣的解决方案,但为什么不使用覆盖整个桌面的ONE表单以及更大的alphablendvalue?上面的方法将导致重叠形式的框显得更暗. (4认同)
  • 如果你要重叠整个桌面那么这将是很好的,但我认为这只对系统模态对话框而不是应用程序模式对话框有用.就像我说的那样,这是我作为一个例子迅速被淘汰的事情.我目前没有使用这样的东西,我认为这将是一个很好的心理exersize. (3认同)
  • 除了你的问题是关于应用程序的所有其他窗口.不是桌面. (2认同)

Uwe*_*abe 7

我已经做了类似的事情来展示一个模态形式,试图让实现尽可能简单.我不知道这是否符合您的需求,但这里是:

function ShowModalDimmed(Form: TForm; Centered: Boolean = true): TModalResult;
var
  Back: TForm;
begin
  Back := TForm.Create(nil);
  try
    Back.Position := poDesigned;
    Back.BorderStyle := bsNone;
    Back.AlphaBlend := true;
    Back.AlphaBlendValue := 192;
    Back.Color := clBlack;
    Back.SetBounds(0, 0, Screen.Width, Screen.Height);
    Back.Show;
    if Centered then begin
      Form.Left := (Back.ClientWidth - Form.Width) div 2;
      Form.Top := (Back.ClientHeight - Form.Height) div 2;
    end;
    result := Form.ShowModal;
  finally
    Back.Free;
  end;
end;
Run Code Online (Sandbox Code Playgroud)