Windows GDI BitBlt / MaskBlt на нескольких дисплеях в современных системах: могут ли быть контроллеры домена на разных устройствах? - PullRequest
2 голосов
/ 10 октября 2019

Во время написания моего старого кода я наткнулся на какой-то путь к коду, который касается случая BitBlt или MaskBlt для HDC на разных дисплеях. Согласно документации этих функций

BitBlt возвращает ошибку, если контексты устройства источника и назначения представляют разные устройства. Для передачи данных между контроллерами домена для разных устройств преобразуйте растровое изображение памяти в DIB, вызвав GetDIBits. Чтобы отобразить DIB для второго устройства, вызовите SetDIBits или StretchDIBits.

и (MaskBlt)

При использовании в системе с несколькими мониторами hdcSrc и hdcDest должны ссылаться нак тому же устройству или функция не сработает. Чтобы передавать данные между контроллерами домена для разных устройств, преобразуйте битовую карту памяти (совместимую битовую карту или DDB) в DIB, вызвав GetDIBits. Чтобы отобразить DIB для второго устройства, вызовите SetDIBits или StretchDIBits.

Однако это было написано за время до того, как объединенные кадровые буферы стали обычным явлением. В наши дни в системах с несколькими дисплеями у вас обычно есть один большой кадровый буфер, из которого (различные) части сканируются на вывод дисплея. Таким образом, по логике он ведет себя как единый дисплей по отношению к GDI.

Интересно, может ли в текущих версиях Windows (то есть во всех после, включая Windows-7) действительно возникнуть ситуация, когда HDC приобретаются из окон или создаются с помощьюCreateCompatibleDC может реально жить на разных устройствах?

...