关于修改系统分辨率的问题?(10分)

  • 主题发起人 主题发起人 武打
  • 开始时间 开始时间

武打

Unregistered / Unconfirmed
GUEST, unregistred user!
如何在程序一加载后就自动的把系统的分辨率修改到自己要的,还有大小字体的设置?
谢谢
 
提供给你一个例子:

Windows 95提供一个API函数EnumDisplaySettings()来获取所有显示模式的有关参数,包括颜色数、分辨率等等,下面的示例代码首先用该函数正确地填充TDevMode类型变量的各字段,然后指定新的数据,再调用ChangeDisplaySettings()函数来改变显示模式:

procedure NewScreenSize(W,H: Integer);
var
DevMode: TDevMode;
begin
if EnumDisplaySettings(nil,0,DevMode) then begin
with DevMode do begin
dmPelsWidth := W;
dmPelsHeight := H;
dmFields := DM_PELSWIDTH or DM_PELSHEIGHT;

end;
ChangeDisplaySettings(DevMode, 0);
end;
end;
///////////////////////////
Windows提供给我们两个API函数,可以动态调整显示器的分辨率,他们是EnumDisplaySettings() 和ChangeDisplaySettings(),下面这个例子就是了

function DynamicResolution(X, Y: word): BOOL;
var
lpDevMode: TDeviceMode;
begin
Result := EnumDisplaySettings(nil, 0, lpDevMode);
if Result then
begin
lpDevMode.dmFields := DM_PELSWIDTH Or DM_PELSHEIGHT;
lpDevMode.dmPelsWidth := X;
lpDevMode.dmPelsHeight := Y;
Result := ChangeDisplaySettings(lpDevMode, 0) = DISP_CHANGE_SUCCESSFUL;
end
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if DynamicResolution(640, 480) then

ShowMessage('Now is 640*480');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
if DynamicResolution(800, 600) then
ShowMessage('Now is 800*600');
end;
/////////////////////////////////////
{Delphi 引入的定义是错误的,必须手工引入}
function ChangeDisplaySettings(lpDevMode: PDeviceMode;
dwFlags: DWORD): Longint; stdcall;

var
Form1: TForm1;
DevModeArray: TList; // 显示模式信息结构列表

implementation

uses Math;
{$R *.DFM}

{引入函数}
function ChangeDisplaySettings; external user32 name 'ChangeDisplaySettingsA';

procedure TForm1.FormCreate(Sender: TObject);
var
DevModeCount: Integer; // tracks the number of display modes
DevModeInfo: ^TDevMode; // a pointer to display mode information
begin
DevModeArray := TList.Create;

DevModeCount := 0;

GetMem(DevModeInfo, SizeOf(TDevMode));

{枚举显示模式}
while EnumDisplaySettings(NIL, DevModeCount, DevModeInfo^) do
begin
DevModeArray.Add(DevModeInfo);

Inc(DevModeCount);

ListBox1.Items.Add(IntToStr(DevModeInfo^.dmPelsWidth)+'x'+
IntToStr(DevModeInfo^.dmPelsHeight)+', '+
IntToStr(Trunc(IntPower(2, DevModeInfo^.dmBitsPerPel)))+
' colors');

GetMem(DevModeInfo, SizeOf(TDevMode));
end;

FreeMem(DevModeInfo, SizeOf(TDevMode));

ListBox1.ItemIndex := 0;
end;

procedure TForm1.FormDestroy(Sender: TObject);
var
iCount: Integer;
begin
for iCount := 0 to DevModeArray.Count-1 do
FreeMem(DevModeArray.Items[iCount], SizeOf(TDevMode));
DevModeArray.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
ModeChange: Longint; //表明是否需要重起
begin
{change the display mode}
ModeChange:=ChangeDisplaySettings(DevModeArray[ListBox1.ItemIndex],
CDS_UPDATEREGISTRY);

{可否动态改变分辨率}
if ModeChange=DISP_CHANGE_SUCCESSFUL then
ShowMessage('动态改变成功');
if ModeChange=DISP_CHANGE_RESTART then
ShowMessage('需要重起');
end;
 
用Delphi编写DLL实现动态改变分辨率
西安海星系统集成中心
田俊国
---- 读了贵刊发表的《在VB中调用API函数动态改变及恢复屏幕设置》一文,觉得非常实用。的确,因显示器的分辩率的不一致而影响软件界面及人机正常交互的情形太多了。通常,我们的应用可能用VB、Delphi、PB等不同语言实现的,如果在各种语言中都调用API来实现动态的变屏幕设置的话,先不管调用能否成功,光一个DEVMODE结构在不同语言的定义就需要半天。能不能自己做一个DLL,装封几个简单的动态改变屏幕分辨率的函数,以达到不同语言均可调用的目的呢?作者进行了一番探索。Delphi语言封装大部分Windows API函数,只要在uses子句后加上 Windows,即可直接调用许多Windows API函数。因此笔者选用Delphi语言。

