我在csdn上找到了关于不同分辨率下的程序设计问题的答案,其中有一个是这样写的最好的方法,可能就是程序启动时首先检测系统分辨率,如果不符合要求,就更改为符合要求的。比如你的分辨率是1024X768,用户是800X600。那就在程序启动的时候把系统分辨率更改。在程序退出的时候再把分辨率修改回原来状态。我觉得这样可能是最好,最完美,最省事的方法了。
我的方法根据高手的指点定义两个全局变量。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;
我拿create的代码试了一下(我在1024*768下设计,在800×600下运行),创建的时候分辨率确实能改过来(但最下面的状态栏改不过来,还是处在相对于800×600的位置),但是在fromClose的时候就不行了,不知道为什么?请大家帮忙看看
我的方法根据高手的指点定义两个全局变量。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;
我拿create的代码试了一下(我在1024*768下设计,在800×600下运行),创建的时候分辨率确实能改过来(但最下面的状态栏改不过来,还是处在相对于800×600的位置),但是在fromClose的时候就不行了,不知道为什么?请大家帮忙看看
解决方案 »
- 热健 怎么呼出 最大化 最小化 还原
- 我把编译生成的dll文件放在web服务器指定的目录,然后输入localhost/web/Tableex.dll/TestTable 按回车,为什么没有出来结果?
- mysql查表问题
- 请教!!数据输出打印问题???
- 简单的sql 问题?请赐教
- 一个好急的在程序中写存储过程的问题......^-^大家帮我.
- 请问有没有mp3编码、解码控件,如何下载
- 求购有关限制只能让一个用户登录一次的思想????
- 如何激发另一个窗口中的按扭点击事件?
- 怎样在关闭自己的同时又去拷贝一个文件!帮帮菜鸟吧!急!急!
- 看过申旻的《Delphi 高手突破》一书的请看过来~
- 再求利用grid制作一个多项查询(可以自主增加多个查询条件,每个查询条件由combobox和edit组成)!
上面的函数第二个参数不为0,改成:dev_regupdate什么的。
我及不清了,反正是要改注册表。
你查一下帮助吧,^_^
我源程序是按800*600做的。
在form的create中加入
case Getsystemmetrics(0) of
1024: begin scaleby(128,100); end;
800: begin scaleby(100,100); end;
640: begin scaleby(100,125); end;
//自己加吧
end;
,也可以独立显示 (Create(AOwner: TComponent); overload; override;)!!)
代码如下 unit ChildFrm;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls, ExtCtrls, Menus,math,typinfo,DBCtrls
,dbGrids,DBGridEh,ComCtrls;
const
ScreenHeight=768; //根据你设计时的屏幕分辩率设定
Screenwidth =1024;
type TChildForm = class(TForm)
Panel1: TPanel;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormDestroy(Sender: TObject);
procedure WMWindowPosChanging(var msg:TWMWindowPosChanging);
message WM_WINDOWPOSCHANGING;
procedure FormResize(Sender: TObject);
procedure FormKeyPress(Sender: TObject; var Key: Char);
private
FAsChild: Boolean;
FTempParent: TWinControl;
procedure CentalPanel;
procedure SetScaleBy; //自适应分辨率
Procedure SetColor;
protected
procedure CreateParams(var Params: TCreateParams); override;
procedure Loaded; override;
public
constructor Create(AOwner: TComponent); overload; override;
constructor Create(AOwner: TComponent; AParent: TWinControl); reintroduce; overload; // The method below must be overriden to return either the main menu
// of the form, or nil.
function GetFormMenu: TMainMenu; virtual; abstract;
function CanChange: Boolean; virtual;
end;var
ChildForm: TChildForm;implementationuses Main;{$R *.DFM}
procedure TChildForm.CentalPanel;
var
i:Integer;
begin
if (panel1.Visible) or (panel1.Tag<>0) then
begin
if panel1.Width < ClientWidth then
panel1.Left := (ClientWidth - panel1.Width ) div 2
else
panel1.Left := 0;
if panel1.Height <ClientHeight then
panel1.Top :=(ClientHeight - panel1.Height ) div 2
else
panel1.Top := 0;
end else
begin
for i:=0 to self.ComponentCount-1 do
begin
if (self.Components[i] is Tpanel ) then
begin
if (((self.Components[i] As Tpanel ).Parent) is TTabSheet) And ((self.Components[i] As Tpanel ).Tag=1)then
begin
if (self.Components[i] As Tpanel ).Width < (((self.Components[i] As Tpanel ).Parent) As TTabSheet).ClientWidth then
(self.Components[i] As Tpanel ).Left := ((((self.Components[i] As Tpanel ).Parent) As TTabSheet).ClientWidth - (self.Components[i] As Tpanel ).Width ) div 2
else
(self.Components[i] As Tpanel ).Left := 0;
if (self.Components[i] As Tpanel ).Height <(((self.Components[i] As Tpanel ).Parent) As TTabSheet).ClientHeight then
(self.Components[i] As Tpanel ).Top :=((((self.Components[i] As Tpanel ).Parent) As TTabSheet).ClientHeight - (self.Components[i] As Tpanel ).Height ) div 2
else
(self.Components[i] As Tpanel ).Top := 0;
end;
end;
end;
end;
//SetScaleBy;
end;
procedure TChildForm.SetScaleBy; //自适应分辨率
var
i :integer;
begin
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 ;
for i := componentCount - 1 downto 0 do
with components[i] do
begin
if GetPropInfo(ClassInfo, 'font') <> nil then
font.size := (screen.width DIV screenwidth) * font.size;
end;
end;
procedure TChildForm.WMWindowPosChanging(var msg:TWMWindowPosChanging);
var
CaptionHeight:integer;
begin
CaptionHeight := GetSystemMetrics(SM_CYCAPTION);
msg.WindowPos ^.cx :=Max(msg.WindowPos ^.cx,panel1.Width+20);
msg.WindowPos ^.cy :=Max(msg.WindowPos ^.cy,panel1.Height+20+CaptionHeight);
inherited;
end;constructor TChildForm.Create(AOwner: TComponent);
begin
FAsChild := False;
inherited Create(AOwner);
SetScaleBy;
end;constructor TChildForm.Create(AOwner: TComponent; AParent: TWinControl);
begin
FAsChild := True;
FTempParent := aParent;
inherited Create(AOwner);
SetScaleBy;
SetColor;
end;procedure TChildForm.Loaded;
begin
inherited;
if FAsChild then
begin
align := alClient;
BorderStyle := bsNone;
BorderIcons := [];
Parent := FTempParent;
Position := poDefault;
end;
end;procedure TChildForm.CreateParams(var Params: TCreateParams);
Begin
Inherited CreateParams(Params);
if FAsChild then
Params.Style := Params.Style or WS_CHILD;
end;function TChildForm.CanChange: Boolean;
begin
Result := True;
end;procedure TChildForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
action :=cafree;
end;procedure TChildForm.FormDestroy(Sender: TObject);
begin
ChildForm :=nil;
end;procedure TChildForm.FormResize(Sender: TObject);
begin
CentalPanel;
end;procedure TChildForm.FormKeyPress(Sender: TObject; var Key: Char);
begin
{if Key = #13 Then
Begin
SelectNext(ActiveControl,True,True);
Key := #0;
End;}
end;procedure TChildForm.SetColor;
var
i,j:integer;
begin
Panel1.Color:=$00F8E4D8;
for i:=0 to self.ControlCount-1 do
begin
//$00F8E4D8
If (self.Components[i] is TEdit) tHEN
Begin
(self.Components[i] As TEdit).ImeName:=screen.DefaultIme;
End;
If (self.Components[i] is TDbEdit) tHEN
Begin
(self.Components[i] As TdbEdit).ImeName:=screen.DefaultIme;
End;
If (self.Components[i] is TDBGrid) tHEN
Begin
For j:=0 to (self.Components[i] As TDBGrid).Columns.Count-1 do
Begin
(self.Components[i] As TDBGrid).Columns.Items[j].ImeName:=screen.DefaultIme;
End;
End;
If (self.Components[i] is TDBGridEh) tHEN
Begin
For j:=0 to (self.Components[i] As TDBGridEh).Columns.Count-1 do
Begin
(self.Components[i] As TDBGridEh).Columns.Items[j].ImeName:=screen.DefaultIme;
End;
End;
end;end;end.