Я делаю приложение с окном без полей в Windows. Однако, поскольку окно не имеет границ, у меня нет области теней, привязки, анимации минимизации или дрожания. Я осмотрелся и не нашел сайта, который объясняет, как это реализовать. Однако я знаю, что это возможно, потому что Office 2013, Visual Studio 2012 и Steam имеют эти функции и не имеют границ. Я специально использую QT и C++, но если вы решили это для другой оконной библиотеки, я также хотел бы услышать ваши решения. либо. И под арео-тенью я не имею в виду тень с двух сторон, я имею в виду светящуюся тень со всех сторон всех активных нативных арео-приложений Windows.
Окно без полей с использованием Areo Snap, Shadow, Minimize Animation и Shake
Ответы (3)
После использования 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 включает и выключает тень без полей.
WS_CAPTION
к стилю, вы также получите анимацию минимизации.
- person melak47; 13.09.2013
Спасибо melak47 за ваш ответ.
Для тех, кто ищет пример C++/Qt, этот проект GitHub прекрасно справляется со своей задачей (спасибо deimos1877) на основе кода melak47! https://github.com/deimos1877/BorderlessWindow
Обязательно используйте компилятор Visual Studio (>= 2010), чтобы получить необходимую DLL, и она должна работать. Этот пример включает поддержку aerosnap, окно без полей, эффект минимизации, аэротени.
qwinhost.cpp
в строке 257, жалуясь на не найденный идентификатор qWinAppInst()
. qWinAppInst()
был удален из QtCore в Qt5.8 (см. здесь), поэтому вы надо заменить на GetModuleHandle(0)
- person user2366975; 04.04.2017
Я создал тот, который реагирует как фотошоп.