Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

вывести на второй монитор/ТВ копию/содержимое окна

48K
19 апреля 2009 года
vynt
3 / / 19.04.2009
Запарился искать ответ в и-нете... Аналогичных вопросов много, но и ответы на них "аналогичные"...

Исходные данные: контекст (HDC) и прямоугольник (TRect) - изображение которое нужно отобразить
Задача: найти и подключить или "создать" второй монитор в режиме FullScreen, в общем получить контекст и размеры второго монитора/телевизора.
прога, кторую пишу, имеет кучу всяких оконых элементов, на одном из них рисуется карта города, эту карту (и только её) и нужно в полноэкранном режиме вывести на второй монитор.

пишу на Delphi7, но и от примера на C++ не откажусь :)
заранее благодарю!

p.s.
модуль Monitors не предлогать! у меня подключено два монитора (второй - ТВ), а свойство MonitorsCount показывает один.
видюха находится в режиме клон + "театр" (т.е. при просмотре видео получается как раз так как надо, только вот мне нужно не видео а простой BitBlt...)

p.p.s
если решение будет найдено выложу исходник соотвествующего класса ;-)
443
22 апреля 2009 года
REmindER
292 / / 23.03.2003
А если через функцию EnumDisplayMonitors? К сожалению, второго монитора нет, проверить не могу.
443
22 апреля 2009 года
REmindER
292 / / 23.03.2003
К примеру:
Код:
BOOL CALLBACK MoniEnumProc(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData)
        {
        ::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);
}
48K
23 апреля 2009 года
vynt
3 / / 19.04.2009
на сколько я понимаю, таким образом можно получить 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. сама винда на такие изыски как фуллскрин+ширина+высота не способна
443
24 апреля 2009 года
REmindER
292 / / 23.03.2003
Добыл провод, подключил телевизор как второй монитор. Если рабочий стол расширен на второй монитор, то EnumDisplayMonitors работает идеально, сообщает, что есть 2 монитора, BitBlt копирует изображение без всяких проблем. Клон - это просто копия основного монитора, что значит "театр"? У меня такого нет.
48K
26 апреля 2009 года
vynt
3 / / 19.04.2009
Цитата: REmindER
Добыл провод, подключил телевизор как второй монитор. Если рабочий стол расширен на второй монитор, то EnumDisplayMonitors работает идеально, сообщает, что есть 2 монитора, BitBlt копирует изображение без всяких проблем. Клон - это просто копия основного монитора, что значит "театр"? У меня такого нет.



режим "театр", он же "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 (в любом случае)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог