web-dev-qa-db-ja.com

Aeroスナップ、シャドウ、アニメーションの最小化、シェイクを使用したボーダーレスウィンドウ

Windowsでフチなしウィンドウのあるアプリケーションを作成しています。ただし、ウィンドウには枠がないため、面影、スナップ、最小化アニメーション、またはシェイクはありません。私は周りを見回しましたが、これを実装する方法を説明するサイトは見つかりませんでした。ただし、Office 2013、Visual Studio 2012、Steamはすべてこれらの機能を備えており、ボーダレスであるため、それが可能であることを知っています。私は特にQTとC++を使用していますが、別のウィンドウライブラリでこれを解決した場合は、あなたの解決策も聞きたいです。どちらか。また、areoシャドウとは、両面のドロップシャドウを意味するのではなく、アクティブなすべてのネイティブareoウィンドウアプリケーションのすべての面に輝くシャドウを意味します。

30
joshua-anderson

Spy ++を使用してSteamのウィンドウ(ウィンドウスタイル、ウィンドウメッセージに応答する方法)を検査し、これをすべて一致させて、これからのDWMAPI呼び出しと組み合わせた後 C#ボーダーレスウィンドウの動作 、私は考え出したと思いますそれを出します。

ウィンドウの境界線を非表示にするには、WindowProcで_WM_NCCALCSIZE_メッセージを処理します。

_case WM_NCCALCSIZE: {
    if (window->is_borderless) {
        return 0;
    } else {
        return DefWindowProc(hwnd, msg, wparam, lparam);
    }
}
_

シャドウを有効にするために必要なことは、次のとおりです。

_MARGINS borderless = {1,1,1,1};
DwmExtendFrameIntoClientArea(hwnd, &borderless);
_

オフに戻すには、デフォルトのマージンを_MARGINS windowed = {0,0,0,0};_に戻します。おそらくSetWindowPos(hwnd, 0, 0, 0, 0, 0, SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED | SWP_ASYNCWINDOWPOS | SWP_NOSIZE | SWP_NOMOVE );もスローして、フレームが確実に再描画されるようにします。

ただし、これはすべてのウィンドウスタイルで機能するとは限りません。明らかに、ウィンドウスタイルにタイトルバーを含めることはできません。 タイトルバーは正常に機能し、追加すると最小化アニメーションが有効になるようです。

影を操作する最も単純なウィンドウスタイルは_WS_POPUP | WS_THICKFRAME_でした。これにより、_WS_POPUP | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_CAPTION_を使用してエアロスナップ、最大化、最小化、スムーズな最小化アニメーションも取得できます。

DwmSetWindowAttributeを介して_DWMWA_NCRENDERING_POLICY_または_DWMWA_ALLOW_NCPAINT_を変更する必要はないようですが、デフォルト設定は機能しているようです。

注意事項:DwmExtendFrameIntoClientAreaは、その名前が示すとおりに動作するため、アルファチャネルを含む画像をクライアント領域に直接描画している場合(たとえば、opengl、direct3d/2dを使用)、小さなフレームが表示されます。それを通して:

borderless window with shadow and frame showing in client area

そのため、非透明ウィジェット、ブラシなどを透明要素の後ろに配置する必要がある場合があります。

すべてがうまくいけば、次のようになります。

enter image description here

これは小さなサンプルプロジェクトです 、F11はボーダーレス/ウィンドウモードを切り替え、F12はボーダーレスシャドウのオンとオフを切り替えます。

39
melak47

あなたの答えをmelak47に感謝します。

C++/Qtの例を探している人のために、このGitHubプロフェクトはmelak47コードに基づく魅力のように機能します(deimos1877に感謝)。 https://github.com/deimos1877/BorderlessWindow

必ず必要なVisual Studioコンパイラー(> = 2010)を使用して、必要なDLLを取得してください。この例はaerosnapサポート、ボーダーレスウィンドウ、最小化効果、エアロシャドウを含みます。

11
Kévin Renella

フォトショップとして反応するものを作成しました。

BorderlessWindowQt-Modern-Gui

Image True Borderless WindowQt

1
Moussa Ball