2012-03-19 2 views
3

현재 Windows Forms에서 사용자 정의 프레임 (DevExpress 'SkinManager.EnableFormSkins function 사용)을 사용하여 최상위 창을 만들려고하고 있으며 은 Windows 7 Aero에서 실행될 때이라는 창 주위에 그림자가 있습니다.WM_NCPAINT를 사용할 수 있고 Aero의 창 뒤에 그림자가 생길 수 있습니까?

enter image description here

와 나는 같이 할 :

창은 현재 다음과 같습니다

enter image description here

가 (즉, 창 주위에 부드러운 그림자가).

나는 연구와 CS_DROPSHADOW, asking the DevExpress support, reading on SO, other blogsMSDN documentation 사용을 포함하려고 착오를 많이했다.

아직 아무것도 내 창문에 그림자를 가져 오지 않습니다.

내 요구 사항이 단순히 달성 할 수 없다고 생각하지만, 여전히 기회를 포착하고 여기에서 질문하고 싶습니다.

(나는 심지어 내 실제 창 뒤에 기본 에어로 창을함으로써이 문제를 날조 생각하지만, 구현하는 데 실패 ...)

내 질문은 :

이 창을 할 수 있나요 맞춤형 비 클라이언트 (NC) 영역이 있고 Aero가 활성화되어있을 때이 창 주위에 그림자가 생깁니 까?

답변

0

가 요약하고 내 자신의 질문을 닫습니다, 노력의 정도 후, 나는이 단순히 불가능하다 생각하십시오.

내가 얻은 것은 Locus Effects article에서 사용되는 기술을 사용하여 그림자를 시뮬레이트하는 것입니다.

기본적으로 투명한 창을 사용하고 알파 블렌딩 PNG를 시뮬레이션 된 그림자로 동적으로 사용하고 창 양쪽 (및 모서리) 주위로 그려줍니다. 실제 창 이동시 투명한 창을 이동하십시오.

이 방법은 잘 작동하지만 다른 창을 예상대로 작동하지 않을 때 그림자가 사라지는 등의 작은 문제로 인해 사용자에게는 전문가답지 않게 보입니다.

제 결론은 다음과 같습니다. 합리적인 노력으로는 불가능합니다.

+1

이것은 가능하다고 생각합니다. wndproc를 덮어 쓰고'if (m.Msg == WM_ACTIVATE) DwmExtendFrameIntoClientArea (this.Handle, ref MARGIN);를 입력하십시오. 'MARGIN은 1로 채워야합니다 (0은 작동하지 않습니다). 'Margin MARGIN = {1,1,1,1}; 또한 FrameBorderStyle은이 작업을 위해 FrameBorderStyle.Sizeable이어야합니다. 그래서 당신은 이것을해야합니다 :'if (m.Msg == WM_NCCALCSIZE && m.WParam! = IntPtr.Zero) {m.Result = IntPtr.Zero; 반환; }'프레임 테두리를 제거합니다. –

0

이 같은 형태의 그림자를 이길 정의 시도 할 수

/// <summary> 
/// Base class for drop shadows forms. 
/// </summary> 
public partial class DropShadowForm : Form 
{ 
    private const int CS_DROPSHADOW = 0x00020000; 

    /// <summary> 
    /// Creates new instance of DropShadowForm. 
    /// </summary> 
    public DropShadowForm() 
    { 
     InitializeComponent(); 
    } 

    /// <summary> 
    /// Overrides from base class. 
    /// </summary> 
    protected override CreateParams CreateParams 
    { 
     [SecurityPermission(SecurityAction.LinkDemand, UnmanagedCode = true)] 
     get 
     { 
      CreateParams parameters = base.CreateParams; 

      if (DropShadowSupported) 
      { 
       parameters.ClassStyle = (parameters.ClassStyle | CS_DROPSHADOW); 
      } 

      return parameters; 
     } 
    } 

    /// <summary> 
    /// Gets indicator if drop shadow is supported 
    /// </summary> 
    public static bool DropShadowSupported 
    { 
     get 
     { 
      OperatingSystem system = Environment.OSVersion; 
      bool runningNT = system.Platform == PlatformID.Win32NT; 

      return runningNT && system.Version.CompareTo(new Version(5, 1, 0, 0)) >= 0; 
     } 
    }  
} 
+0

감사합니다. @Marcin - 나는 이미 그 시간 전에 이미 시도했다고 언급하는 것을 잊어 버렸습니다. 그 그림자는 불행하게도 Aero 그림자와 관련이 없습니다. –