Конференция "KOL" » Как сделать "Glass-эффект" (стеклянная форма) средствами KOL [Delphi, Windows 7]
 
  • GradeMax (22.07.10 19:41) [0]
    Есть пример, который работает для консоли:

    Program ConsoleGlassDelphi;
    {$APPTYPE CONSOLE}
    uses Windows;
    type
     DWM_BLURBEHIND = record
       dwFlags                 : DWORD;
       fEnable                 : BOOL;
       hRgnBlur                : HRGN;
       fTransitionOnMaximized  : BOOL;
     end;

    function DwmEnableBlurBehindWindow(hWnd : HWND; const pBlurBehind : DWM_BLURBEHIND) : HRESULT; stdcall; external  'dwmapi.dll' name 'DwmEnableBlurBehindWindow';

    function GetConsoleWindow: HWND; stdcall; external kernel32 name 'GetConsoleWindow';
    {----------------------------------------------------------------------}
    function DWM_EnableBlurBehind(hwnd : HWND;
                                 AEnable: Boolean;
                                 hRgnBlur : HRGN = 0;
                                 ATransitionOnMaximized: Boolean = False;
                                 AFlags: Cardinal = 1): HRESULT;
    var
       pBlurBehind : DWM_BLURBEHIND;
    begin
          pBlurBehind.dwFlags:=AFlags;
          pBlurBehind.fEnable:=AEnable;
          pBlurBehind.hRgnBlur:=hRgnBlur;
          pBlurBehind.fTransitionOnMaximized:=ATransitionOnMaximized;
          Result:=DwmEnableBlurBehindWindow(hwnd, pBlurBehind);
    end;
    {----------------------------------------------------------------------}
    begin
     try
       DWM_EnableBlurBehind(GetConsoleWindow(), True);
       Writeln('See my glass effect');
       Writeln('Go Delphi Go');
       Readln;
     except
     end;
    end.



    Вот как бы сделать такой же эффект для обычной (пустой) формы средствами KOL. Я уже все рога обломал над этой проблемой.

    В Win7 получившаяся форма выглядет прозрачной (эффект стекла). В Viste скорее всего будет выглядеть аналогично. В WinXP не знаю...

    Ссылки так же касающиеся данного вопроса:
    http://www.vr-online.ru/?q=content/delphi-delaem-stekljannyj-jeffekt-1211
    http://vr-online.ru/?q=forum/glass-effekt-1207
  • Дмитрий К © (22.07.10 21:35) [1]
    Форма должна быть черной.
  • Darth Revan (25.07.10 17:42) [2]
    type
       DWM_BLURBEHIND = record
       dwFlags: DWORD;
       fEnable: BOOL;
       hRgnBlur: HRGN;
       fTransitionOnMaximized: BOOL;
     end;

    function IsWindowsVistaOrLater: Boolean;
    var
     VerInfo: TOSVersioninfo;
    begin
     VerInfo.dwOSVersionInfoSize := SizeOf(TOSVersioninfo);
     GetVersionEx(VerInfo);
     Result := VerInfo.dwMajorVersion >= 6;
    end;

    function CompositingEnabled: Boolean;
    var
     DLLHandle: THandle;
     DwmIsCompositionEnabledProc: function(pfEnabled: PBoolean): HRESULT;
    stdcall;
    Enabled :
    Boolean;
    begin
     Result := False;
     if IsWindowsVistaOrLater then
     begin
       DLLHandle := LoadLibrary(dwmapi);

       if DLLHandle <> 0 then
       begin
         @DwmIsCompositionEnabledProc := GetProcAddress(DLLHandle,
           DwmIsCompositionEnabledSig);

         if (@DwmIsCompositionEnabledProc <> nil) then
         begin
           DwmIsCompositionEnabledProc(@Enabled);
           Result := Enabled;
         end;

         FreeLibrary(DLLHandle);
       end;
     end;
    end;

    function DWM_EnableBlurBehind(const AHandle: HWND; const AMarginsLeft,
     AMarginsRight, AMarginsTop, AMarginsBottom: integer): Boolean;
    type
     _MARGINS = packed record
       cxLeftWidth: integer;
       cxRightWidth: integer;
       cyTopHeight: integer;
       cyBottomHeight: integer;
     end;

     PMargins = ^_MARGINS;
     TMargins = _MARGINS;
    var
     DLLHandle: THandle;
     DwmExtendFrameIntoClientAreaProc: function(destWnd: HWND;
       const pMarInset: PMargins): HRESULT;
    stdcall;
    Margins :
    TMargins;
    begin
     Result := False;
     if IsWindowsVistaOrLater and CompositingEnabled then
     begin
       DLLHandle := LoadLibrary(dwmapi);
       if DLLHandle <> 0 then
       begin
         @DwmExtendFrameIntoClientAreaProc := GetProcAddress(DLLHandle,
           DwmExtendFrameIntoClientAreaSig);
         if (@DwmExtendFrameIntoClientAreaProc <> nil) then
         begin
           zeromemory(@Margins, SizeOf(Margins));
           Margins.cxLeftWidth := AMarginsLeft;
           Margins.cxRightWidth := AMarginsRight;
           Margins.cyTopHeight := AMarginsTop;
           Margins.cyBottomHeight := AMarginsBottom;
           if DwmExtendFrameIntoClientAreaProc(AHandle, @Margins) = 0 then
             Result := True;
         end;
         FreeLibrary(DLLHandle);
       end;
     end;
    end;


     if CompositingEnabled then
     begin
       Form.Color := clBlack;
       if DWM_EnableBlurBehind(Form.GetWindowHandle, 4, 4, 6, 0) = false then
         Form.Color := clWhite;
     end;

 
Конференция "KOL" » Как сделать "Glass-эффект" (стеклянная форма) средствами KOL [Delphi, Windows 7]
Есть новые Нет новых   [134430   +3][b:0][p:0.003]