вывести на второй монитор/ТВ копию/содержимое окна
Исходные данные: контекст (HDC) и прямоугольник (TRect) - изображение которое нужно отобразить
Задача: найти и подключить или "создать" второй монитор в режиме FullScreen, в общем получить контекст и размеры второго монитора/телевизора.
прога, кторую пишу, имеет кучу всяких оконых элементов, на одном из них рисуется карта города, эту карту (и только её) и нужно в полноэкранном режиме вывести на второй монитор.
пишу на Delphi7, но и от примера на C++ не откажусь :)
заранее благодарю!
p.s.
модуль Monitors не предлогать! у меня подключено два монитора (второй - ТВ), а свойство MonitorsCount показывает один.
видюха находится в режиме клон + "театр" (т.е. при просмотре видео получается как раз так как надо, только вот мне нужно не видео а простой BitBlt...)
p.p.s
если решение будет найдено выложу исходник соотвествующего класса ;-)
{
::Rectangle(hdcMonitor, lprcMonitor->left, lprcMonitor->top, lprcMonitor->right, lprcMonitor->bottom);
return true;
}
void __fastcall MoniEnum()
{
HDC dc = GetDC(NULL);
EnumDisplayMonitors(dc, NULL, MoniEnumProc, 0);
ReleaseDC(NULL, dc);
}
я делал так:
dd:TDisplayDevice;
dm:TDeviceMode;
EnumDisplayDevices(nil,1,dd,0); // возвращает истину если видюха имеет возможность подключения нескольки мониторов (в данном случае двух)
EnumDisplaySettingsEx(dd.DeviceName, ENUM_REGISTRY_SETTINGS, dm, 0); // возвращает текущие настроки второго монитора (сохранённые в реестре, как обещает оф.дока..)
dm.dmBitsPerPel:=32; // иногда бывает 8 бит, почему-то
ChangeDisplaySettingsEx(dd.DeviceName, dm, 0, CDS_FULLSCREEN, nil);
dc2:=CreateDC(dd.DeviceName, nil, nil, @dm);
PatBlt(dc2,0,0,dm.dmPelsWidth,dm.dmPelsHeight,PATCOPY);
...
DeleteDC(dc2);
ну.. что сказать.. как бы получается добыть контекст на второй моник, но:
1. разрешение у него непонятное какое-то
2. восстановить прежнии настройки видюхи программно не представляется возможным (не записью заранее считанных настроек, не как пишит оф.дока "нулевыми" параметрами)
3. а подбором возможных значений настроек методом тыка, можно добится что второй пункт и в ручную порой затруднительно выполнить
прихожу к неутешительному заключению: придётся копать в сторону DirectX. сама винда на такие изыски как фуллскрин+ширина+высота не способна
режим "театр", он же "overlay", он же "видеоналожение" (или отражение)...
используется многими видеоплеерами для копии изображения (видео) из окна плеера на второй монитор (ТВ) "на весь экран" (без чёрных рамок)
так или иначе название и место расположения опции зависит от видюхи и дров.
у меня видюха на чипсете ATI. основной монитор 19" 16:9 1440/900, второй (ТВ) 40" 16:9 1920/1080, т.к. подключен через S-Video разрешение в два раза ниже.
не зависимо от того, какой режим выставлен, клон или расширение рабочего стала, на втором монике:
1. по краям чёрная рамка
2. всё изображение не помещается (по горизонтали), за исключением когда разрешение 1024/768 (и меньше), и всё с теми же рамками по краям и естествено искажёнными пропорциями (должен всё же признать, что рамки убираются включением опции "переразвертка")
3. мышке на втором монике делать нечего...
уже сделал на DirectX, малюсенькую DLLку, с двумя экспортируемыми функциями (одна для настроек пропорций, другая рисования).
Спасибо, за попытки помочь!
если всё же кто-то предложит решение на чистом Win-API, будет любопытно взглянуть, обсудить :-)
главная проблема, с которой я столкнулся (см. посты выше) - это не возможность выяснить все эти режимы (клон, расширеный и т.п.), программно включить нужный, и в конце работы с моником восстановить всё как было
p.s. в режиме расширения рабочего стола, можно в принципе работать, как я уже написал выше, включив "переразвертку" или если ТВ позволяет, то подстроив его...
и, пользоватся надо не BitBlt а StretchBlt (в любом случае)