2013-05-27 61 views
26

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

+5

彼らはボーダレスであることをあなたの仮定は、単に間違っています。 VS2012とOffice 2013のプログラムは、Spy ++で見ることのできるものではありません。私はDwmSetWindowAttribute()、特にDWMWA_ALLOW_NCPAINTを推測しています。 –

+1

私はDWMWA_ALLOW_NCPAINTを読んでいます。だから、2013とVS2012はそれを隠すために境界を越えていますか? –

+0

私は知らない、それはちょうど推測です。あなたはそれに取り組んだプログラマーに尋ねなければなりません。あなたがここで彼を見つけ、分かち合うつもりはありません。 –

答えて

32

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)、小さなフレームが表示されますそれ:

borderless window with shadow and frame showing in client area

だから、非透明ウィジェット、ブラシや透明要素の後ろに何かを置くために必要がある場合があります。

すべてがうまくいけば、それはこのようになります。

enter image description here

Here is a small example project、F11は、ウィンドウ/ボーダーレスモードを切り替え、F12はオンとオフボーダレス影を切り替えます。

+0

スチームにはまだAeroのものと同じ影があります。 Aero Snap/Shake/Stuffもありますが、アニメーションは最小限に抑えられています。 – Keavon

+0

@RandomUser私のソリューションは、シャドウワークを行うために必要なウィンドウスタイルの結果である、遷移を最小化することを除いてすべてを行います。 Outlook 2013でもこれが欠けているので、Visual Studioのように見せ掛けることなく可能であるとは思わない。 (ときには、ウィンドウのフレームが "クライアント"領域内で表示されるのを見ることができます - 実際にはフレームを引くように見えます) – melak47

+0

Visual Studioの最小化アニメーションは、境界線を持つウィンドウのように見えます。彼らは本当に良い仕事をしていたのですか?どのように私たちもそれを偽造について行くことができる任意のアイデア? – Keavon

9

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

C++/Qtの例を探している人のために、このGitHubプロフェクトは、melak47コードに基づいた魅力(deimos1877のおかげ)のような仕事をしています! https://github.com/deimos1877/BorderlessWindow

必要なDLLを取得するにはVisual Studioコンパイラ(> = 2010)を使用してください。動作するはずです。 この例には、エアロスペースサポート、ボーダレスウィンドウ、最小限のエフェクト、エアロシャドウが含まれています。

+2

これは最高の答えです。このデモを使用するには、新しい人々がここに来ることを願っています。 – lygstate

+0

Qt5で8行目の 'qwinhost.cpp'に' qWinAppInst() '識別子が見つからないと不平を言ってコンパイラエラーが発生します。 'qWinAppInst()'はQt5.8のQtCoreから削除されています([here](https://github.com/qtproject/qt-solutions/commit/master)を参照)。そのため、 'GetModuleHandle( 0) ' – user2366975

-1

私はPhotoshopとして応答するものを作成しました。

BorderlessWindowQt-Modern-Gui

Image True Borderless WindowQt

+0

私はdownvoteを言っていませんでした、私はちょうどリンクが壊れている場合、あなたの答えは役に立たなくなる – eyllanesc

関連する問題