如何是自己的程序在不同的分辨率下正常!(100分)

  • 主题发起人 GBlueMan
  • 开始时间
G

GBlueMan

Unregistered / Unconfirmed
GUEST, unregistred user!
各位兄弟,请指教:
问题是这样的,我为我们学校做了一个数据库管理程序,开始我在自己的机器上调试
时,一切都OK。但当我交付使用是问题出来了:
问题是这样的:我的机器用的是800*600的分辨率,而使用该程序的部门所用的机器
较老,显示器的分辨率只能用640*480,我的程序界面严重变形,惨不忍睹。
请问,如何才能使自己的程序在不同的分辨率下显示正常?
 
用API 修改显示器的显示比例
 
要不在640X480环境中再做一遍。
要不用procedure ScaleBy(M, D: Integer);方法,详见delphi help
 

你可能在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;

 
你应多加几个panel,然后都让它们自动缩放。
这样就可以适应不同的屏幕大小。
 
同意dana的
 
首先谢谢各位。
如何用API实现,请给出具体实现过程。
我认为“在640*480环境下重做一遍”这样不行,因为如果哪天哪个部门换了一台机子那又
会觉得程序界面难看;
对每种分辨率设计一套控件/字体的大小方案用于在不同分辨率下选
择这样又太麻烦;
至于多用几个Panel,其实我已经用了,只是不知如何自动缩放,希望给
出详细方法的实现过程。
Jiao_he已经给出几种方案,我可以试试,如果那位还有更简单的方法,请不防贴出。
 
anchors属性
可能对你有帮助
字体问题我认为是最棘手的
>改分辨率
万一显示器不行,怎么办?(如上不了1024)
 
我想你可以试一试:
假设你的程序开发环境下分辨率是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;
 
这是一个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,这样窗口不会“跑”出视区。
另外推荐的是:不要在一个窗口中放置太多的控件,因为别人因为可能
屏幕问题而无法看到所有的内容。
这是没有办法的办法。
 
我认为将窗口的大小在关闭时保存,打开始读取,这样让他自己调整一次就行!
 
1、你的窗体的大小应设置在640*480的范围内
2、窗体的SCALE属性设为FALSE,就可以了
 
接受答案了。谢谢各位!
 
顶部