2009-08-24 24 views
3

クライアント領域にガラスフレームを拡張するためにウィンドウに設定できる添付プロパティを書き込みました(DwmExtendFrameIntoClientArea APIを使用)。ほとんどの場合、正常に動作します。今、私は私の窓がボーダレスになりたいので、私は私の窓に次の属性を設定します。 境界線のないWPFウィンドウでVistaガラス効果を有効にします

WindowStyle="None" 
    ResizeMode="NoResize" 
    Background="Transparent" 
    u:WinUtil.EnableGlass="True" 
    ShowInTaskbar="False" 

しかし、これらの属性を持つ

は、ガラスがまったく表示されません:私の窓は、単に透明な背景を持っています。 ResizeModeCanResizeに設定すると、ガラスが表示されますが、ウィンドウのサイズを変更できないようにしたいとします。

私は、非クライアントフレームをクライアント領域に拡張することによってガラス効果が得られると考えています:WindowStyle = NoneResizeMode = NoResizeで、クライアントフレームは存在しないので、拡張するものは何もありません。サイズ変更を有効にすると、ウィンドウの周りにフレームが作成されるので、フレームを拡張できます。

は、私は細い境界線、ノータイトルバーを持つウィンドウを作成することが可能であるべきであり、適切なWS_ *ビットを設定することにより、サイズを変更することはできないと思いますが、私は知らないかを正確にもの

は、だから私の質問は以下のとおりです。スタイルビットは、所望の外観と動作を持つように設定または設定解除する必要があります

  1. ウィンドウのスタイルビットを初期化するにはどうすればよいですか? Windowクラスには、WindowsフォームCreateParamsというプロパティはありません。ハンドルの作成後にこれらのビットを設定しても問題ありませんか?
  2. 質問2の答えになる可能性があるHwndSourceクラスが見つかりましたが、Win32の専門家でない場合は少し複雑に思えます...私の問題は賢明な解決策ですか?

何かアドバイスは

答えて

5

あなたはDwmEnableBlurBehindWindowを使用してみましたが歓迎されていますか?これにより、ウィンドウのクライアント領域の特定の部分を透過的にすることができます。

+0

これは有望です、ありがとうございます。今使用している方法を理解する必要がありますが、それほど悪くはありません; –

+0

これまでのところ、私のウィンドウは必死に黒く残っています... –

+3

OK、得ました...私は 'CompositionTarget .BackgroundColor'を 'Transparent'に、' AllowsTransparency'をtrueに設定します。ありがとう! –

4

私は窓ガラスを持っていました(タイトルバーとサイズ変更不可)、あなたと同じ問題に遭遇しました。これは、ウィンドウのスタイルを設定するだけでは達成できません。私の解決策はResizeMode = "CanResize"とWindowStyle = "None"を設定し、WM_NCHITTESTイベントを処理してサイズ変更可能な境界線ヒットをサイズ変更不可能な境界線ヒットに変換することでした。また、(Windowsのショートカットを使用)、システムメニューの最大化や最小化する無効にするには、ウィンドウのスタイルを変更する必要がありました:(

private void Window_SourceInitialized(object sender, EventArgs e) 
{ 
    System.Windows.Interop.HwndSource source = (System.Windows.Interop.HwndSource)PresentationSource.FromVisual(this); 
    source.AddHook(new System.Windows.Interop.HwndSourceHook(HwndSourceHook)); 

    IntPtr hWnd = new System.Windows.Interop.WindowInteropHelper(this).Handle; 
    IntPtr flags = GetWindowLongPtr(hWnd, -16 /*GWL_STYLE*/); 
    SetWindowLongPtr(hWnd, -16 /*GWL_STYLE*/, new IntPtr(flags.ToInt64() & ~(0x00010000L /*WS_MAXIMIZEBOX*/ | 0x00020000L /*WS_MINIMIZEBOX*/ | 0x00080000L /*WS_SYSMENU*/))); 
} 

private static IntPtr HwndSourceHook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) 
{ 
    switch (msg) 
    { 
     case 0x0084 /*WM_NCHITTEST*/: 
      IntPtr result = DefWindowProc(hwnd, msg, wParam, lParam); 
      if (result.ToInt32() >= 10 /*HTLEFT*/ && result.ToInt32() <= 17 /*HTBOTTOMRIGHT*/) 
      { 
       handled = true; 
       return new IntPtr(18 /*HTBORDER*/); 
      } 
      break; 
    } 
    return IntPtr.Zero; 
} 

[System.Runtime.InteropServices.DllImport("user32.dll")] 
private static extern IntPtr DefWindowProc(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam); 

[System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)] 
private static extern IntPtr SetWindowLongPtr(IntPtr hWnd, int nIndex, IntPtr dwNewLong); 
[System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)] 
private static extern IntPtr GetWindowLongPtr(IntPtr hWnd, int nIndex); 

これはあなたに通知領域のフライアウトに適したWindows 7のウィンドウを与える例えばクロックまたはボリュームフライアウト)。ところで、高さ44のコントロールを作成し、その背景を設定することで、フライアウトの下部に陰影を再現することができます:

関連する問題