私はWindows上にフチ無しウィンドウを持つアプリケーションを作成しています。しかし、ウィンドウは境界線がないため、アローシャドー、スナップ、最小化アニメーション、またはシェイクがありません。私は周りを見て、これを実装する方法を説明するサイトが見つかりませんでした。しかし、Office 2013、Visual Studio 2012、およびSteamはすべてこれらの機能を備えており、ボーダーレスなのでこれが可能であることはわかっています。私は特にQTとC++を使用していますが、これを別のウィンドウライブラリ用に解決した場合は、あなたのソリューションも聞きたいと思います。どちらか。そして、アローシャドウでは、私は両側にドロップシャドウを意味するわけではありません。つまり、アクティブなネイティブアレゴウィンドウアプリケーションのすべての側面に輝く影を意味します。Areoスナップ、シャドウ、アニメーションを最小化、シェイクを使用するフチ無しウィンドウ
答えて
Spam ++を使用してSteamのウィンドウ(ウィンドウのスタイル、ウィンドウメッセージに返信する方法)を検査した後、そのすべてを照合しようとした後、C# borderless window behaviorのDWMAPI呼び出しと組み合わせて考えました。
があなたの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
を使用しました。
DWMWA_NCRENDERING_POLICY
またはDWMWA_ALLOW_NCPAINT
からDwmSetWindowAttribute
を変更すると、デフォルト設定が機能しているようです。
名前のとおり、アルファチャンネルを使用して直接画像を描画している場合(例:opengl、direct3d/2d)、小さなフレームが表示されますそれ:
だから、非透明ウィジェット、ブラシや透明要素の後ろに何かを置くために必要がある場合があります。
すべてがうまくいけば、それはこのようになります。
Here is a small example project、F11は、ウィンドウ/ボーダーレスモードを切り替え、F12はオンとオフボーダレス影を切り替えます。
スチームにはまだAeroのものと同じ影があります。 Aero Snap/Shake/Stuffもありますが、アニメーションは最小限に抑えられています。 – Keavon
@RandomUser私のソリューションは、シャドウワークを行うために必要なウィンドウスタイルの結果である、遷移を最小化することを除いてすべてを行います。 Outlook 2013でもこれが欠けているので、Visual Studioのように見せ掛けることなく可能であるとは思わない。 (ときには、ウィンドウのフレームが "クライアント"領域内で表示されるのを見ることができます - 実際にはフレームを引くように見えます) – melak47
Visual Studioの最小化アニメーションは、境界線を持つウィンドウのように見えます。彼らは本当に良い仕事をしていたのですか?どのように私たちもそれを偽造について行くことができる任意のアイデア? – Keavon
あなたの答えはmelak47に感謝します。
C++/Qtの例を探している人のために、このGitHubプロフェクトは、melak47コードに基づいた魅力(deimos1877のおかげ)のような仕事をしています! https://github.com/deimos1877/BorderlessWindow
必要なDLLを取得するにはVisual Studioコンパイラ(> = 2010)を使用してください。動作するはずです。 この例には、エアロスペースサポート、ボーダレスウィンドウ、最小限のエフェクト、エアロシャドウが含まれています。
これは最高の答えです。このデモを使用するには、新しい人々がここに来ることを願っています。 – lygstate
Qt5で8行目の 'qwinhost.cpp'に' qWinAppInst() '識別子が見つからないと不平を言ってコンパイラエラーが発生します。 'qWinAppInst()'はQt5.8のQtCoreから削除されています([here](https://github.com/qtproject/qt-solutions/commit/master)を参照)。そのため、 'GetModuleHandle( 0) ' – user2366975
私はdownvoteを言っていませんでした、私はちょうどリンクが壊れている場合、あなたの答えは役に立たなくなる – eyllanesc
- 1. Wix Toolsetのフチ無しウィンドウ
- 2. CEF 3フチ無しのウィンドウ
- 3. Caliburn.Micro:WPFを使用してIWindowManagerでフチ無しのウィンドウを作成
- 4. wpfでフチ無しウィンドウを移動
- 5. ウィンドウの最大化/最小化を無効にする
- 6. 複数のモニタを使用したフチ無しフォームの最大化c#
- 7. エアロ・スナップが大きすぎる最大化状態の枠無しウィンドウ
- 8. スナップSVGアニメーション無限ループが
- 9. フチ無しフォームエッジ
- 10. SDL最小化ウィンドウ
- 11. javafx2のウィンドウを最小化
- 12. ウィンドウを最小化する方法は?
- 13. ウィンドウをシステムトレイに最小化する
- 14. windows:タイトルバーをダブルクリックすると最大化ウィンドウを無効にし、タスクバーをクリックすると最小化する
- 15. UITableViewCellアニメーションの最小化と最大化
- 16. シャドウとブラービハインドの枠無しウィンドウ
- 17. Androidフチ無しダイアログ
- 18. フル機能を備えたフチ無しのウィンドウ
- 19. Qt C++最小化と最大化ウィンドウ
- 20. 自動ユーザーが最小化するとウィンドウを最大化
- 21. ウィンドウから最小化/最大化ボタンを削除する、OpenTK
- 22. JavaScriptを使用して最小化/最大化する方法
- 23. ウィンドウをアニメートする方法ウィンドウ内でアニメーションを最小化/表示する方法はありますか?
- 24. ShowDialogとフチ無しのウィンドウを使用しているときにIsMouseOverトリガが機能しない
- 25. 最小化CMDウィンドウを復元
- 26. NoResizeモードのウィンドウを最小化
- 27. Atom Electron htmlボタンとJavaScriptを使用してウィンドウを閉じて最小化
- 28. 最小化と最大化を伴う剣道ウィンドウ
- 29. ウィンドウのデフォルトとして最小化を設定するには?
- 30. インターポレーターを使用してX3DOMアニメーションを最適化する
彼らはボーダレスであることをあなたの仮定は、単に間違っています。 VS2012とOffice 2013のプログラムは、Spy ++で見ることのできるものではありません。私はDwmSetWindowAttribute()、特にDWMWA_ALLOW_NCPAINTを推測しています。 –
私はDWMWA_ALLOW_NCPAINTを読んでいます。だから、2013とVS2012はそれを隠すために境界を越えていますか? –
私は知らない、それはちょうど推測です。あなたはそれに取り組んだプログラマーに尋ねなければなりません。あなたがここで彼を見つけ、分かち合うつもりはありません。 –