Проблема, которую я заметил однажды в своей системе Win7, считал, что это ошибка DWM, поскольку она была исправлена после перезагрузки. Но теперь я понимаю, что это происходит (как поведение по умолчанию) в системах других людей, и это обычное поведение на Surface Pro.DWM in Win7/8 + GDI
Как воспроизвести проблему: реализовать, используя GDI, базовую систему лассо. Определите прямоугольник, управляемый мышью, когда прямоугольник изменится, приведет к недействительности старого (&) нового (или аннулирует объединение обоих прямоугольников, либо как новый прямоугольник, либо сложный регион, это не имеет значения, «ошибка», все равно показывается).
Во время wm_paint
вы просто удаляете фон & красите прямоугольник (он должен быть контуром прямоугольника, проблема не будет видна, если это заполненный прямоугольник). Вы можете сделать двойную буферизацию, если хотите быть уверенным, что это не проблескивая проблема (& доверяйте мне, что это не так).
Итак, что вы увидите, если у вас есть такая система, как у меня (рабочий стол Win7 с geforce, aero on), это обычная система лассо, не имеющая больше ореолов, чем собственный монитор. В других системах (например, Surface Pro, чтобы определить полностью известную систему), вы увидите, что при расширении лассо наружу граница лассо исчезает. Немного напоминает ЖК-экран, но в целом более заметный.
Теперь, вместо того, чтобы аннулировать прямоугольник лассо, попробуйте сделать недействительным все окно. И там больше нет ореолов.
Я выяснил, что это не признак недействительности, который «исправляет» его, это доступ к GDI. Вы можете также аннулировать весь прямоугольник, но только красите зону лассо, все еще ореолы. Но если вы нарисуете зону лассо и нарисуете один маленький пиксель на каждом углу окна, больше нет ореолов.
Должно быть что-то в DWM, возможно, начиная с версии 1.1, которая использует какое-то кеширование ограничивающей рамки последнего доступа GDI, и по какой-то странной причине то, что попадает в последнюю ограничительную рамку, сразу же появляется на экране , в то время как новая часть будет отложена по меньшей мере на 1 кадр.
Это довольно плохо, потому что он нарушает очень стандартное недействительность окна, которое использует каждый, и я не нашел способа исправить его (кроме как, конечно, недействительным всего окна, но это было бы глупо, & кроме это проблема, которая затрагивает весь GDI, поэтому вы везде получаете плохие визуальные результаты).
Опять же, скорее всего, в DWM 1.1, я не думаю, что вы можете получить это в Vista, но я не уверен. Я также не знаю, почему это не так на моем рабочем столе, возможно, это зависит от драйвера графической карты.
Так что, если кто-нибудь случится, чтобы узнать больше об этом ...
Трудно следовать за ним. Вы получите более эффективные ответы, если вы составите компилируемый тестовый проект, чтобы проиллюстрировать проблему. Вы написали код на C++? – ahmd0
нет, Delphi, поэтому. Я мог бы сделать видео о результатах. Но это довольно просто: 1. определить прямоугольник, 2. реализовать wm_mousemove, чтобы нижний правый прямоугольник следовал за мышью, недействительным прямоугольник (и только прямоугольник!) До и после перемещения, 3. реализовать wm_paint для заполнения фон и нарисуйте прямоугольник * с помощью GDI * (используйте двойную буферизацию, если хотите, не обязательно, проблема будет очевидна, если у вас есть). Это все. – user2516466
Редактировать: видео из системы, на которой это происходит (если ссылки работают здесь): http://youtu.be/iU_zhKZKzNA – user2516466