Я делаю приложение с окном без полей в Windows. Однако, поскольку окно не имеет границ, у меня нет тени арео, привязки, анимации минимизации или дрожания. Я посмотрел вокруг и не нашел сайт, который объясняет, как это реализовать. Тем не менее, я знаю, что это возможно, потому что Office 2013, Visual Studio 2012 и Steam имеют все эти функции и не имеют границ. Я специально использую QT и C ++, но если вы решили это для другой библиотеки окон, я также хотел бы услышать ваши решения. или. Под арео-тенью я не подразумеваю падающую тень с двух сторон, я имею в виду светящуюся тень со всех сторон всех активных приложений Windows.
После использования 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 включает и выключает тень без границ.
Спасибо melak47 за ваш ответ.
Для людей, которые ищут пример C ++ / Qt, этот проект GitHub выполняет свою работу как брелок (благодаря deimos1877), основанный на коде melak47!
https://github.com/deimos1877/BorderlessWindow
Обязательно используйте компилятор Visual Studio (> = 2010), чтобы получить необходимую DLL, и она должна работать.
Этот пример включает поддержку aerosnap, окно без границ, эффект минимизации, аэротени.