2013-05-27 2 views
26

Windows에서 경계선없는 창을 사용하여 응용 프로그램을 만들고 있습니다. 그러나 윈도우는 경계선이 없기 때문에 그림자, 스냅, 최소화 애니메이션 또는 흔들림이 없습니다. 나는 주변을 둘러 보았고이를 구현하는 방법을 설명하는 사이트를 찾지 못했습니다. 그러나 Office 2013, Visual Studio 2012 및 Steam은 모두 이러한 기능을 갖추고 있으며 경계가 없기 때문에 가능하다는 사실을 알고 있습니다. 저는 QT와 C++을 사용하고 있습니다. 그러나 다른 윈도우 라이닝 라이브러리에서이 문제를 해결 한 경우에도 솔루션을 듣고 싶습니다. 어느 한 쪽. 그리고 Areo 그림자에 의해 나는 양면에 그림자를 의미하지는 않습니다. 즉 모든 활성 네이티브 Areo Windows 응용 프로그램의 모든 측면에서 빛나는 그림자를 의미합니다.테두리가없는 창 Areo 스냅, 그림자, 애니메이션 최소화 및 흔들기 사용

+5

당신의 가정은 잘못된 것입니다. VS2012 및 Office 2013 프로그램은 Spy ++에서 볼 수있는 프로그램이 아닙니다. DwmSetWindowAttribute(), DWMWA_ALLOW_NCPAINT를 추측하고 있습니다. –

+1

DWMWA_ALLOW_NCPAINT에서 읽었습니다. 따라서 2013과 VS2012 단어를 숨기려면 경계선을 그립니다. –

+0

잘 모르겠습니다. 그냥 추측입니다. 프로그래머에게 그 일을 맡겨달라고 부탁해야 할 것입니다. 낮은 확률로 여기에서 찾을 수 있고 기꺼이 공유 할 수 있습니다. –

답변

32

Steam의 창 (창 스타일, 창 메시지에 응답하는 방법)을 검사하기 위해 Spy ++를 사용하고 DWMAPI가이 C# borderless window behavior에서 호출 된 것과 모두 일치시키려는 시도를 한 후에 나는 그것을 알아 냈다고 생각합니다.

이 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을 변경하는 것은 기본 설정이 작동하는 것 같습니다.

주의 사항 : DwmExtendFrameIntoClientArea은 정확히 이름에서 알 수 있듯이 알파 채널이 포함 된 이미지를 클라이언트 영역 (예 : 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

답변 해 주셔서 감사합니다.

C++/Qt 예제를 찾고있는 분들을 위해이 GitHub 전문가는 melak47 코드를 기반으로 한 매력 (deimos1877 덕분입니다)을 수행합니다! https://github.com/deimos1877/BorderlessWindow

필요한 DLL을 얻으려면 Visual Studio 컴파일러 (> = 2010)를 사용해야하며 제대로 작동해야합니다. 이 예에는 에어로 스페이스 지원, 테두리없는 창, 효과 최소화, 에어로 그림자가 포함됩니다.

+2

저는 이것이 최고의 답이라고 말하고 싶습니다. 새로운 사람들이이 데모를 사용하기 위해 여기에 오기를 바랍니다. – lygstate

+0

Qt5 포함.8 번 라인 257의'qwinhost.cpp'에'qWinAppInst()'식별자가 없다고 불평하는 컴파일러 오류가 발생합니다. Qt5.8의 QtCore에서'qWinAppInst()'가 삭제되었으므로 ([here] (https://github.com/qtproject/qt-solutions/commit/master) 참조), 당신은'GetModuleHandle (0)' – user2366975

-1

나는 포토샵으로 반응하는 것을 만들었습니다. 그들은 국경 것을

BorderlessWindowQt-Modern-Gui

Image True Borderless WindowQt

+0

나는 downvote를 말하지 않았다. 링크가 깨져야 대답이 쓸모 없게 되었기 때문에 링크가 단지지지가되어야한다고 말하고 싶다. – eyllanesc