Окно без полей с использованием Areo Snap, Shadow, Min анимации и Shake

Я делаю приложение с окном без полей в Windows. Однако, поскольку окно не имеет границ, у меня нет тени арео, привязки, анимации минимизации или дрожания. Я посмотрел вокруг и не нашел сайт, который объясняет, как это реализовать. Тем не менее, я знаю, что это возможно, потому что Office 2013, Visual Studio 2012 и Steam имеют все эти функции и не имеют границ. Я специально использую QT и C ++, но если вы решили это для другой библиотеки окон, я также хотел бы услышать ваши решения. или. Под арео-тенью я не подразумеваю падающую тень с двух сторон, я имею в виду светящуюся тень со всех сторон всех активных приложений Windows.

28

Решение

После использования Spy ++ для проверки окна Steam (его стилей окна, как он отвечает на сообщения окна) и попытки сопоставить все, что он делает, в сочетании с вызовами DWMAPI из этого C # поведение без полей, Я думаю, что я понял это.

Чтобы скрыть границу окна, обработайте 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 не требуется, настройки по умолчанию работают.

Одно слово предостережения: DwmExtendFrameIntoClientArea делает именно то, что предлагает название, поэтому, если вы рисуете изображение с альфа-каналом прямо в вашей клиентской области (скажем, с помощью opengl, direct3d / 2d), через него будет виден небольшой кадр:

окно без полей с тенью и рамкой в ​​зоне клиента

Таким образом, вам может понадобиться поместить непрозрачный виджет, кисть или что-то позади прозрачного элемента.

Если все идет хорошо, это должно выглядеть так:

введите описание изображения здесь

Вот небольшой пример проекта, F11 переключает режим без полей и окон, F12 включает и выключает тень без границ.

37

Другие решения

Спасибо melak47 за ваш ответ.

Для людей, которые ищут пример C ++ / Qt, этот проект GitHub выполняет свою работу как брелок (благодаря deimos1877), основанный на коде melak47!
https://github.com/deimos1877/BorderlessWindow

Обязательно используйте компилятор Visual Studio (> = 2010), чтобы получить необходимую DLL, и она должна работать.
Этот пример включает поддержку aerosnap, окно без границ, эффект минимизации, аэротени.

11

Я создал тот, который отвечает как фотошоп.

BorderlessWindowQt-Модерн-Гуй

Изображение True Borderless WindowQt

1
По вопросам рекламы [email protected]