不同分辨率下字体大小不同的问题(50分)

T

Temper

Unregistered / Unconfirmed
GUEST, unregistred user!
小弟用delphi5编了一个五子棋的游戏,编译环境为windows2000,屏幕分辨率800*600,
但在1024*768下用的时候窗口变的很小,字更小,几乎无法辨认,在640*480下用时,
屏幕又几乎装不下了,不知应怎样解决?请诸位大虾不吝赐教。多谢多谢。
 
话题563901的标题是: 如何是自己的程序在不同的分辨率下正常! (100分)
分类:包装发布 GBlueMan (2001-6-12 16:58:00)
各位兄弟,请指教:
问题是这样的,我为我们学校做了一个数据库管理程序,开始我在自己的机器上调试
时,一切都OK。但当我交付使用是问题出来了:
问题是这样的:我的机器用的是800*600的分辨率,而使用该程序的部门所用的机器
较老,显示器的分辨率只能用640*480,我的程序界面严重变形,惨不忍睹。
请问,如何才能使自己的程序在不同的分辨率下显示正常?

zwma (2001-6-12 17:18:00)
用API 修改显示器的显示比例

张剑波 (2001-6-12 17:20:00)
要不在640X480环境中再做一遍。
要不用procedure ScaleBy(M, D: Integer);方法,详见delphi help


Jiao_he (2001-6-12 17:22:00)
你可能在640X480的机器编译一下,或者采取下面的第3种方法基本可以解决。
转载>不同的分辨率
不同的分辨率下原来的窗口界面可能变得面目全非,对于这种问题,我一般采取以下方式:
先取得分辨率方法有如下:
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;


dana (2001-6-12 17:26:00)
你应多加几个panel,然后都让它们自动缩放。
这样就可以适应不同的屏幕大小。

浪边人 (2001-6-13 0:27:00)
同意dana的

GBlueMan (2001-6-13 17:02:00)
首先谢谢各位。
如何用API实现,请给出具体实现过程。
我认为“在640*480环境下重做一遍”这样不行,因为如果哪天哪个部门换了一台机子那又
会觉得程序界面难看;
对每种分辨率设计一套控件/字体的大小方案用于在不同分辨率下选
择这样又太麻烦;
至于多用几个Panel,其实我已经用了,只是不知如何自动缩放,希望给
出详细方法的实现过程。
Jiao_he已经给出几种方案,我可以试试,如果那位还有更简单的方法,请不防贴出。

MrMengyi (2001-6-17 22:35:00)
anchors属性
可能对你有帮助
字体问题我认为是最棘手的
>改分辨率
万一显示器不行,怎么办?(如上不了1024)

htw (2001-6-17 23:31:00)
?

Lihang001 (2001-8-18 0:34:00)
我想你可以试一试:
假设你的程序开发环境下分辨率是800*600,而最终要分发应用的机器分辨率不确定,则你
可以依据新的分辨率,让程序自动调整,可试一下:
先在程序主窗体的Interface 部分定义两个常量,表示设计程序时的屏幕的宽度和高度
(以像素为单位)。在程序主窗体的OnCreate事件中判断一下当前分辨率是否与程序设计
时的分辨率相同,如果不同,调用程序主窗体的SCALE过程重新能调整程序主窗体中的控件
宽度和高度。
Const
Orignwidth=800;
Orignheight=600;
procedure TForm1.FormCreate(Sender: TObject);
begin
scaled:=true;
if (screen.width<>orignwidth) then
begin
height:=longint(height)*longint
(screen.height) div orignheight;
width:=longint(width)*longint
(screen.width) div orignwidth;
scaleby(screen.width , orignwidth);
end;
end;


ddev (2001-8-18 0:49:00)
这是一个Windows程序(GDI程序)无法避免的一个问题。
所以如果你的程序存在这种情况,大致只有两种处理办法:
1、你的程序界面也必须在640*480下设计。
这是以前 GDI 程序推荐的对于可能涉及分辨率问题是最根本的解决方案;
这种情况在Win16(Windows 3.1/3.2)转向Win32(Windows95)是经常遇到的
问题。当时有一句话:有可能,就用640*480。
而现在的机器,绝大多数已经可以以800*600为基本设计界面了。
只有很少的程序对800*600可能还是不够,比如:3DMax。
2、在程序中检索各个窗口的位置,如果有可能,
尽量使用窗口的Position不要是psDefault,而是调整为
psScreenCenter/psDestopCenter,这样窗口不会“跑”出视区。
另外推荐的是:不要在一个窗口中放置太多的控件,因为别人因为可能
屏幕问题而无法看到所有的内容。
这是没有办法的办法。

sudanling (2001-8-28 16:03:00)
我认为将窗口的大小在关闭时保存,打开始读取,这样让他自己调整一次就行!

oceanwave (2001-8-28 16:11:00)
1、你的窗体的大小应设置在640*480的范围内
2、窗体的SCALE属性设为FALSE,就可以了

GBlueMan (2001-9-11 22:17:00)
接受答案了。谢谢各位!

 
让你的程序自适应分辨率:
implementation
  const
  ScreenWidth:LongInt=800;
  ScreenHeight:LongInt=600;
  {$ R*.DFM}
  procedure TMainForm.FormCreate(Sender:TObject);
  var
  OldFormWidth:integer;
  begin
  Scaled:=TRUE;
  if(Screen.width<> ScreenWidth)then
  begin
  OldFormWidth:=Width
  Height:=longint(Height)*longint(Screen.Height)DIV S creenHeight;
  Width:=longint(Width)*longint(Screen.Width)DIV Scre enWidth;
  ScaleBy(Screen.Width,ScreenWidth);
  Font.Size:=(Width DIV OldFormWidth)*FontSize;
  end;
  end;
 
多人接受答案了。
 

Similar threads

I
回复
0
查看
508
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
顶部