2012-07-08 20 views
12

मेरे पास एक अर्ध-पारदर्शी पृष्ठभूमि के साथ एक सीमा रहित, गैर-आकार बदलने योग्य WPF फ़ॉर्म (विंडो स्टाइल = कोई नहीं, अनुमति ट्रांस्पेरेंसी = ट्रू, ResizeMode = NoResize) है। यहाँ कैसे फार्म, एक अर्द्ध पारदर्शी लाल आयत, लग रहा है की एक तस्वीर अभी है, नोटपैड के शीर्ष पर चल रहा है:अर्ध-पारदर्शी रूप (जैसे एयरो ग्लास) की पृष्ठभूमि को धुंधला करना

the form as it currently appears on top of Notepad

हालांकि, मैं पृष्ठभूमि चाहते हैं कैसे एयरो ग्लास की तरह, धुंधली क्या यह सभी फैंसी विंडो सीमाओं और पट्टियों के साथ रंगीन पृष्ठभूमि को छोड़कर - मैं इसे स्वयं संभालना चाहता हूं।

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

मैं कैसे सबसे कारगर तरीका संभव में इस लक्ष्य को हासिल कर सकते हैं: यहाँ कैसे मैं इसे की तरह लग रहे करना चाहते हैं एक mockup है?

WinForms या WPF मेरे द्वारा ठीक है। उम्मीद है कि इसे एक ही चीज का उपयोग करना चाहिए जो एरो ग्लास का उपयोग करता है (मैं केवल एरो सक्षम के साथ काम कर रहा हूं), बिटमैप के रूप में नीचे दिए गए स्क्रीन क्षेत्र को कैप्चर करने और पागल करने की बजाय पागलपन की बजाय।

यहाँ मैं नहीं क्या चाहते हैं की एक तस्वीर है:

I don't want the entire Aero glass window chrome

मैं जानता हूँ कि यह संभव है और मैं इसे कैसे करना है पता है, लेकिन मैं नहीं पूरे एयरो कांच की खिड़की क्रोम चाहते , या सीमाओं और शीर्षक पट्टी, या खिड़की उपयोगकर्ता के सेट एरो ग्लास रंग, बस खिड़की/रूप से नीचे जो कुछ भी धुंधला करने का प्रभाव है।

+1

क्या आपने http://stackoverflow.com/questions/421968/blurred-opacity देखा है? –

+0

हां, और यह फ़ॉर्म के अंदर धुंधला है।मैं खुद को फॉर्म के नीचे अन्य खिड़कियों को धुंधला करना चाहता हूं। –

+0

क्या आपने यह कोशिश की है: http://stackoverflow.com/questions/7815278/blur-the-background-of-the-wpf-container – sloth

उत्तर

10

आप उपयोग करना एयरो धुंधला तो आप DwmEnableBlurBehindWindow एपीआई का उपयोग कर सकते हैं। यहां एक उदाहरण विंडो बनाई गई है जो इसका उपयोग करती है।

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 
} 

और यहां ब्लरविंडो का उपयोग करने का एक स्निपेट है।

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

यह विंडोज 8 पर काम नहीं कर रहा है। – Hallgrim

+1

शायद ऐसा इसलिए है क्योंकि विंडोज 8 में एयरो ग्लास अक्षम है। मुझे लगता है [हैक्स हैं] (http://www.howtogeek.com/128630/how-to-enable-aero -glass-style-transparency-in-windows-8 /) इसे फिर से सक्षम करने के लिए, लेकिन ऐसा कुछ नहीं है जो एमएस वास्तव में समर्थन कर रहा है। – AndrewS

1

मैं एक बार कुछ इसी तरह की थी, लेकिन मैं निम्नलिखित जरूरत नहीं थी:

  1. मैं अपने रूप में ज्यादा ले जाने के लिए जरूरत नहीं थी।
  2. मेरे रूप में कोई आंदोलन नहीं हुआ।

मैं क्या किया:

  1. मैं एक पल (प्रोग्राम के रूप में) के लिए मेरे प्रपत्र विंडो को छोटा करता था।
  2. प्रपत्र का आकार और उसी निर्देशांक पर छवि स्निप को कैप्चर करने के लिए प्रयुक्त होता है।
  3. BlurBitmapEffect लागू करने के बाद उस छवि को पृष्ठभूमि के रूप में सेट करें।

मुझे लगता है कि एक अच्छा जवाब नहीं है, लेकिन मैं सिर्फ यह लिख रहा हूं कि मैंने क्या किया!

आप इस दृष्टिकोण में रुचि रखते हैं इस लेख से आपको मदद मिलेगी: http://www.codeproject.com/Articles/91487/Screen-Capture-in-WPF-WinForms-Application

+1

धन्यवाद, लेकिन यही वह है जिसे मैं टालने की कोशिश कर रहा हूं। एरो एक कंपोजिटिंग विंडो मैनेजर है और आपको स्क्रीन के एक हिस्से को मैन्युअल रूप से स्क्रीनकैप नहीं करना चाहिए और फिर उसे बिटमैप के रूप में धुंधला करना चाहिए। न केवल यह महंगा है, लेकिन यह हार्डवेयर तेज नहीं है, एरो के विपरीत यह कैसे करता है। –