#windows #winapi #direct2d
#Windows #winapi #direct2d
Вопрос:
В моем главном окне есть несколько дочерних окон, содержащих фильмы, управляемые Media Foundation. Главное окно рисуется с использованием Direct2D. Я не делаю никаких обрезок при рисовании главного окна с помощью Direct2D, потому что я ожидаю, что это будет сделано BeginPaint
в моем WM_PAINT
.
Когда мое окно довольно маленькое, все отрисовывается нормально. Однако, когда я увеличиваю его до разрешения 4096×2304 пикселей, появляется видимое мерцание, и я могу быстро увидеть материал, нарисованный Direct2D под дочерними окнами Media Foundation, прежде чем Media Foundation перенесет в них свое содержимое, поэтому похоже, что отсечения Direct2D на самом деле не происходит.
Это правда? Должен ли я вручную настраивать область отсечения Direct2D, чтобы она не перерисовывала дочерние окна Media Foundation, или я делаю что-то не так? Мое главное окно WS_CLIPCHILDREN
установлено.
Комментарии:
1. Дьявол скрывается в деталях. В конечном итоге это зависит от того, как вы кодируете все эти части вместе (устройства, цепочку обмена, как / что вы рисуете с помощью MF? и т.д.). Одно можно сказать наверняка, это определенно тот сценарий, который охватывается Direct Composition (win32) и более новой Windows.UI.Composition (winrt). Он предназначен для «составления» сцены (с использованием технологий DirectX), что, похоже, и есть то, что вы здесь делаете. В противном случае, у вас есть какой-нибудь воспроизводящий проект?
2. @SimonMourier: Я еще не создал MVCE, потому что, очевидно, задействован довольно большой код. Однако я пытался использовать
PushAxisAlignedClip
иPopAxisAlignedClip
, чтобы посмотреть, имеет ли значение, если я вручную установлю область отсечения, но, к сожалению, это не помогает, что меня несколько смущает. Кажется, что он по-прежнему отображается под дочерними окнами Media Foundation, хотя я явно указал область отсечения, используяPushAxisAlignedClip
. Очень странно :/3. На самом деле, рисование, похоже, вообще не является виновником
BeginDraw
, аEndDraw
является. Я могу удалить весь код рисования, и он все равно будет мерцать. Достаточно просто вызватьBeginDraw
иEndDraw
заставить его мерцать.4. Ой, извините, это оказалось ошибкой в моем коде. По какой-то причине
WS_CLIPCHILDREN
не был установлен при создании окна. Я исправил это, и теперь все работает нормально. Извините за путаницу.5. Как я уже сказал, дьявол скрывается в деталях 🙂