2013-10-18 2 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

그것은 .NET 프레임 워크 3.0에 도입 된 WindowsBase.DLL에의 ... 밑줄이 그어집니다. 이 파일은 c : \ Program Files \ Reference에 있습니다. Assemblies \ Microsoft \ Framework \ v3.0 \ WindowsBase.dll

관련 문제