function ChangeDisplaySettingsW(var lpDevMode: TDeviceModeW; dwFlags: DWORD): Longint; stdcall; external 'user32.dll' name 'ChangeDisplaySettingsW' index 31;
解决方案 »
- 字符串操作时,函数insert(s1,s2,3)和关键字insert重复了?????急急急
- 求TreeView和Timer的全部属性与方法
- 难:请问如何不用Delphi的IDE编译Pascal程序?
- listbox的字体大小问题
- 用什么函数来实现取字段的前几个值。
- 急急急!求教!
- 非常简单的输入框问题
- 高分买号(请斑竹手下留情,我和这朋友联系的号被黑了,)
- delphi 连接 oracle,刷新databriage时,界面会停顿一下,如何解
- 在Com服务器中要导出对象,该如何做呢?
- 我想要csdn for delphi的最新或者所有的数据(要不delphibbs也行),哪里有啊?
- 键盘码的问题.........50+50分
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;上面的代码,在2000下执行,刷新频率为最低,所以必改刷新频率,才够。。//获得当前系统显示刷新频率
function GetDispSet():integer;
var
DeviceMode: TDeviceMode;
begin
result:=0;
EnumDisplaySettings(nil, Cardinal(-1), DeviceMode);
result:=DeviceMode.dmDisplayFrequency;
end;//改变系统显示刷新频率
function ChangeDispSet(iFrequency:integer):integer;
var
DeviceMode:TDeviceMode;
begin
result:=0;
EnumDisplaySettings(nil,Cardinal(-1), DeviceMode);
DeviceMode.dmDisplayFrequency:=Cardinal(iFrequency);
result:=ChangeDisplaySettings(DeviceMode,CDS_UPDATEREGISTRY);
end;
我的方法根据高手的指点定义两个全局变量。SCREENX,SCREENY:INTEGER;
procedure Tmainwinform.FormCreate(Sender: TObject);
var
sx, sy: Integer;
DevMode: TDeviceMode;
begin
sx := GetSystemMetrics(SM_CXSCREEN); //分辨率宽
sy := GetSystemMetrics(SM_CYSCREEN); //分辨率高
//用于在程序结束时把分辨率 改回原始状态
screenx := sx; //分辨率宽
screeny := sy; //分辨率高
if (sx <> 1024) and (sy <> 768) then
begin
DevMode.dmFields := DM_PELSWIDTH or DM_PELSHEIGHT;
DevMode.dmPelsWidth := 1024;
DevMode.dmPelsHeight := 768;
ChangeDisplaySettings(DevMode,0); //设置新的显示参数
end;
程序关闭时把分辨率修改为原来状态:
procedure Tmainwinform.FormClose(Sender: TObject;
var Action: TCloseAction);
var
sx, sy: Integer;
DevMode: TDeviceMode;
begin
sx := GetSystemMetrics(SM_CXSCREEN); //分辨率宽
sy := GetSystemMetrics(SM_CYSCREEN); //分辨率高
if (sx <> screenx) and (sy <> screeny) then
begin
DevMode.dmFields := DM_PELSWIDTH or DM_PELSHEIGHT;
DevMode.dmPelsWidth := screenx;
DevMode.dmPelsHeight := screeny;
ChangeDisplaySettings(DevMode,0); //设置新的显示参数
end;
actiON:=cafree;
end;//本代码编在1024×768,运行时自动将分辨率设为800×600,适应大小,参考一下吧。
procedure TForm1.FormCreate(Sender: TObject);
const
orignwidth = 800;
orignheight = 600;
var
devmode:tDevicemode;
begin
if screen.width<>orignwidth then
begin
if EnumDisplaySettings(nil,0,devmode) then
begin
devmode.dmfields:=dm_pelswidth OR dm_pelsheight
OR dm_DisplayFrequency;
devmode.dmpelswidth:=orignwidth; {宽度}
devmode.dmpelsheight:=orignheight;{高度}
devmode.dmDisplayFrequency:= 75; {刷新率}
ChangeDisplaySettings(devmode,0); {更改设置}
end;
end;
end;
其中两个全局参数很重要。
屏幕中的控件自适应大小:假设你在800*600的分辨率下设计的form,第一步:
inplementation
const
ScreenWidth: LongInt = 800; {I designed my form in 800x600 mode.}
ScreenHeight: LongInt = 600;{$R *.DFM}procedure TForm1.FormCreate(Sender: TObject);
begin
scaled := true;
if (screen.width <> ScreenWidth) then
begin
height := longint(height) * longint(screen.height) div ScreenHeight;
width := longint(width) * longint(screen.width) div ScreenWidth;
scaleBy(screen.width, ScreenWidth);
end;
end;下一步,要让每个子控制的字体改变到合适的大小:
type
TFooClass = class(TControl); { needed to get at protected }
{ font property }var
i: integer;
begin
for i := ControlCount - 1 downto 0 do
TFooClass(Controls[i]).Font.Size :=
(NewFormWidth div OldFormWidth) *
TFooClass(Controls[i]).Font.Size;
end;
设置刷新频率EnumDisplaySettings我想要的是最匹配值,也就是800*600能否上到100Hz,1024*768能否上到85Hzprocedure GetDisplayFrequency(List: TStrings);
var
DeviceMode: TDeviceMode;
Index: Integer;
begin
Index := 0;
while EnumDisplaySettings(nil, Index, DeviceMode) do
with DeviceMode do
begin
List.Append(Format('色深=%d,显示宽度=%d,显示高度=%d,显示频率=%d',
[dmBitsPerPel,dmPelsWidth,dmPelsHeight,dmDisplayFrequency])); Inc(Index);
end;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
GetDisplayFrequency(Memo1.Lines);
end;uses
Windows, SysUtils; ... // 这个函数返回的显示刷新率是以Hz为单位的
function GetDisplayFrequency: Integer;
var
DeviceMode: TDeviceMode; begin
EnumDisplaySettings(nil, Cardinal(-1), DeviceMode);
Result := DeviceMode.dmDisplayFrequency;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
current:string;
dm:DEVMODE;
begin
dm.dmSize:=sizeof(DEVMODE);
EnumDisplaySettings(nil,DWORD(-1),dm);
current:=format('%s at %dx%d %dbpp %dHz',
[dm.dmDeviceName,
dm.dmPelsWidth,
dm.dmPelsHeight,
dm.dmBitsPerPel,
dm.dmDisplayFrequency]); showmessage(current);
end;Delphi程序设计界面的动态调整施江杰 --------------------------------------------------------------------------------
如何设计美观的程序一直是程序员的一大难题,很多程序员可以写出很好的程序,但往往困于拙劣的外观。其中如何使美观的程序能在不同的环境下一样美观也同样困扰着我们,我在一些程序的制作中掌握了一些使程序在不同环境同样美观的方法,希望给大家一点启示。
不同环境一般有不同的色彩数和不同的分辨率等等,我只对这两种环境进行说明。
一. 不同的色彩数
对于不同的色彩数我们可以用启动时加以判断并选择相应的配色/图片方案。可在窗口建立时加入程序如下:
procedure TForm1.FormCreate(Sender: TObject);
var
colorbits:Integer;
begin
colorbits :=GetDeviceCaps( h, BITSPIXEL );
case colorbits of
1: //黑白配色方案;
....
4: //16色配色方案;
....
8: //256色配色方案;
....
16: //16位色配色方案;
....
24: //24位色配色方案;
....
32: //32位色配色方案;
....
end;
end;
这样就可以在不同的颜色环境下使用不同的配色方案,不同的图标/图片/色彩均在设计者的控制下,可制作出比较好的图片/彩色环境,而不至于在真彩时很不错,而在16色时一塌糊涂。
二. 不同的分辨率
不同的分辨率下原来的窗口界面可能变得面目全非,对于这种问题,我一般采取以下方式:
先取得分辨率方法有如下:
procedure TForm1.FormCreate(Sender: TObject);
var
sx,sy:Integer;
begin
sx := GetSystemMetrics(SM_CXSCREEN); //分辨率宽
sy := GetSystemMetrics(SM_CYSCREEN); //分辨率高
end;
也可以用Screen.width/Screen.Height来取得
也可以用Var DevMode:TDeviceMode;
Begin
EnumDisplaySettings(nil,0,DevMode)
sx := DevMode.dmPelsWidth
sy := DevMode.dmPelsHeight 来取得
end
也可以用sx := GetDeviceCaps(GetDC(Form1.Handle), HORZRES)
sx :=GetDeviceCaps(GetDC(Form1.Handle), VERTRES) 来取得而后有以下几种方法:
1. 判断分辨率并选择相应的分辨率方案;
(对每种分辨率设计一套控件/字体的大小方案用于在不同分辨率下选择)
2. 固定窗口大小;
procedure TForm1.FormResize(Sender: TObject);
begin
width:=640; height:=480;
left:=0; top:=0;
end;
3. 使用procedure ScaleBy(M, D: Integer)这个过程来对可视控件进行大小调节(此过程不调节窗口大小,也不变动控件的left和top,对控件的大小按M/D比例来调节),具体如下:
procedure TForm1.FormCreate(Sender: TObject);
//假设原来的设计环境为800x600
var
FWidth:integer;
begin
if(Screen.width<> 800)then
begin
FWidth:=Width;
Scaled:=TRUE;
Font.Size:=(Width DIV FWidth)*Font.Size;//字体大小调整
ScaleBy(Screen.Width,800); //控件大小调整
Height:=longint(Height)*longint(Screen.Height)DIV 600;
Width:=longint(Width)*longint(Screen.Width)DIV 800;//窗口大小调整
end;
end;
用此种方法比较实用,而且使用比较简单,基本能适应大多数环境。
4. 调节分辨率到所需的分辨率(即设计时的分辨率,此法对要求封闭的系统比较有用,如工控、触摸屏等等)
procedure TForm1.FormCreate(Sender: TObject);
var
FWidth:integer;
DevMode:TDeviceMode;
begin
if(Screen.width<> 800)then
begin
Result:=EnumDisplaySettings(nil,0,DevMode); //取得旧的显示参数
if Result then
begin
DevMode.dmFields:=DM_PELSWIDTH Or DM_PELSHEIGHT;
DevMode.dmPelsWidth:=800;
DevMode.dmPelsHeight:=600;
ChangeDisplaySettings(DevMode,0); //设置新的显示参数
end;
end;
当然,我们还可以使用Delphi的法宝第三方控件,我找的有ResScale 控件,此控件能够适应多种不同屏幕分辨率,自动改变TForm上控件位置及尺寸的控件,控件位置会储存于.INI文件或注册表中。你还可以找到更好的控件或者方法,找到的话告诉我一下mail me: [email protected]