在delphi中如何修改显示器的分辩率与刷新频率?
劳烦各位大侠,小弟有一事请教,在delphi中如何修改显示器的分辩率与刷新频率?用什么样的API函数呢?最好能给出例程,先谢了!
问题点数:100、回复次数:11Top
1 楼boby(......)回复于 2002-03-15 14:16:07 得分 25
function Resolution(X,Y:word):boolean;
var
DevMode:TDeviceMode;
begin
Result:=EnumDisplaySettings(nil,0,DevMode);
if Result then
begin
DevMode.dmFields:=DM_PELSWIDTH Or DM_PELSHEIGHT;
DevMode.dmPelsWidth:=X;
DevMode.dmPelsHeight:=Y;
Result:=ChangeDisplaySettings(DevMode,0)=DISP_CHANGE_SUCCESSFUL;
end;
end;
Top
2 楼TechnoFantasy((VB MVP)www.applevb.com)回复于 2002-03-15 14:17:15 得分 25
procedure SetRes(XRes, YRes: DWord);
var
lpDevMode : TDeviceMode;
begin
EnumDisplaySettings(nil, 0, lpDevMode);
lpDevMode.dmFields:=DM_PELSWIDTH or DM_PELSHEIGHT;
lpDevMode.dmPelsWidth:=XRes;
lpDevMode.dmPelsHeight:=YRes;
ChangeDisplaySettings(lpDevMode, 0);
end;
Top
3 楼feng_zi(二度程序员)回复于 2002-03-15 14:17:48 得分 0
小弟要实现的是,先前的系统是在800*600下做的,开发工具为developer2000,现在在客户的17寸显示器都是1024*768了,显示非常难看,而要developer2000没有自己扩展的功能,如果整个系统重做的话,工作量非常之巨大,所以就想做一个调用程序,调用时将分辩率改为8000*600,退出后再改回。
如果大家有更好的方法,请给思路!Top
4 楼feng_zi(二度程序员)回复于 2002-03-15 14:19:31 得分 0
小弟要实现的是,先前的系统是在800*600下做的,开发工具为
developer2000,现在在客户的17寸显示器都是1024*768了,显示
非常难看,而要developer2000没有自己扩展的功能,如果整个系统
重做的话,工作量非常之巨大,所以就想做一个调用程序,调用时将
分辩率改为8000*600,退出后再改回。
如果大家有更好的方法,请给思路!Top
5 楼feng_zi(二度程序员)回复于 2002-03-15 14:26:15 得分 0
多谢boby(风之痕迹),TechnoFantasy(www.applevb.com)
分辩率是可以改变了,但改了之后整个显示面变得错位了,并且屏幕闪动,又与刷新频率有关,反正那样做,效果不是很好,你们有没有更好的方法呢?Top
6 楼jiaorg(jiaorg)回复于 2002-03-15 14:39:21 得分 25
Example 1
{...}
type
TForm1 = class(TForm)
Button1: TButton;
ListView1: TListView;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
{ 05/31/99 - added TListView.OnDblClick event }
procedure ListView1DblClick(Sender: TObject);
private
{ Private declarations }
{ 05/31/99 - moved here for4m TButton.OnClick
event as an array so we can use
the array to get the TDevMode for
the selected one from the TListView }
DevMode : array[0..20] of TDevMode;
public
{ Public declarations }
end;
{...}
procedure TForm1.FormCreate(Sender: TObject);
begin
{ set viewstyle to vsReport }
ListView1.ViewStyle := vsReport;
{ set rowselect to TRUE }
ListView1.RowSelect := TRUE;
{add our columns ans set their values }
ListView1.Columns.Add;
ListView1.Columns.Add;
ListView1.Columns[0].Caption := 'Width x Height';
ListView1.Columns[0].Width := 100;
ListView1.Columns[1].Caption := 'Colors';
ListView1.Columns[1].Width := 100;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
{ moved to be a private array so we can use
the array to get the TDevMode for the
selected one from the TListView }
{ DevMode : TDevMode; }
tmpStr1,
tmpStr2 : String;
tmpDC : HDC;
x,
Selection,
cxScreen,
cyScreen,
Resolution : Integer;
begin
{ get our color mode }
tmpDC := getDC(Handle);
try
cxScreen := GetSystemMetrics(SM_CXSCREEN);
cyScreen := GetSystemMetrics(SM_CYSCREEN);
Resolution := GetDeviceCaps(tmpDC, BITSPIXEL);
finally
ReleaseDC(Handle, tmpDC);
end;
ListView1.Items.Clear;
x := 0;
{ 05/31/99 - changed DevMode to an array to
hold all the TDevMode values to be
easily selected on a TListView
OnDblClick event }
{ enumerate all possible display settings }
while EnumDisplaySettings(nil,x,DevMode[x]) do
begin
{ screen width and height }
tmpStr1 := IntToStr(DevMode[x].dmPelsWidth)+
'x'+
IntToStr(DevMode[x].dmPelsHeight);
{ colors }
case DevMode[x].dmBitsPerPel of
4 : tmpStr2 := '16 Colors';
8 : tmpStr2 := '256 Colors';
16 : tmpStr2 := 'High Color (16 Bit)';
32 : tmpStr2 := 'True Color (32 Bit)';
end;
{ add resolution to out tlistbox }
with ListView1.Items.Add do
begin
Caption := tmpStr1;
SubItems.Add(tmpStr2);
end;
{ compare our settings to the one being added
and set a variable to be used to visually
set out display settings in our tlistview }
if ( cxScreen = DevMode[x].dmPelsWidth ) and
( cyScreen = DevMode[x].dmPelsHeight ) and
( Resolution = DevMode[x].dmBitsPerPel ) then
Selection := x;
{ inc to the next display setting in the array }
inc(x);
{ 05/31/99 - make sure we do not over
run our array }
if x = 20 then
Break;
end;
{ set our tlistview to select our current setting
according the the compare done within the above
loop }
ActiveControl := ListView1;
ListView1.Selected := ListView1.Items.Item[Selection];
end;
{ 05/31/99 }
procedure TForm1.ListView1DblClick(Sender: TObject);
var
tmpDevMode : TDevMode;
begin
{ get our selected TDevMode structure }
tmpDevMode := DevMode[ListView1.Items.IndexOf(ListView1.Selected)];
{ tell windows what seetings in the TDevMode structure to us, we
do this by setting the TDevMode.dmFields flag }
tmpDevMode.dmFields := DM_BITSPERPEL or
DM_PELSWIDTH or
DM_PELSHEIGHT or
DM_DISPLAYFLAGS or
DM_DISPLAYFREQUENCY;
{ use the CDS_TEST flag first to test that the selected display
setting will work properly, then actually set the new dusplay
settings }
if ChangeDisplaySettings(tmpDevMode,
CDS_TEST) = DISP_CHANGE_SUCCESSFUL then
ChangeDisplaySettings(tmpDevMode,
CDS_UPDATEREGISTRY);
end;
{...}
Top
7 楼Liujc(阿聪)回复于 2002-03-15 14:45:21 得分 25
function ChangeDisplay(width,height:word) :BOOL ;
var
lpDevMode :TDEVICEMODe ;
begin
result := EnumDisplaySettings(Nil ,0 ,lpDEVMode) ;
if result then
begin
lpDevmode.dmFields := DM_PELSWIDTH or DM_PELSHEIGHT ;
lpdevmode.dmPelsWidth := width ;
lpdevmode.dmPelsHeight := height ;
result := ChangeDisplaySettings(lpdevmode ,CDS_UPDATEREGISTRY) = DISP_CHANGE_SUCCESSFUL ;
end ;
end ;
Top
8 楼feng_zi(二度程序员)回复于 2002-03-15 14:55:02 得分 0
多谢大家的帮助,分辩率的改变已经可以实现,但是在改变分辩率的过渡有一阵黑屏,这同样也产生了不良的效果,请问有没有其它方法实现这样的分辩率改变的效果呢?
或者有更好的方法,使程序的能满屏显示呢?劳驾各位了!Top
9 楼feng_zi(二度程序员)回复于 2002-03-15 14:56:57 得分 0
多谢大家的帮助,分辩率的改变已经可以实现,但是在改变分辩率的过渡有一阵黑屏,
这同样也产生了不良的效果,请问有没有其它方法实现这样的分辩率改变的效果呢?
或者有更好的方法,使程序的能满屏显示呢?劳驾各位了!
Top
10 楼feng_zi(二度程序员)回复于 2002-03-15 15:21:40 得分 0
如何能使在修改分辩率时,不产生黑屏呢,绝望大家再帮小弟一下,很急!Top
11 楼redbirdli(火鸟)回复于 2002-03-18 16:39:21 得分 0
gzzTop




