Считывание текущих параметров экрана

Работа с 2D и 3D графикой, видео, звуком.

Модератор: Mikle

leaveIIIusion
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 30.12.2005 (Пт) 19:01
Откуда: Днепропетровск

Считывание текущих параметров экрана

Сообщение leaveIIIusion » 01.01.2006 (Вс) 14:37

Здравствуйте, уважаемые разработчики!
Дико извиняюсь за ламерский вопрос.
Мне нужно средствами DirectX считать текущее разрешение и частоту обновление экрана. На Basic .NET / С#.
В MSDN написано, что нужно через DisplayModeEnumerator. Не могу понять как с ним работать.
Пробовал так:

Код: Выделить всё
Dim a As Direct3D.AdapterInformation
presentParam.BackBufferHeight = a.CurrentDisplayMode.Height


Но переменную a нельзя через New инициализировать. Блок не работает. Как правильно сделать.
Заранее благодарен за ответ.

З.Ы. Этот вопрос один к одному я задал на GameDev.ru. Никто не смог ответить.
Basic .NET ruless world!

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 02.01.2006 (Пн) 1:11

Вот так

Dim mode As D3DDISPLAYMODE
d3d.GetAdapterDisplayMode D3DADAPTER_DEFAULT, mode.

И всё!
#define ROFL 0xDDDD

leaveIIIusion
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 30.12.2005 (Пт) 19:01
Откуда: Днепропетровск

Сообщение leaveIIIusion » 02.01.2006 (Пн) 12:23

DirectXManiac писал(а):Вот так

Dim mode As D3DDISPLAYMODE
d3d.GetAdapterDisplayMode D3DADAPTER_DEFAULT, mode.

И всё!

Примерно тоже мне сказали на GameDev. Не могу понять в чем дело :( .
Во-первых, у меня нет D3DDISPLAYMODE. То есть оно есть, но почему-то с нижним подчеркиванием в начале: _D3DDISPLAYMODE. В раскрывающемся списке не показывается вообще. Зато нашел Direct3D.DisplayMode. Но после
Код: Выделить всё
Dim mode As New Direct3D.DisplayMode

и высота, и ширина, и частота экрана нулевые :? .

Во-вторых, у меня в принципе нет GetAdapterDisplayMode. Нигде. Может у нас версии разные :roll: ?
И вообще, что-то я не понял, параметры монитора нужно указывать в Direct3D.PresentParameters до создание Direct3D.Device. Как можно их считывать с D3D (смотри цитату), если у меня D3D пока что равно nothing (не создал еще)?

Visual Studio 7.1 (2003)
в программе использую:
Microsoft.DirectX 1.0.1901.0
Microsoft.DirectX.Direct3D 1.0.1901.0
Microsoft.DirectX.Direct3DX 1.0.1901.0
Basic .NET ruless world!

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 03.01.2006 (Вт) 1:23

Ты ввобще на Visual Basic пишешь?
#define ROFL 0xDDDD

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 03.01.2006 (Вт) 3:44

Делаешь:

Set D3D = DX.Direct3DCreate()

D3D.GetAdapterDisplayMode...
Ты это Microsoft.DirectX 1.0.1901.0
Microsoft.DirectX.Direct3D 1.0.1901.0
Microsoft.DirectX.Direct3DX 1.0.1901.ЭТО ЧТО?Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!??? :shock: :shock: :shock: :shock: :shock: :shock: :shock: :shock: :shock:
Это чё первый DirectX что-ли???
Чё то не совсем понимаю что ты хочешь.
Тебе надо DirectX 8 COMовский!
Подключи его и используй!!!
#define ROFL 0xDDDD

leaveIIIusion
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 30.12.2005 (Пт) 19:01
Откуда: Днепропетровск

Сообщение leaveIIIusion » 05.01.2006 (Чт) 0:24

Ты ввобще на Visual Basic пишешь?

Смотри выше. Я же написал. Basic .NET
DirectXManiac писал(а):Делаешь:

Set D3D = DX.Direct3DCreate()

D3D.GetAdapterDisplayMode...
Ты это Microsoft.DirectX 1.0.1901.0
Microsoft.DirectX.Direct3D 1.0.1901.0
Microsoft.DirectX.Direct3DX 1.0.1901.ЭТО ЧТО?Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!??? :shock: :shock: :shock: :shock: :shock: :shock: :shock: :shock: :shock:
Это чё первый DirectX что-ли???
Чё то не совсем понимаю что ты хочешь.
Тебе надо DirectX 8 COMовский!
Подключи его и используй!!!


:lol: :lol: :lol: :lol: :lol: На самом деле это 9-й директ. Просто версия такая. Соответствует версии SDK, которую установил. Комовский 8-й директ мне не надо. Юзал уже. У меня книга на 9-м. Да и написан 9-й для .NET.
Блин, ну неужели все еще на 8-ом пишут? Я понимаю, что на восьмом можно все то же, что и на 9-м сделать, но... Уже 10-й вышел (см. демонстрацию в SDK за декабрь 2005 на Windows Vista Beta).

Ну неужели мне так никто и не поможет :cry: :cry: :cry: ? Я что так и буду в окошке проги делать. И после изменения размера формы заново буфферы вершин и индексов заполнять? Видать это моя судьба.
Basic .NET ruless world!

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 05.01.2006 (Чт) 1:26

Чесно говоря я не знаюпро 9ый! Я на восьмом пишу.
#define ROFL 0xDDDD

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 05.01.2006 (Чт) 11:37

leaveIIIusion
Я, лично, пишу на восьмом потому, что не хочу пока перелазить на .NET.
Вот если бы кто-то TLB сделал дла DX9... :roll:

leaveIIIusion
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 30.12.2005 (Пт) 19:01
Откуда: Днепропетровск

Сообщение leaveIIIusion » 05.01.2006 (Чт) 19:36

На девятом легче писать. Меньше всяких объявлений нужно, редактор помогает лучше, да и проще ...ммм...само понимание того что пишешь. ИМХО. :roll:
Я тоже раньше на 8-м пытался карлякать. После моря попыток разобрать примитивные программы, нескольких ламерских вопросов на форуме (мой старый ник Бутч), 2-х сломаных клавиатур, одной мышки и почти проваленной сессии :lol: , забил на это дело.
Долго терпеть не смог. Месяца два назад опять сел извращатся. Геометрию слегка подучил, арифметику :) . Книг так и не смог найти на Басике. Пришлось купить по С++ и переводить. Кстати, добрый знакомый grig_s (если встретите где-то в инете - обязательно поблагодарите :)) отсканерил книги на С++ для общего пользования. Если кому нужно - пишите на мыло.
1) Горнаков С. Г. - DirectX 9. Уроки программирования на С++ (2.6 Mb)
2) Джим Адамс - DirectX. Продвинутая Анимация.
Формат DjVu - поэтому такой размер маленький. Плугин для открытия ищите на Яндексе. Могу скинуть прилагаемый код программ.
Вторая книга пока не подготовлена. Будет скоро.

