Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.09.02;
Скачать: CL | DM;

Вниз

DirectX и Delphi. Мультимониторность.   Найти похожие ветки 

 
KilkennyCat ©   (2002-04-21 03:31) [0]

Используя DelphiX, создать что-либо с Директиксом - не проблема.
Но проблема возникла при использовании двух мониторов с видеокартой Матрокс 450 (двухголовая). DelphiX позволяет создать список драйверов видеоустройств с помощью енумерате, но она видит только две разные видеокарты, а не двухголовость матрокса.
ЕнумератеЕкс видит двухголовость, но явно не описана в DelphiX. В заголовках Джеди все описано, но выдает какую-то белиберду, использовать которую в дальнейшем для переключения приложения с директиксом сложновато. Может, кто-нибудь подскажет, как грамотно создавать директикс на втором мониторе с фуллскрином?


 
KilkennyCat ©   (2002-04-22 12:37) [1]

Оказывается, не сюда поместил вопрос. Прошу прощения, не заметил другого форума. С вопросом разобрался, если кого-то интересует эта особенность Директикса - спрашивайте.


 
Сергей Чурсин   (2002-04-24 02:01) [2]

Интересно... Раскажи вкратце (чтоб тебе не напрягаться :) )...


 
KilkennyCat ©   (2002-04-26 03:45) [3]

Рассказываю :)

создаем типчик

type
TDirectDrawEnumEx = record
GUID: TGUID;
DriverDescription: String[100];
DriverName: String[100];
end;
PDirectDrawEnumEX = ^TDirectDrawEnumEX;

объявляем:

private
listadapter : Tlist;
lladap : PDirectDrawEnumEX;
AD, BD : IDirectDraw7;

исчо одну функцию:

implementation

{$R *.dfm}

function EnumDevices(lpGUID: PGUID; lpDriverDescription: LPSTR; lpDriverName: LPSTR; lpContext: Pointer; Monitor: HMonitor):BOOL; stdcall;
var
p: PDirectDrawEnumEx;
begin
New( p );
if lpGUID = nil then
ZeroMemory( @(p.GUID), sizeof(p.GUID) )
else p.GUID := lpGUID^;
p.DriverDescription := lpDriverDescription;
p.DriverName := lpDriverName;
TList(lpContext).Add( p );
Result := BOOL(DDENUMRET_OK);
end;

теперь можно получить абсолютно все видеодрайверы:

listadapter := Tlist.Create;
DirectDrawEnumerateEx(EnumDevices, listadapter, $00000001 or $00000002 or $00000004);

прошу прощение за несимвольные флаги - их всего три и нужны все.

Я знаю, что у меня их три (первые два - дублируют друг друга), обращаюсь к третьему:

lladap := listadapter[2];

и создаем объекты на два монитора:

DirectDrawCreateEx (nil, AD, IDirectDraw7, nil);
DirectDrawCreateEx (@lladap.GUID, BD, IDirectDraw7, nil);
AD.SetCooperativeLevel(Handle, DDSCL_SETFOCUSWINDOW);
AD.SetCooperativeLevel(Handle, DDSCL_ALLOWREBOOT or DDSCL_FULLSCREEN or DDSCL_EXCLUSIVE);
ad.SetDisplayMode(800,600,16,0,0);
BD.SetCooperativeLevel(Handle, DDSCL_SETFOCUSWINDOW or DDSCL_CREATEDEVICEWINDOW or DDSCL_ALLOWREBOOT or DDSCL_EXCLUSIVE or DDSCL_FULLSCREEN);
Bd.SetDisplayMode(640,480,8,0,0);

поверхности создаются стандартно. Разобраться помог Microsoft SDK DirectX 7






Страницы: 1 вся ветка

Текущий архив: 2002.09.02;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.017 c
3-3242
Не зарегестрированный чайник
2002-08-09 19:01
2002.09.02
Здрасти , и опять выборка


1-3413
ev
2002-08-21 21:30
2002.09.02
разделители в ToolBar (как в ворде)


1-3513
maxim2
2002-08-20 12:34
2002.09.02
Как отловить нажатие правой кнопки мыши


4-3663
SeB
2002-06-20 10:59
2002.09.02
Блокировка машины в Windows и неубиваемая программа


1-3458
Дельфятник
2002-08-20 11:28
2002.09.02
Рисование на TRadioGroup через его Handle.