Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Графика почти напрямую  (Прочитано 16462 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Aeth
Гость
« : 05-12-2009 13:26 » 

Добрый день.

Уважаемые умы программирования мира сего, не сочтите за труд подсказать, как
в  Delphi сотворить такое:

1. Опросить видеокарту (или систему?) с целью определения максимального разрешения монитора.
2. Переключить приложение в полноэкранный режим (переключиться
в найденный максимальный режим)
3. Получить селектор на видеопамять.
4. Нормально завершить приложение.

Если с пунктами 1, 2, 4 уже наступает ясность, то с 3йим просто беда!

С уважением.
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 05-12-2009 14:16 » 

Aeth, Ты в Windows не получиш прямого доступа к видеопамяти. Если используеш user mode.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 05-12-2009 19:05 » 

1. См. MSDN. Изменять что-либо в окружении из приложения - дурная идея.
2. См. свойства окна. F1 - есть такая клавиша: ставишь на что-нибудь в исходнике, жмешь F1 и получаешь доку по нему.
3. см. выше: нельзя.
4. Close() для главного окна, либо Application.Terminate().
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #3 : 06-12-2009 01:38 » 

а ить были времена, когда конструкции, типа l: word absolute C800 имели право на жисть Улыбаюсь
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline 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
Модератор

ro
Offline 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
Модератор

ro
Offline 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
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #13 : 07-12-2009 16:39 » 

Для этого и придумали OpenGL и DirectX Чтоб по быстрому кидать в экран.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #14 : 08-12-2009 04:06 » 

Для этого и придумали OpenGL и DirectX Чтоб по быстрому кидать в экран.
и не только кидать, но и рисовать быстрее Улыбаюсь Вернее - есть возможность выжать всё из шустрости видеокарты на борту машины
Записан

Aeth
Гость
« Ответ #15 : 08-12-2009 17:26 » 

Повторюсь: всё отлично, понятно, без DirectX не обойтись, но может кто посоветует реально толковый электронный документ, где более менее подробно охвачена тема по его использованию?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline 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 » new

Благодарю.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines