系统是在800*600的环境下开发的,在别的分辩率的环境下界面都变形了
解决方案 »
- 如何得到SQL2000中视图中字段的数据类型等属性的信息
- 如何通过像QQ一样抓屏获取运行中的窗体的控件信息,包括名称、类型等。
- 如何改变Tedit失效后的颜色?
- 国庆快乐,这个DLL怎样做呢????????????????谢谢
- 怎么将ACCESS数据库的表绑定到打包程序中,用注册表或ini文件???
- 有关记录的长度问题
- windows消息的小问题
- 辛苦了,高手们!怎样让combobox的items值分组连接一表的“类型”字段值。
- 请问如下代码为什么不能将符合条件的记录全部删除?如何改正?
- 这个是什么错误:Abstract Error ?
- 关于ADO调试,解决问题立马送分!!!各为同仁!
- Borland编程大赛的试题!
我的方法根据高手的指点定义两个全局变量。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]
让Delphi做的程序能自动适应屏幕的分辨率和字体设置
implementation
Const DesignWidth=800; //在800x600下设计Form
{$R *.DFM}
procedure TForm1.FormCreate(Sender: Tobject);
var
AmountScaled: Integer;
begin
//根据屏幕分辨率并设置比值,然后显示Form
AmountScaled:= Round(Screen.Width*100/DesignWidth);
ScaleBy(AmountScaled, 100);
end;
end.
1. 一定要将Form的AutoScroll属性设置为False.
2. 所有的字体最好采用Arial, 这样不易出问题
但是这样不能解决全部问题,有些可以,有些还是会变形,我不得不把一些界面缩小,因为在1024下缩小的界面,在800下刚好是全屏,所以我不得不一遍遍调试,最终还是改好了,我想你也可以的,只是麻烦点了!