Fade all other windows of an application when a dialog is shown?

前端 未结 5 385
轮回少年
轮回少年 2021-01-30 18:33

How to dim / fade all other windows of an application in Delphi 2009.

Form has an AlphaBlend property, but it controls only transparency level. But it would be nice if

5条回答
  •  既然无缘
    2021-01-30 19:33

    Here is a unit I just knocked together for you.

    To use this unit drop a TApplication component on your main form and in the OnModalBegin call _GrayForms and then in the OnModalEnd call the _NormalForms method.

    This is a very simple example and could be made to be more complex very easily. Checking for multiple call levels etc....

    For things like system (open, save, etc) dialogs you can wrap the dialog execute method in a try...finally block calling the appropriate functions to get a similar reaction.

    This unit should work on Win2k, WinXP, Vista and should even work on Win7.

    Ryan.

    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.
    

提交回复
热议问题