Я пытаюсь создать окно без рамки, в котором развернутое окно должным образом соответствует рабочей области экрана при развертывании. Это оказалось сложнее, чем я мог себе представить, и у каждого решения, которое я могу найти, есть какой-то недостаток или сбой, который мешает ему быть идеальным. Некоторые глюки очень незначительны и, вероятно, не будут иметь большого значения для большинства людей, но это беспокоит меня.
Я знаю, что это можно сделать каким-то образом, потому что я использовал несколько программ, которые четко рисуют свою собственную не-клиентскую область, но имеют правильное поведение максимизации и выглядят без сбоев. Клиенты Steam и Twitch - два примера. Однако я понятия не имею, сколько кода или какие уловки они использовали, чтобы заставить их окна иметь такое поведение.
Справочная информация:
При максимизации окна диспетчер окон позиционирует окно таким образом, что не-клиентская область выходит за пределы видимой рабочей области, так что не-клиентская область не видна, когда окно развернуто. Я удаляю не-клиентскую область, возвращая 0 из WM_NCCALCSIZE, потому что я хочу иметь возможность рисовать свою собственную не-клиентскую область. В результате оконный менеджер пытается учесть неклиентскую область, которая не существует, и мое развернутое окно без полей расширяется за пределы экрана примерно на 7 или 8 пикселей во всех направлениях.
Что я пытался исправить это:
Я пытался обработать WM_MINMAXINFO, который не работает, потому что оконный менеджер игнорирует все пропущенные измерения, если они не меньше рабочей области или области монитора. Например, если я вычитаю 1 из координаты ptMaxSize.x, окно подходит почти идеально, за исключением прозрачного пространства в 1 пиксель, где вы можете щелкнуть все, что находится за окном. См. этот пост для получения дополнительной информации.
Что почти работает:
Я обнаружил это сообщение , в котором содержится решение, которое почти идеально работает, за исключением того, что при максимизации окна с помощью Aero Snap появляется очень короткое мерцание, где вы можете видеть все за окном. Этого не происходит при максимизации окна путем двойного щелчка по строке заголовка или использования кнопок максимизации, даже при настройке размера не клиентской области на максимизации. Вот видео , демонстрирующее проблему.
Видео объяснение:
Во-первых, я максимизирую окно несколько раз с помощью Aero Snap, не внося изменений в область, не относящуюся к клиенту, чтобы продемонстрировать, что переход максимизации без мерцания. Затем я показываю, что окно мерцает после настройки размера не клиентской области при максимизации.
Мой вопрос:
Есть ли способ предотвратить появление мерцания при использовании этого метода для подгонки развернутого окна без полей к рабочей области? Или есть ли лучший способ заставить максимизированное окно соответствовать размеру экрана? Обработка WM_MINMAXINFO выглядела как лучший подход без взлома, но из-за необычного способа, которым окна реагируют на измерения, которые больше или равны рабочей области, это не похоже на работу.