如何在不同的屏幕分辨率、刷新率下正常显示用Delphi开发的Windows程序(50分)

  • 主题发起人 主题发起人 lcwzm
  • 开始时间 开始时间
L

lcwzm

Unregistered / Unconfirmed
GUEST, unregistred user!
我的显示器是17吋的,采用1024*728的分辨率、85HZ的刷新率,用Delphi开发
的Windows程序在本机上运行时,界面显示正常,但在其它机器上(具有不同的
屏幕分辨率、刷新率的显示器)运行时,程序图形界面会发生严重变形,虽不
影响使用,但总觉得不爽,请问如何解决。
 
你得做成适应不同分辨率的界面,也就是说在800X600的机器上,
你的显示也要做成800X600的。
比如程序装载后先读取系统信息,然后分别处理
 

抄别人的,可能对你有点用特别是在二.3中提到的方法不错我试过!

>全文如下

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: sjj@netease.com
 
form1.font选用gb2312字体
form1.scaled:=false;
 
接收答案
 
关键不是分辨率
而是大字体/小字体的差别吧
 
后退
顶部