Aeth
Гость
|
|
« : 05-12-2009 13:26 » |
|
Добрый день.
Уважаемые умы программирования мира сего, не сочтите за труд подсказать, как в Delphi сотворить такое:
1. Опросить видеокарту (или систему?) с целью определения максимального разрешения монитора. 2. Переключить приложение в полноэкранный режим (переключиться в найденный максимальный режим) 3. Получить селектор на видеопамять. 4. Нормально завершить приложение.
Если с пунктами 1, 2, 4 уже наступает ясность, то с 3йим просто беда!
С уважением.
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #1 : 05-12-2009 14:16 » |
|
Aeth, Ты в Windows не получиш прямого доступа к видеопамяти. Если используеш user mode.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #2 : 05-12-2009 19:05 » |
|
1. См. MSDN. Изменять что-либо в окружении из приложения - дурная идея. 2. См. свойства окна. F1 - есть такая клавиша: ставишь на что-нибудь в исходнике, жмешь F1 и получаешь доку по нему. 3. см. выше: нельзя. 4. Close() для главного окна, либо Application.Terminate().
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
x77
Модератор
Offline
Пол:
меняю стакан шмали на обратный билет с Марса.
|
|
« Ответ #3 : 06-12-2009 01:38 » |
|
а ить были времена, когда конструкции, типа l: word absolute C800 имели право на жисть
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #4 : 06-12-2009 05:08 » |
|
1 и 2 - применяй DirectX или OpenGL (может, ещё что появилось)
|
|
|
Записан
|
|
|
|
Aeth
Гость
|
|
« Ответ #5 : 06-12-2009 06:46 » |
|
Ну теоретически то должен быть способ "обмануть" Windows, заранее извиняюсь за возможную неграмотность, например, создаю TImage на весь экран - стало быть появился буфер в памяти, который время от времени копируется в видеопамять: и тут вижу два варианта: 1. Получить селектор на "видеобуфер" TImage и копировать в него сразу после его обновления - привязать к событию(теор). 2. Заблокировать обновление TImage(теор) и копировать туда, куда он копировался. Всё это конечно, не совсем ясно, и может быть наверняка многобуфферная модель хранения видеоинформации - это не даст ощутимого прироста в скорости, но в общем задача по передачи управления от системы к приложению будет решена.
DirectX - это вариант, но тут дело старой привычки, хотя изучить его было бы не плохо: может быть кто посоветует электронное вменяемое описание?
|
|
|
Записан
|
|
|
|
zubr
Гость
|
|
« Ответ #6 : 06-12-2009 12:31 » |
|
Не понял причем здесь TImage. TImage - это программный компонент (это даже не окно Windows) от Borland. Никакого отношения к видеопамяти он не имеет. Теперь по вопросам: 1. Функции API-Windows - EnumDisplayDevices, EnumDisplaySettings в помощь. Также не помешает обратить внимание на глобальный Delphi-объект Screen (класс TScreen, у него есть много полезных свойств, применительно к вопросам). 2. Form1.Width := Screen.Width; Form1.Height := Screen.Height; 3. Как уже выше было сказано, напрямую буфер на видеопамять в винде получить не возможно в UserMode. Можно сделать видео-драйвер (в DDK есть пример), но Delphi здесь ни причем. Я конечно не знаю целей вопроса, но возможно поможет просто получение контекста устройства дисплея GetDC(0);
|
|
« Последнее редактирование: 06-12-2009 12:41 от zubr »
|
Записан
|
|
|
|
Aeth
Гость
|
|
« Ответ #7 : 06-12-2009 13:21 » |
|
По поводу TImage я имею ввиду, что этот программный компонент, вероятнее всего, представляется в виде: буфер для информации + процедура, привязанная к обновлению экрана, которая копирует информацию из буфера в определённый раздел видеопамяти или другой более глобальный буфер, который другой процедурой копируется, опять же, в видеопамять.
За информацию спасибо;
Цель: необходимо использовать монитор, как единый массив, который "по обратному ходу луча" и команде будет обновлён информацией из временного буфера + возможность использовать функции Windows. Собираюсь работать только с двухмерной графикой, поэтому подключать дополнительные модули, такие как OpenGL, крайне не хотелось бы. Считаю(ошибаюсь?), что способ должен быть проще.
|
|
|
Записан
|
|
|
|
zubr
Гость
|
|
« Ответ #8 : 06-12-2009 17:00 » |
|
Тогда можно предложить следующий алгоритм: 1. Создаешь форму на весь экран. 2. Создаешь битмап по размеру формы var videobuf: TBitmap;
videoBuf := TBitmap.Create; videoBuf.Width := Form1.Width; videoBuf.Height := Form1.Height;
3. Далее в битмапе можно рисовать videoBuf.Canvas.MoveTo(0, 0); videoBuf.Canvas.LineTo(100, 100);, копировать содержимое формы в битмап videoBuf.Canvas.CopyRect(Rect(0, 0, Width, Height), Form1.Canvas, Rect(0, 0, Width, Height));, копировать из битмапа в форму Form1.Canvas.CopyRect(Rect(0, 0, Width, Height), videoBuf.Canvas, Rect(0, 0, Width, Height));
|
|
|
Записан
|
|
|
|
x77
Модератор
Offline
Пол:
меняю стакан шмали на обратный билет с Марса.
|
|
« Ответ #9 : 07-12-2009 05:22 » |
|
zubr, по-моему, это аналогично DoubleBuffered := TRUE у формы?
Aeth, проще всего поставить на машину не-винду, а тот же ДОС 6.1, и писать прогу на том же паскале. из-под винды получить доступ к буферу не удастся, как уже сказали. если же надо на винде сэмулировать работу с "видеобуфером", просто тупо рисуйте на форме.
у формы, кстати, есть свой "видеобуфер", как и у любого контрола с канвасом - TCanvas.Pixels, представляющий собой массив пикселей (RGB). может, вы это имеете в виду? только работать с ним лучше не напрямую (очень медленно), а через ScanLine.
|
|
|
Записан
|
|
|
|
zubr
Гость
|
|
« Ответ #10 : 07-12-2009 07:13 » |
|
zubr, по-моему, это аналогично DoubleBuffered := TRUE у формы? x77, а если надо, чтобы был временный буфер, в который что то рисуется в течение n-го количества времени, а затем одномоментно должно отобразиться в основном окне?
|
|
|
Записан
|
|
|
|
x77
Модератор
Offline
Пол:
меняю стакан шмали на обратный билет с Марса.
|
|
« Ответ #11 : 07-12-2009 07:18 » |
|
zubr, согласен, если под "видеобуфером" понимается виртуальный битмап, то это - оно самое
|
|
|
Записан
|
|
|
|
Aeth
Гость
|
|
« Ответ #12 : 07-12-2009 16:31 » |
|
zubr - правильно понял: "долгая" прорисовка в виртуальном буфере и "моментальный" вывод на экран.
TCanvas.Pixels - действительно ОЧЕНЬ долго, ScanLine - пока не пробовал, вообще, как компромисс, селектор то можно получить на начало буфера, например, TImage.
DOS - решил завязать - в реальном режиме - переключать банки + XMS виртуальные буфера - эта древность уже была, DPMI - это уже на паскаль, по крайней мере в этом варианте asm удобнее для меня, но программы получаются МЕГА объёмные даже для примитивных действий. Так родилась идея: использовать Delphi, как компоновщик модулей на asm.
Но в бочке мёда всегда есть ложка дёгтя: оторвать управление экраном от системы к приложению не получается.
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #13 : 07-12-2009 16:39 » |
|
Для этого и придумали OpenGL и DirectX Чтоб по быстрому кидать в экран.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #14 : 08-12-2009 04:06 » |
|
Для этого и придумали OpenGL и DirectX Чтоб по быстрому кидать в экран.
и не только кидать, но и рисовать быстрее Вернее - есть возможность выжать всё из шустрости видеокарты на борту машины
|
|
|
Записан
|
|
|
|
Aeth
Гость
|
|
« Ответ #15 : 08-12-2009 17:26 » |
|
Повторюсь: всё отлично, понятно, без DirectX не обойтись, но может кто посоветует реально толковый электронный документ, где более менее подробно охвачена тема по его использованию?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #16 : 08-12-2009 17:57 » |
|
поищи "DirectX 9 Graphics. The Definitive Guide to Direct3D" , Alan Thorn
|
|
|
Записан
|
|
|
|
Aeth
Гость
|
|
« Ответ #17 : 13-12-2009 10:39 » |
|
Благодарю.
|
|
|
Записан
|
|
|
|
|