2012-07-08 25 views
12

Tôi có dạng WPF không biên dạng, không thể thay đổi kích cỡ (WindowStyle = None, Cho phépTransparency = True, ResizeMode = NoResize) với nền nửa trong suốt. Dưới đây là một bức tranh về cách thức, một hình chữ nhật màu đỏ bán trong suốt, trông ngay bây giờ, chạy trên đầu trang của Notepad:Làm mờ nền của dạng nửa trong suốt (như kính Aero)

the form as it currently appears on top of Notepad

Tuy nhiên, tôi muốn nền để bị mờ, giống như thủy tinh cách Aero hiện nó, ngoại trừ không có tất cả các biên giới cửa sổ ưa thích và nền màu với sọc - Tôi muốn xử lý bản thân mình. Dưới đây là một mockup như thế nào tôi muốn nó trông giống như:

the form as I want it to be - blur anything that's below it

Làm thế nào tôi có thể đạt được điều này một cách hiệu quả nhất có thể?

WinForms hoặc WPF là tiền phạt của tôi. Hy vọng rằng nó nên sử dụng cùng một thứ Aero kính sử dụng (Tôi tốt với nó làm việc chỉ với Aero kích hoạt), thay vì một cái gì đó điên như chụp khu vực màn hình dưới đây như là một bitmap và làm mờ đó.

Dưới đây là một bức tranh về những gì tôi KHÔNG muốn:

I don't want the entire Aero glass window chrome

Tôi biết điều này là có thể và tôi biết làm thế nào để làm điều đó, nhưng tôi không muốn toàn bộ Aero cửa sổ kính chrome , hoặc thanh viền và thanh tiêu đề, hoặc cửa sổ để có màu thủy tinh Aero do người dùng đặt, CHỈ là tác dụng làm mờ bất kỳ thứ gì bên dưới cửa sổ/biểu mẫu.

+1

Bạn đã thấy http://stackoverflow.com/questions/421968/blurred-opacity? –

+0

Có, và đó là làm mờ INSIDE biểu mẫu.Tôi muốn hình thức tự làm mờ các cửa sổ khác bên dưới nó. –

+0

Bạn đã thử điều này: http://stackoverflow.com/questions/7815278/blur-the-background-of-the-wpf-container – sloth

Trả lời

10

Nếu bạn muốn sử dụng Aero mờ sau đó bạn có thể sử dụng api DwmEnableBlurBehindWindow. Đây là một ví dụ có nguồn gốc Window sử dụng này.

public class BlurWindow : Window 
{ 
    #region Constants 

    private const int WM_DWMCOMPOSITIONCHANGED = 0x031E; 
    private const int DWM_BB_ENABLE = 0x1; 

    #endregion //Constants 

    #region Structures 
    [StructLayout(LayoutKind.Sequential)] 
    private struct DWM_BLURBEHIND 
    { 
     public int dwFlags; 
     public bool fEnable; 
     public IntPtr hRgnBlur; 
     public bool fTransitionOnMaximized; 
    } 

    [StructLayout(LayoutKind.Sequential)] 
    private struct MARGINS 
    { 
     public int cxLeftWidth; 
     public int cxRightWidth; 
     public int cyTopHeight; 
     public int cyBottomHeight; 
    } 
    #endregion //Structures 

    #region APIs 

    [DllImport("dwmapi.dll", PreserveSig = false)] 
    private static extern void DwmEnableBlurBehindWindow(IntPtr hwnd, ref DWM_BLURBEHIND blurBehind); 

    [DllImport("dwmapi.dll")] 
    private static extern int DwmExtendFrameIntoClientArea(IntPtr hWnd, ref MARGINS pMargins); 

    [DllImport("dwmapi.dll", PreserveSig = false)] 
    private static extern bool DwmIsCompositionEnabled(); 

    #endregion //APIs 

    #region Constructor 
    public BlurWindow() 
    { 
     this.WindowStyle = System.Windows.WindowStyle.None; 
     this.ResizeMode = System.Windows.ResizeMode.NoResize; 
     this.Background = Brushes.Transparent; 
    } 
    #endregion //Constructor 