---- 一、 创建一个DLL

---- 关于在Delphi中如何创建DLL,已有不少文章介绍过了,读者也可以在Delphi5.0的帮助中查找(有详细例子),在此不再赘述。Setscn.dll中装封了三个函数:

---- setdisplaymode函数实现动态设置屏幕分辩率,参数pwidth、pheight为欲设置分辩率的屏宽和屏高,返回值为longint型,为0表示成功。

---- getscreenwidth()函数的功能是取得当前屏幕的屏宽,返回值为longint型。

---- getscreenwidth()函数的功能是取得当前屏幕的屏高,返回值为longint型。

---- 程序源代码如下:

library setscn;
uses Windows;
var NewDevMode: TDEVMODE;
function setdisplaymode(pwidth,pheight:integer):
longint;stdcall;export;
begin
With NewDevMode do
begin
dmSize := 122;
dmFields := DM_PELSWIDTH Or DM_PELSHEIGHT ;
dmPelsWidth := pwidth ;
dmPelsHeight := pheight ;
end;
result:=ChangeDisplaySettings(NewDevMode,0);
end;
Function getscreenwidth():longint;stdcall;export;
begin
result:=GetDeviceCaps(hinstance, HORZRES);
end;
function getscreenheight():longint;stdcall;export;
begin
result:=GetDeviceCaps(hinstance, VERTSIZE);
end;
exports
setdisplaymode index 1,
getscreenwidth index 2,
getscreenheight index 3;
begin
end.
---- 编译以上代码,生成一个名为setscn.dll的动态连接库,将其拷贝到windows的system目录下,便大功告成。
---- 二、 为setscn创建引入程序单元

---- 为了在Delphi语言中成功调用上述函数,我们需要编写以下引入程序单元。

{Import unit for setscn.Dll}
unit scnimport;
interface
function setdisplaymode(pwidth,pheight:integer):longint;
function getscreenwidth():longint;
function getscreenheight():longint;
implementation
function setdisplaymode(pwidth,pheight:integer):longint;
external 'setscn' index 1;
function getscreenwidth():longint;external 'setscn' index 2;
function getscreenheight():longint;external 'setscn' index 3;
end.
---- 三、 不同语言中的声明及调用:
---- 1、 VB中声明及调用:

---- VB中声明:

Private Declare Function setdisplaymode Lib
"setscn.dll" (ByVal pwidth As Integer, ByVal
pheight As Integer) As Long
Private Declare Function getscreenwidth Lib
"setscn.dll" () As Long
Private Declare Function getscreenheight Lib
"setscn.dll" () As Long
Dim sh, sw As Long
---- 调用示例:点击Command1将屏幕分辩率设为640*480,点击Command2恢复原来设置。
Private Sub Command1_Click()
sw = getscreenwidth()
sh = getscreenheight()
setdisplaymode 640, 480
End Sub
Private Sub Command2_Click()
setdisplaymode sw, sh
End Sub
---- 2、PB中声明及调用:
---- PB中声明:

Public Function long setdisplaymode(long pwidth,
long pheight)Library " setscn.dll"
Public Function long getscreenwidth()Library
" setscn.dll"
Public Function long getscreenheight()Library
" setscn.dll"
---- 调用示例:点击cb_1将屏幕分辩率设为640*480,点击cb_2恢复原来设置。如下:
//clicked for cb_1 return long
//sw、sh是long型的全程变量
sw=getscreenwidth()
sh=getscreenheight()
setdisplaymode(640,480)
//clicked for cb_2 return long
setdisplaymode(sw,sh)
---- 3、Delphi中的声名及调用
---- 因为我们为setscn创建引入程序单元scnimport.pas,所以只要在uses子句后添加上scnimport,即可直接调用(源代码略)。

---- 四、 结语:

---- 软件编程以进入组件年代。组件技术的飞速发展不但提高了代码的重用率,而且对软件的可靠性大有益处。一个真正的Win32程序员不能只局限于某一种语言,如果能利用某一语言之长,做一些组件或动态连接库,以弥补其它语言之短,编程过程中就如虎添翼、左右逢源,编一些高水平的程序也非难事。以上代码在windows98 环境下,分别用Delphi5.0、VB6.0、PB6.5下调试通过,效果很好。
 
多人接受答案了。
 
liuworker, ty_unix:
很感谢你们精彩的回答,可是我没有分了,不好意思,
希望以后可以多多的交流,多多帮助我!!!
 

Similar threads

后退
顶部