У кого есть хоть какие-то книги на Басике (любой версии) про DirectX (любой версии) - пожалуйста, не пожалейте времени и трафика - скиньте мне на mail. Буду беcпредельно благожарен :P . Вот адрес:
[url]leaveIIIusion@mail.ru[/url]

Mikle
Расшифруй TLB.
Basic .NET ruless world!

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 05.01.2006 (Чт) 19:41

leaveIIIusion
TLB - Type Library, библиотека типов.
Я на DX8 начинал тоже с СИшным SDK, не сильно мешало.

leaveIIIusion
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 30.12.2005 (Пт) 19:01
Откуда: Днепропетровск

Сообщение leaveIIIusion » 05.01.2006 (Чт) 20:59

Mikle писал(а):TLB - Type Library, библиотека типов.
Я на DX8 начинал тоже с СИшным SDK, не сильно мешало.


Конечно на 8-м не сильно мешает , а вот в 9-м команды различны (плюс увеличенное различие языков). Вообщем для начинающего с ходу переделывать на Basic .NET сложновато. Если бы книги на С# были, то тогда бы ничего не не мешало :lol:.

Murzik
Дико благодарен :D !!!
Basic .NET ruless world!

leaveIIIusion
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 30.12.2005 (Пт) 19:01
Откуда: Днепропетровск

Сообщение leaveIIIusion » 05.01.2006 (Чт) 23:35

Мдаа... Видно кто-то свыше пытается помешать мне полноэкранный режим оформить :cry: . Уже команду написали, уже переделал, запускаю... Видно, что устройство создается. Но переходит не в полноценный экранный режим, а в оконный (с кнопками закрытия, развертывания и округлениями по углам), но на весь экран(включая панель с кнопкой "пуск") и нехочет ничего рисовать. Просто окно прозрачное что-то вроде скриншота получается :) . Ну что за невезенье!
Ну думаю ладно - запущу отладчик. Вначале все нормально, но на строке создания устройства всё вообще берет и повисает. Только Winamp играет :) . Благо Ctrl+Alt+Del спас. Еще Task Manager'ом немного на окне моей программки "порисовал" :lol: .
Выкладываю код:
Код: Выделить всё
        Dim presentParam As New Direct3D.PresentParameters
        presentParam.SwapEffect = Direct3D.SwapEffect.Discard
        presentParam.Windowed = False
        presentParam.BackBufferHeight = Manager.Adapters(0).CurrentDisplayMode.Height
        presentParam.BackBufferWidth = Manager.Adapters(0).CurrentDisplayMode.Width
        presentParam.FullScreenRefreshRateInHz = Manager.Adapters(0).CurrentDisplayMode.RefreshRate
        presentParam.BackBufferFormat = Manager.Adapters(0).CurrentDisplayMode.Format
        presentParam.AutoDepthStencilFormat = DepthFormat.D16
        presentParam.EnableAutoDepthStencil = True
        D3D = New Device(0, DeviceType.Hardware, Me, CreateFlags.SoftwareVertexProcessing, presentParam)


