用户界面显示问题(50分)

  • 主题发起人 主题发起人 jerjoan
  • 开始时间 开始时间
J

jerjoan

Unregistered / Unconfirmed
GUEST, unregistred user!
我的程序是在P4机器下写的,分辨率1024*768,在1024*768机器上一切正常,可是如果把机器分辨率改为800*600,界面显示不全,拖动滚动条时会出现严重重影,我视过refresh等方法,都不行,不知哪位高手可以赐教。
 
我觉得可以在窗体的onCreate里面写这样的一段代码,
var
I: integer;
... ...
begin
... ...
for I := 0 to self.ControlCount -1 do
begin
self.Controls.Left := self.Controls.Left * 800 div 1024;
self.Controls.Width := self.Controls.Width * 800 div 1024;
self.Controls.Top := self.Controls.Top * 600 div 784;
self.Controls.Height := self.Controls.Height * 600 div 1024;
end;
... ...
end;
 
在程序开始运行时,设置机器的分辨率;在程序结束时在修改回来
 
如何得到和设置机器的分辨率
 
将Form的Scaled设为true即可,
这样Form及其上的控件都适应屏幕的分辨率了
测分辨率的方法是:
GetDeviceCaps(GetDC(frmMain->Handle),HORZRES); //横
GetDeviceCaps(GetDC(frmMain->Handle),VERTRES); //纵
可测出是 640x480 , 800x600 , 1024x768 ......
动态设置分辩率 别人的代码
function DynamicResolution(x, y: WORD): Boolean;
var
lpDevMode: TDeviceMode;
begin
Result := EnumDisplaySettings(nil, 0, lpDevMode);
if Result then
begin
lpDevMode.dmFields := DM_PELSWIDTH or DM_PELSHEIGHT;
lpDevMode.dmPelsWidth := x;
lpDevMode.dmPelsHeight := y;
Result := ChangeDisplaySettings(lpDevMode, 0) = DISP_CHANGE_SUCCESSFUL;
end;
end;
还有一段,你参考一下
一般来说,在一种屏幕分辨率下设计的窗体换到另一种屏幕分辨率下去显示,
其大小会改变。要使窗体大小不依赖于屏幕分辨率,最简单的思路就是在运行
程序时将系统的屏幕分辨率设置为创建窗体时的屏幕分辨率,然后在退出程序时
再将屏幕分辨率恢复到初始值;还有一种思路是先比较两种分辨率大小,
再根据结果按比例扩大或缩小窗体。
这两种方法各有优缺点:前者会影响其他程序的显示,后者要做得完美就比较复杂,
需要修改窗体大小,各个控件的位置及字体大小等,但这可以通过技巧来完美地解决。

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

const
ScreenHeight: integer = 800;
ScreenWidth: integer = 600;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
var
x, y: LongInt;
begin
form1.scaled := true;
//窗体可以缩放
x := getSystemMetrics(SM_CXSCREEN);
y := getSystemMetrics(SM_CYSCREEN);
//程序运行时获取目标机器的屏幕分辨率
if (x <> ScreenHeight) or (y <> ScreenWidth) then
//目标机器的屏幕分辨率与作者机器的屏幕分辨率不同
begin
form1.height:=form1.height*x DIV ScreenHeight;
form1.width:=form1.width*y DIV ScreenWidth;
scaleBy(x,ScreenHeight);
//调用窗体的scaleBy函数,将窗体大小变为初始大小的x/ ScreenHeight倍。
//这是本程序的关键技巧,同时缩放的包括窗体上各组件和字体。
end;
end;

end.
 
拖动滚动条时,界面上的重影是怎么加事?
 
拖动滚动条时,界面上的重影是怎么回事
 
用D7的话
用scaleby()
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
C
回复
0
查看
564
CSDN → Delphi论坛
C
后退
顶部