2012-03-19 14 views
3

現在、Windowsフォームにカスタムフレーム(DevExpress 'SkinManager.EnableFormSkins functionを使用)を使用してトップレベルのウィンドウを作成しようとしていますが、は、Windows 7 Aeroで動作しているときにウィンドウの周囲に影があります。WM_NCPAINTを使用することができ、まだAeroのウィンドウの陰影を取得できますか?

ウィンドウには、現在次のようになります。

enter image description here

と私はそれが次のようになりたい:(すなわち、ウィンドウの周りに柔らかい影を持っている)

enter image description here

私は多くの研究を行なったし、CS_DROPSHADOWasking the DevExpress supportreading on SOother 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 - 私はすでにあることを前に試したことに言及するのを忘れてしまった。そのドロップシャドウは、残念ながら、エアロの影とは関係ありません。 –

関連する問題