    #region Base class overrides 
    protected override void OnSourceInitialized(EventArgs e) 
    { 
     base.OnSourceInitialized(e); 

     if (Environment.OSVersion.Version.Major >= 6) 
     { 
      var hwnd = new WindowInteropHelper(this).Handle; 
      var hs = HwndSource.FromHwnd(hwnd); 
      hs.CompositionTarget.BackgroundColor = Colors.Transparent; 

      hs.AddHook(new HwndSourceHook(this.WndProc)); 
      this.InitializeGlass(hwnd); 
     } 
    } 
    #endregion //Base class overrides 

    #region Methods 

    #region InitializeGlass 
    private void InitializeGlass(IntPtr hwnd) 
    { 
     if (!DwmIsCompositionEnabled()) 
      return; 

     // fill the background with glass 
     var margins = new MARGINS(); 
     margins.cxLeftWidth = margins.cxRightWidth = margins.cyBottomHeight = margins.cyTopHeight = -1; 
     DwmExtendFrameIntoClientArea(hwnd, ref margins); 

     // initialize blur for the window 
     DWM_BLURBEHIND bbh = new DWM_BLURBEHIND(); 
     bbh.fEnable = true; 
     bbh.dwFlags = DWM_BB_ENABLE; 
     DwmEnableBlurBehindWindow(hwnd, ref bbh); 
    } 
    #endregion //InitializeGlass 

    #region WndProc 
    private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) 
    { 
     if (msg == WM_DWMCOMPOSITIONCHANGED) 
     { 
      this.InitializeGlass(hwnd); 
      handled = false; 
     } 

     return IntPtr.Zero; 
    } 
    #endregion //WndProc 

    #endregion //Methods 
} 

Và đây là một đoạn sử dụng BlurWindow.

var w = new BlurWindow(); 
w.Width = 100; 
w.Height = 100; 
w.MouseLeftButtonDown += (s1, e1) => { 
    ((Window)s1).DragMove(); 
    e1.Handled = true; 
}; 
w.Background = new SolidColorBrush(Color.FromArgb(75, 255, 0, 0)); 
w.Show(); 
+1

Điều này dường như không hoạt động trên Windows 8. – Hallgrim

+1

Đó có thể là do kính aero bị vô hiệu hóa trong Windows 8. Tôi nghĩ rằng [có hacks] (http://www.howtogeek.com/128630/how-to-enable-aero -glass-style-transparency-in-windows-8 /) để kích hoạt lại nó nhưng nó không phải là một cái gì đó MS thực sự hỗ trợ. – AndrewS

1

tôi đã làm một cái gì đó tương tự một lần nhưng tôi không cần những điều sau đây:

  1. Tôi không cần phải di chuyển hình thức của tôi nhiều.
  2. Không có chuyển động nào xảy ra dưới biểu mẫu của tôi.

Những gì tôi đã làm:

  1. tôi sử dụng để hạn chế tối đa cửa sổ hình thức của tôi trong chốc lát (lập trình).
  2. Biểu mẫu được sử dụng để chụp hình ảnh có kích thước của nó và ở cùng tọa độ.
  3. Đặt hình ảnh đó làm hình nền sau khi áp dụng BlurBitmapEffect.

Không phải là câu trả lời tuyệt vời mà tôi đoán, nhưng tôi chỉ viết những gì tôi đã làm!

Nếu bạn quan tâm đến phương pháp này bài viết này sẽ giúp bạn: http://www.codeproject.com/Articles/91487/Screen-Capture-in-WPF-WinForms-Application

+1

Cảm ơn, nhưng đó là những gì tôi đang cố gắng tránh. Aero là một trình quản lý cửa sổ tổng hợp và bạn không cần phải màn hình thủ công một phần của màn hình và sau đó làm mờ như là một bitmap. Nó không chỉ tốn kém, nhưng nó không phải là phần cứng tăng tốc, không giống như cách Aero thực hiện nó. –