Вот с таким кодом у меня все работало:
Код: Выделить всё
        Dim presentParam As New PresentParameters
        presentParam.SwapEffect = SwapEffect.Discard
        presentParam.Windowed = True
        presentParam.EnableAutoDepthStencil = True
        presentParam.AutoDepthStencilFormat = DepthFormat.D16
        presentParam.EnableAutoDepthStencil = True
        D3D = New Device(0, DeviceType.Hardware, Me, CreateFlags.SoftwareVertexProcessing, presentParam)

Первый параметр - "Adapter as integer". Номер адаптера, на сколько я понял.
Подскажите, что может быть не так. Ну может не дописал что-то.
З.Ы. На нажатие кнопок программа реагирует.
Basic .NET ruless world!

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 06.01.2006 (Пт) 1:33

По моему мнение:
Если писать на DirectX 9, то только на С++. Я вот изучаю! А на Basice( на любом) лучше на 8ом.!
#define ROFL 0xDDDD

leaveIIIusion
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 30.12.2005 (Пт) 19:01
Откуда: Днепропетровск

Сообщение leaveIIIusion » 06.01.2006 (Пт) 9:14

DirectXManiac писал(а):По моему мнение:
Если писать на DirectX 9, то только на С++. Я вот изучаю! А на Basice( на любом) лучше на 8ом.!

Написание программ на Basic. NET имеет огромный плюс. Можно без каких-либо проблем импортировать код из С#. Пока на C# пишут не много людей, но в будущем... :roll: Кроме того большинство начальников просто бесит слово "Basic". Им, видете ли еще в детстве сказали, что С++ рулит :x . А вот если написать в резюме, мол С++ вроде как знаешь,... но пишешь на C#, сразу думают - продвинутый чел, идет ногой с будущем и т.д. А потом спокойно пишешь себе на VB .NET и переделываешь с помощью различных мастеров в С# :lol: .
Сам я еще не работаю-учусь пока, но те кто поступал на работу и тоже любили Basic, говорили, что так и делали.
Basic .NET ruless world!

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 07.01.2006 (Сб) 1:23

Я не знаю, мне роднее DirectX 8!
#define ROFL 0xDDDD

mdx
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 169
Зарегистрирован: 06.01.2006 (Пт) 18:13
Откуда: I'm from Russia!

Сообщение mdx » 07.01.2006 (Сб) 18:32

2 leaveIIIusion
1.
Код: Выделить всё
FormBorderStyle = None

2.
Код: Выделить всё
WindowState = Maximized
, либо
Код: Выделить всё
Me.Location = new Point(0, 0)
Me.Size = new Size(presentParam.BackbufferWidth, presentParam.BackbufferHeight)

3. Выложи весь код.

leaveIIIusion
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 30.12.2005 (Пт) 19:01
Откуда: Днепропетровск

Сообщение leaveIIIusion » 12.01.2006 (Чт) 19:39

Все получилось. Вначале сделал на весь экран в первом туториале в СДК. Заработало. Долго не мог понять, почему у меня не работало. В ходе двучасового минимизирования и сравнивания кода оказалось, что проблема была в том, что у меня в главном цикле вместо
Код: Выделить всё
        While frm.Created
            frm.Render()
            Application.DoEvents()
        End While

было
Код: Выделить всё
        While frm.Created
            Application.DoEvents()
            frm.Render()
        End While

Так и не понял, почему из-за этого не удавалось запустить полноэкранный режим :roll: . В оконном ведь все работало :roll: . Может кто просветит?
Basic .NET ruless world!

mdx
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 169
Зарегистрирован: 06.01.2006 (Пт) 18:13
Откуда: I'm from Russia!

Сообщение mdx » 13.01.2006 (Пт) 6:14

Лучше вообще делать так:

Код: Выделить всё
Private Shadows Sub OnPaint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
            Render()
            Invalidate()
End Sub

leaveIIIusion
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 30.12.2005 (Пт) 19:01
Откуда: Днепропетровск

Сообщение leaveIIIusion » 13.01.2006 (Пт) 21:26

mdx писал(а):Лучше вообще делать так:

Код: Выделить всё
Private Shadows Sub OnPaint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
            Render()
            Invalidate()
End Sub


Спасибо, попробую.
Basic .NET ruless world!


Вернуться в Мультимедиа

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 35

    TopList  
cron