Изменение размера многослойных окон

Я надеюсь, что смогу разобраться с проблемой, которая у меня есть, без публикации тонны исходного кода. Источником всего является ASM, и хотя большинство бы это поняли, это все же не является их основной "вещью".

У меня есть многоуровневое окно, которое работает отлично - вплоть до изменения его размера. Окно все на пиксель альфа. Там нет прозрачных пикселей. Границы и заголовок непрозрачны (255 альфа); клиентская область - что-то вроде 128 альфа или что-то, на что я положил. Так что нет прозрачных пикселей.

У меня есть функция, которая обрабатывает перерисовки - она ​​на самом деле направлена ​​на восстановление кадра для нового размера окна. GetWindowDC вызывается в многоуровневом окне. CreateCompatibleDC создает от этого DC. Растровое изображение - это раздел DIB. Растровое изображение правильно отправляется в UpdateLayeredWindow. Опять же, все работает отлично, пока окно не находится в активном изменении размера (перетаскивание границы).

Я пытался использовать DefWindowProc для обработки перетаскивания границ, а также полностью обрабатывать все аспекты этой функциональности самостоятельно. Результаты одинаковы: сильное мерцание, но ТОЛЬКО за пределами границ окна, которые существовали до начала перетаскивания границ, и затем размер окна в конечном итоге не изменяется - вроде. Исходная область окна остается отображенной без проблем. Нет мерцания там. Однако если (например) я перетаскиваю правую границу вправо, все, что находится справа от правого края исходного окна, быстро мигает, а затем исчезает. Когда я отпускаю левую кнопку мыши, дисплей остается в исходном размере (размер окна был до перетаскивания границы). Я убедился, что растровое изображение правильно восстановлено до нового размера. Похоже, что DC для многослойного окна не хочет изменять размер, потому что вся область исходного размера окна полностью стабильна, но любая новая область, появляющаяся после изменения размера, мерцает, а затем скрывается.

Я даже пытался удалить стиль ws_ex_layered перед изменением размера окна в моей ручной обработке (я пробовал и MoveWindow и SetWindowPos), а затем сбрасывал стиль ex после SetWindowPos / MoveWindow, но перед перетаскиванием.

Когда я позволил DefWindowProc обрабатывать обновления, я получил точно такой же результат. Итак, есть основания полагать, что с моей перекраской что-то не так. Но я даже сократил этот процесс (закомментировав кучу кода для теста) и просто заполнил растровое изображение 0xFF0000FF (произвольное значение теста, синий, полная непрозрачность), а затем сразу перешел к UpdateLayeredWindow. Тот же результат.

Растровое изображение, используемое для UpdateLayeredWindow, удаляется перед вызовом функции "rebuild" и внутри функции, в которой растровое изображение воссоздается до нового размера. Я тщательно проверил новый размер - я вижу новое растровое изображение, так как оно быстро мигает, и все хорошо. DC - это GetWindowDC из многоуровневого окна. Совместимый DC создает этот DC. Растровое изображение выбирается в совместимый DC, и этот совместимый DC передается в UpdateLayeredWindow. Если бы что-то из этого было отключено, я бы никогда не увидел новое растровое изображение. Он там - он просто мигает на высокой скорости ТОЛЬКО за пределами окна, которые существовали до начала изменения размера. DefWindowProc дает те же результаты. В этой исходной области мои кнопки с надписью сдвигаются вправо, когда я перетаскиваю правую границу вправо, чтобы еще раз убедиться, что все в порядке.

Я в недоумении. Любой вклад будет приветствоваться.

0 ответов

Другие вопросы по тегам