Windowsでボーダーレスウィンドウのアプリを作っています。ただし、ウィンドウは縁なしなので、領域の影、スナップ、最小化アニメーション、揺れはありません。私は周りを見回しましたが、これを実装する方法を説明しているサイトは見つかりませんでした。ただし、Office 2013、Visual Studio 2012、Steam にはすべてこれらの機能があり、ボーダレスであるため、それが可能であることはわかっています。私は特にQTとC++を使用していますが、別のウィンドウライブラリでこれを解決した場合は、あなたの解決策も聞きたいです. また。そして、areo シャドウとは、2 つの側面にドロップ シャドウを意味するのではなく、すべてのアクティブなネイティブ エリア ウィンドウ アプリケーションのすべての側面に光る影を意味します。
3 に答える
Spy++ を使用して Steam のウィンドウ (ウィンドウ スタイル、ウィンドウ メッセージへの応答方法) を検査し、このC# ボーダレス ウィンドウ動作からの DWMAPI 呼び出しと組み合わせて、すべてを一致させようとした後、私はそれを理解したと思います.
ウィンドウの境界線を非表示WM_NCCALCSIZE
にするには、WindowProc でメッセージを処理します。
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
た。
変更DWMWA_NCRENDERING_POLICY
またはDWMWA_ALLOW_NCPAINT
経由DwmSetWindowAttribute
は必要ないようです。デフォルト設定が機能しているようです。
1 つの注意点:DwmExtendFrameIntoClientArea
名前が示すとおりに動作するため、アルファ チャネルを使用して画像をクライアント領域に直接描画している場合 (たとえば、opengl、direct3d/2d を使用)、それを通して小さなフレームが表示されます。
そのため、透明でないウィジェット、ブラシ、または透明な要素の後ろに何かを配置する必要がある場合があります。
すべてがうまくいけば、次のようになります。
これは小さなサンプル プロジェクトです。F11 はボーダレス/ウィンドウ モードを切り替え、F12 はボーダレス シャドウのオンとオフを切り替えます。
melak47 さん、ご回答ありがとうございます。
C++/Qt の例を探している人にとって、この GitHub プロジェクトは、melak47 コードに基づいて (deimos1877 のおかげで) 魅力的な仕事をします! https://github.com/deimos1877/BorderlessWindow
Visual Studio コンパイラ (>= 2010) を使用して、必要な DLL を取得してください。動作するはずです。この例には、エアロスナップのサポート、ボーダレス ウィンドウ、効果の最小化、エアロ シャドウが含まれます。