Author: Jonas Bilinkevicius
I can't find a way to enumerate or test display frequencies. When I use
ChangeDisplaySettings to test for a given mode it returns DISP_CHANGE_SUCCESSFUL,
no matter what I put in for dmDisplayFrequency. Should I just attempt to set a good
median freq such as 75Hz and forget about it? Any other ideas?
Answer:
1 type
2 PdmArray = ^TDmArray;
3 TDmArray = array[0..0] of TDeviceMode;
4
5 TForm1 = class(TForm)
6 { ... }
7 private
8 lpDmArray: PDmArray;
9 NumModes: integer;
10 BitsPerPixel: DWord;
11 RefreshRate: DWord;
12 CurrentDisplayMode: integer;
13 SelectedDisplayMode: integer;
14 { ... }
15 public
16 end;
17
18 procedure TForm1.RetrieveDisplayModes;
19 var
20 I: Integer;
21 MoreModes: Bool;
22 dm: TDeviceMode;
23 begin
24 StringGridDisplayModes.ColCount := 5;
25 StringGridDisplayModes.RowCount := 2;
26 StringGridDisplayModes.Cells[0, 0] := 'Mode';
27 StringGridDisplayModes.Cells[1, 0] := 'Resulution';
28 StringGridDisplayModes.Cells[2, 0] := 'Bits per Pixel (Colors)';
29 StringGridDisplayModes.Cells[3, 0] := 'DisplayFrequency';
30 StringGridDisplayModes.Cells[4, 0] := 'DeviceName';
31 for I := 0 to StringGridDisplayModes.ColCount do
32 StringGridDisplayModes.Cells[I, 1] := '';
33 MoreModes := TRUE;
34 I := 0;
35 while MoreModes do
36 begin
37 MoreModes := EnumDisplaySettings(nil, I, dm);
38 StringGridDisplayModes.Cells[0, StringGridDisplayModes.RowCount - 1] :=
39 IntToStr(I);
40 StringGridDisplayModes.Cells[1, StringGridDisplayModes.RowCount - 1] :=
41 IntToStr(dm.dmPelsWidth) + ' * ' + IntToStr(dm.dmPelsHeight);
42 StringGridDisplayModes.Cells[2, StringGridDisplayModes.RowCount - 1] :=
43 IntToStr(dm.dmBitsPerPel);
44 StringGridDisplayModes.Cells[3, StringGridDisplayModes.RowCount - 1] :=
45 IntToStr(dm.dmDisplayFrequency);
46 StringGridDisplayModes.Cells[4, StringGridDisplayModes.RowCount - 1] :=
47 dm.dmDeviceName;
48 if (dm.dmPelsWidth = Screen.Width) and (dm.dmPelsHeight = Screen.Height) and
49 (dm.dmBitsPerPel = BitsPerPixel) and (dm.dmDisplayFrequency = RefreshRate)
50 then
51 CurrentDisplayMode := I;
52 StringGridDisplayModes.RowCount := StringGridDisplayModes.RowCount + 1;
53 Inc(i);
54 end;
55 StringGridDisplayModes.RowCount := StringGridDisplayModes.RowCount - 1;
56 NumModes := I;
57 GetMem(lpDmArray, sizeof(TDeviceMode) * NumModes);
58 FillChar(lpDmArray^, sizeof(TDeviceMode) * NumModes, #0);
59
60 {$IFOPT R+}
61 {$DEFINE CKRANGE}
62 {$R-}
63 {$ENDIF}
64
65 for I := 0 to (NumModes - 1) do
66 EnumDisplaySettings(nil, I, lpDmArray[i]);
67
68 {$IFDEF CKRANGE}
69 {$UNDEF CKRANGE}
70 {$R+}
71 {$ENDIF}
72
73 end;
74
75 procedure TForm1.ButtonRetrieveDisplayModesClick(Sender: TObject);
76 begin
77 RetrieveDisplayModes;
78 end;
79
80 procedure TForm1.FormDestroy(Sender: TObject);
81 begin
82 try
83 FreeMem(lpDmArray, sizeof(TDeviceMode) * NumModes);
84 except
85 end;
86 end;
87
88 procedure TForm1.FormCreate(Sender: TObject);
89 var
90 DC: hDC;
91 begin
92 DC := GetDC(0);
93 BitsPerPixel := GetDeviceCaps(DC, BITSPIXEL);
94 RefreshRate := GetDeviceCaps(DC, VREFRESH);
95 ReleaseDC(0, DC);
96 StatusBar.Panels[2].Text := 'Resolution: ' + IntToStr(Screen.Width) + ' * ' +
97 IntToStr(Screen.Height)
98 + ', ColorDept: ' + IntToStr(BitsPerPixel) + ', RefreshRate: '
99 + IntToStr(RefreshRate);
100 ButtonRetrieveDisplayModesClick(Sender);
101 end;
102
103 procedure Tform1.SetDisplayMode(Mode: integer);
104 var
105 ReturnVal: LongInt;
106 begin
107
108 {$IFOPT R+}
109 {$DEFINE CKRANGE}
110 {$R-}
111 {$ENDIF}
112
113 ReturnVal := ChangeDisplaySettings(lpDmArray[Mode], CDS_UPDATEREGISTRY);
114
115 {$IFDEF CKRANGE}
116 {$UNDEF CKRANGE}
117 {$R+}
118 {$ENDIF}
119
120 if ReturnVal <> DISP_CHANGE_SUCCESSFUL then
121 case ReturnVal of
122 DISP_CHANGE_SUCCESSFUL: ShowMessage('DISP_CHANGE_SUCCESSFUL');
123 DISP_CHANGE_RESTART: ShowMessage('DISP_CHANGE_RESTART');
124 DISP_CHANGE_BADFLAGS: ShowMessage('DISP_CHANGE_BADFLAGS');
125 DISP_CHANGE_FAILED: ShowMessage('DISP_CHANGE_FAILED');
126 DISP_CHANGE_BADMODE: ShowMessage('DISP_CHANGE_BADMODE');
127 DISP_CHANGE_NOTUPDATED: ShowMessage('DISP_CHANGE_NOTUPDATED');
128 end;
129 end;
|