![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
DirectX и Delphi. Мультимониторность. [D3, D5, D6, Win95/98]
KilkennyCat © (2002-04-21 03:31:00)Используя DelphiX, создать что-либо с Директиксом - не проблема.
Но проблема возникла при использовании двух мониторов с видеокартой Матрокс 450 (двухголовая). DelphiX позволяет создать список драйверов видеоустройств с помощью енумерате, но она видит только две разные видеокарты, а не двухголовость матрокса.
ЕнумератеЕкс видит двухголовость, но явно не описана в DelphiX. В заголовках Джеди все описано, но выдает какую-то белиберду, использовать которую в дальнейшем для переключения приложения с директиксом сложновато. Может, кто-нибудь подскажет, как грамотно создавать директикс на втором мониторе с фуллскрином?
KilkennyCat (2002-04-26 03:45:00) [1]Рассказываю :)
создаем типчик
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
Сергей Чурсин (2002-04-24 02:01:00) [2]Интересно... Раскажи вкратце (чтоб тебе не напрягаться :) )...
KilkennyCat (2002-04-22 12:37:00) [3]Оказывается, не сюда поместил вопрос. Прошу прощения, не заметил другого форума. С вопросом разобрался, если кого-то интересует эта особенность Директикса - спрашивайте.