2013-10-18 105 views
4

我看到了無邊界窗口周圍陰影的代碼,但這裏是我的問題。 using System.Windows.Interop;下劃線,我不能在參考中找到它。此外,在public static void DropShadowToWindow(Window window)此窗口有下劃線,所以我猜它連接到互操作...'using System.Windows.Interop;'它在哪裏?

using System.Drawing.Printing; 
using System.Runtime.InteropServices; 
using System.Windows; 
using System.Windows.Interop; 

class DwmDropShadow 
{ 

    [DllImport("dwmapi.dll", PreserveSig = true)] 
    private static extern int DwmSetWindowAttribute(IntPtr hwnd, int attr, ref int attrValue, int attrSize); 

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

    /// <summary> 
    /// Drops a standard shadow to a WPF Window, even if the window isborderless. Only works with DWM (Vista and Seven). 
    /// This method is much more efficient than setting AllowsTransparency to true and using the DropShadow effect, 
    /// as AllowsTransparency involves a huge permormance issue (hardware acceleration is turned off for all the window). 
    /// </summary> 
    /// <param name="window">Window to which the shadow will be applied</param> 
    public static void DropShadowToWindow(Window window) 
    { 
     if (!DropShadow(window)) 
     { 
      window.SourceInitialized += new EventHandler(window_SourceInitialized); 
     } 
    } 

    private static void window_SourceInitialized(object sender, EventArgs e) //fixed typo 
    { 
     Window window = (Window)sender; 

     DropShadow(window); 

     window.SourceInitialized -= new EventHandler(window_SourceInitialized); 
    } 

    /// <summary> 
    /// The actual method that makes API calls to drop the shadow to the window 
    /// </summary> 
    /// <param name="window">Window to which the shadow will be applied</param> 
    /// <returns>True if the method succeeded, false if not</returns> 
    private static bool DropShadow(Window window) 
    { 
     try 
     { 
      WindowInteropHelper helper = new WindowInteropHelper(window); 
      int val = 2; 
      int ret1 = DwmSetWindowAttribute(helper.Handle, 2, ref val, 4); 

      if (ret1 == 0) 
      { 
       Margins m = new Margins { Bottom = 0, Left = 0, Right = 0, Top = 0 }; 
       int ret2 = DwmExtendFrameIntoClientArea(helper.Handle, ref m); 
        return ret2 == 0; 
      } 
      else 
      { 
       return false; 
      } 
     } 
     catch (Exception ex) 
     { 
      // Probably dwmapi.dll not found (incompatible OS) 
      return false; 
     } 
    } 
} 
+0

這是WPF的代碼,你需要開始用正確的項目模板。然後添加對System.Drawing的引用。奇怪的組合,最好不要複製/粘貼你不明白的代碼,真的。 –

回答

6

它在WindowsBase.DLL,這是在.NET Framework 3.0中引入的。它位於c:\ Program Files \ Reference Assemblies \ Microsoft \ Framework \ v3.0 \ WindowsBase.dll中。