Delphi - Monitorkártya információk és lehetséges felbontási módok lekérdezése

DirectX 2. rész

forráskód letöltése

Ha DirectX-et használunk alkalmazásunk készítése során, akkor nem árt, ha tisztában vagyunk azzal, hogy az adott gépben lévő monitorkártya milyen paraméterekkel rendelkezik és milyen felbontású és színmélységű kép előállításra képes és ehhez milyen képfrissítési frekvencia társulhat. A szükséges információ lekérdezéséhez – hasonlóan az első cikkhez – most is kapcsolatot kell teremtenie alkalmazásunknak a DirectX IDirect3D8 interfészével, melyhez most is a Direct3DCreate8 függvényt használjuk fel.
procedure TForm1.FormCreate(Sender: TObject);
var
  dm: TD3DDisplayMode;
  pIdentifier: TD3DAdapter_Identifier8;
  i, c: integer;
begin
  FD3D:=nil;
  FD3D:=Direct3DCreate8(D3D_SDK_VERSION);
if Assigned(FD3D) then begin
Ha a kapcsolat sikeresen létrejött, akkor az IDirect3D8 interfész GetAdapterModeCount függvény használatával lekérdezzük, hogy az elsődleges monitorkártyához hány lehetséges felbontási mód tartozik. Paraméterként a monitorkártya sorszámát kell megadnunk, vagy a D3DADAPTER_DEFAULT konstans használatával hivatkozhatunk az elsődlegesre.
      c:=FD3D.GetAdapterModeCount(D3DADAPTER_DEFAULT);
A GetAdapterCount függvénnyel pedig azt határozhatjuk meg, hogy hány monitorkártya található a gépben.
      Label1.Caption:='GetAdapterCount: '+IntToStr(FD3D.GetAdapterCount);
      Label2.Caption:='GetAdapterModeCount: '+IntToStr(c);
Ezt követően kérjük le az elsődleges monitorkártya azonosító információit. Ehhez a GetAdapterIdentifier függvényt kell használnunk. Első paraméterében a monitorkártya sorszámát adhatjuk meg, a másodikban általában nulla érték használatos, vagy a D3DENUM_NO_WHQL_LEVEL konstans. Utóbbi esetben nem kapunk információt a WHQLLevel-ről. Harmadik paraméterben egy TD3DAdapter_Identifier8 struktúrát kell megadnunk, melyben a lekérdezett adatokat kapjuk vissza. Ha a lekérdezés sikeres volt, akkor a függvény visszatérési értéke D3D_OK lesz.
      if FD3D.GetAdapterIdentifier(0, 0, pIdentifier)=D3D_OK then begin
        ListBox2.Items.Add('Description: '+pIdentifier.Description);
        ListBox2.Items.Add('Driver: '+pIdentifier.Driver);
        ListBox2.Items.Add('DriverVersionLowPart: '+IntToStr(pIdentifier.DriverVersionLowPart));
        ListBox2.Items.Add('DriverVersionHighPart: '+IntToStr(pIdentifier.DriverVersionHighPart));
        ListBox2.Items.Add('VendorId: '+IntToStr(pIdentifier.VendorId));
        ListBox2.Items.Add('DeviceId: '+IntToStr(pIdentifier.DeviceId));
        ListBox2.Items.Add('SubSysId: '+IntToStr(pIdentifier.SubSysId));
        ListBox2.Items.Add('Revision: '+IntToStr(pIdentifier.Revision));
        ListBox2.Items.Add('DeviceIdentifier: '+GUIDToString(pIdentifier.DeviceIdentifier));
        ListBox2.Items.Add('WHQLLevel: '+IntToStr(pIdentifier.WHQLLevel));
      end;
Következő részfeladatunk lekérdezni az összes lehetséges felbontási és színmélységi módot, melybe átkapcsolhatjuk a monitorkártyát. Ezt egy ciklus segítségével tehetjük meg, mely nullától az összes lehetséges mód számáig megy. Ez utóbbit már lekérdeztük a GetAdapterModeCount függvénnyel.
      for i:=0 to c-1 do begin
Egy-egy mód tulajdonságainak meghatározásához az EnumAdapterModes függvényt hívjuk segítségül. Itt első paraméterként a monitorkártya sorszámát, másodikként a kérdéses mód sorszámát kell megadni. Harmadik paraméterként egy TD3DDisplayMode struktúrát vár a függvény, melybe a lekérdezett adatokat kapjuk vissza. Ha a függvény visszatérési értéke D3D_OK, akkor a lekérdezés sikeres volt.
        if FD3D.EnumAdapterModes(D3DADAPTER_DEFAULT, i, dm)=D3D_OK then begin
A TD3DDisplayMode struktúrával cikksorozatunk első részében már találkoztunk. Ebből tudhatjuk meg a képernyő lehetséges szélességét, magasságát pixelben, a kép frissítési frekvenciát Hz-ben, valamint a színmélységre vonatkozó értéket.
          ListBox1.Items.Add(IntToStr(dm.Width)+' x '+IntToStr(dm.Height)+#9+IntToStr(dm
             .RefreshRate)+#9+IntToStr(dm.Format));
…


DirectX cikksorozat