http://anony3721.blog.163.com/blog/static/511974201082235754423/

解决Delphi窗体缩放の疑难杂症

2010-09-22 15:57:54|  分类: 默认分类 |  标签:delphi  |举报|字号 订阅

 
 

No.1 Delphi中如何限制窗体大小?

Delphi中可以限制窗体或者元件的大小,只要指定它的Constraints属性即可(默认是0,就是不限制)。但是Delphi这个属性有个很大的缺陷,比如从上往下调整,达到最小后,窗体高度虽然不会缩小了,但是窗体会继续往下移动,这样看起来会有些不正常(Delphi自己的窗体没有这个现象)。要解决这个问题,还是只有截取windows的消息,自己进行处理。

const
  MinWidth = ;
  MinHeight = ;

procedure WMSIZING(var Msg: TMessage); message WM_SIZING;

procedure TfrmMain.WMSIZING(var Msg: TMessage);
begin
  Msg.Result := ;

  //限制最小高度
  if (PRect(Msg.LPARAM)^.Bottom - PRect(Msg.LPARAM)^.Top) < MinHeight then
  begin
    if PRect(Msg.LPARAM)^.Top = Top then
      PRect(Msg.LPARAM)^.Bottom := PRect(Msg.LPARAM)^.Top + MinHeight
    else
      PRect(Msg.LPARAM)^.Top := PRect(Msg.LPARAM)^.Bottom - MinHeight;
  end;

  //限制最小宽度
  if (PRect(Msg.LPARAM)^.Right - PRect(Msg.LPARAM)^.Left) < MinWidth then
  begin
    if PRect(Msg.LPARAM)^.Left = Left then
      PRect(Msg.LPARAM)^.Right := PRect(Msg.LPARAM)^.Left + MinWidth
    else
      PRect(Msg.LPARAM)^.Left := PRect(Msg.LPARAM)^.Right - MinWidth;
  end;
end;

 
No2. Delphi中可视控件随窗口的缩放自动改变大小的方法

找了很久,發現下面的寫法可以實現,在form改變大小時,畫面上的控件的相對位置不變,但控件的大小及控件上的文字大小隨之改變。

unit Unit1;   
interface     
uses 
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
Dialogs, StdCtrls, Buttons;

type 
TForm1 = class(TForm) 
Button1: TButton; 
SpeedButton1: TSpeedButton; 
procedure FormResize(Sender: TObject); 
procedure FormCreate(Sender: TObject); 
private 
{ Private declarations } 
FWidth: Integer; 
public 
{ Public declarations } 
end;

var 
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormResize(Sender: TObject); 
begin 
ScaleBy(Width, FWidth); 
FWidth := Width; 
end;

procedure TForm1.FormCreate(Sender: TObject); 
begin 
FWidth := Width; 
end;

end.

delphi 程序窗体及控件自适应分辨率

代码如下:
unit untFixForm;
interface
uses
Classes, SysUtils, Controls, Forms;
type
TFontedControl = class(TControl)
public
    property Font;
end;
TFontMapping = record
    SWidth : Integer;
    SHeight: Integer;
    FName: string;
    FSize: Integer;
end;
procedure FixForm(AForm: TForm);
procedure SetFontMapping;
var
FontMapping : array of TFontMapping;
implementation
procedure SetFontMapping;
begin
SetLength(FontMapping, 3);
// 800 x 600
FontMapping[0].SWidth := 800;
FontMapping[0].SHeight := 600;
FontMapping[0].FName := '宋体';
FontMapping[0].FSize := 7;
// 1024 x 768
FontMapping[1].SWidth := 1024;
FontMapping[1].SHeight := 768;
FontMapping[1].FName := '宋体';
FontMapping[1].FSize := 9;
// 1280 x 1024
FontMapping[2].SWidth := 1280;
FontMapping[2].SHeight := 1024;
FontMapping[2].FName := '宋体';
FontMapping[2].FSize := 11;
end;
procedure FixForm(AForm: TForm);
var
i, j                 : integer;
t                 : TControl;
begin
with AForm do
begin
    for i := 0 to ComponentCount - 1 do
    begin
      try
        t := TControl(Components[i]);
        t.left := Trunc(t.left * (Screen.width / 1024));
        t.top := Trunc(t.Top * (Screen.Height / 768));
        t.Width := Trunc(t.Width * (Screen.Width / 1024));
        t.Height := Trunc(t.Height * (Screen.Height / 768));
      except
      end; { try }
    end; { for i }
    for i:= 0 to Length(FontMapping) - 1 do
    begin
      if (Screen.Width = FontMapping[i].SWidth) and (Screen.Height = FontMapping[i].SHeight) then
      begin
        for j := 0 to ComponentCount - 1 do
        begin
          try
            TFontedControl(Components[j]).Font.Name := FontMapping[i].FName;
            TFontedControl(Components[j]).FONT.Size := FontMapping[i].FSize;
          except
          end; { try }
        end; { for j }
      end; { if }
    end; { for i }
end; { with }
end;
initialization
SetFontMapping;
end.
SetFontMapping 方法可以自行修改,以适应更多的分辨率。
调用也非常简单,如下所示:
procedure TForm1.FormShow(Sender: TObject);
begin
if MessageBox(Handle,'要使用屏幕自适应吗?','提示',MB_YESNO or MB_ICONINFORMATION) = idno then Exit;
untFixForm.FixForm(Self);
end;

--

Anony
专注的力量成就梦想

解决Delphi窗体缩放の疑难杂症的更多相关文章

  1. delphi 窗体自适应屏幕分辨率

    delphi 窗体自适应屏幕分辨率 这是个困惑我很长时间的问题,到今天终于得到解决了. 话说Delphi有个很强的窗体设计器,这一点让VC粉丝垂涎三尺而不可得.但是,Delphi里设计的窗体并没有自动 ...

  2. C# winform中 窗体缩放自适应的方法(不同电脑/不同分辨率)

    C# winform中 窗体缩放自适应的方法(不同电脑/不同分辨率)   窗体缩放是一个困扰我多时的问题,为了解决这个问题,我从网上找了很多相关的资料,很多人说用Anchor和Dock属性,但是我试了 ...

  3. 【Qt】Qt之自定义界面(窗体缩放-跨平台终极版)【转】

    简述 通过上一节内容,我们实现了窗体的缩放,功能很不错,但是很遗憾-不支持跨平台!如果对于多平台来说,这是一个硬伤,所以,我们急需要一个能够支持跨平台的实现方案. 在网上看到过很多不同的实现方式,多多 ...

  4. 【Qt】Qt之自定义界面(窗体缩放)【转】

    简述 通过前两节内容,我们实现了自定义窗体的移动,以及自定义标题栏-用来显示窗体的图标.标题,以及控制窗体最小化.最大化.关闭. 在这之后,我们还缺少窗体的缩放-当鼠标移动到窗体的边框-左.上.右.下 ...

  5. Qt之自定义界面(窗体缩放-跨平台终极版)

    简述 通过上一节内容,我们实现了窗体的缩放,功能很不错,但是很遗憾-不支持跨平台!如果对于多平台来说,这是一个硬伤,所以,我们急需要一个能够支持跨平台的实现方案. 在网上看到过很多不同的实现方式,多多 ...

  6. Qt之自定义界面(窗体缩放)

    简述 通过前两节内容,我们实现了自定义窗体的移动,以及自定义标题栏-用来显示窗体的图标.标题,以及控制窗体最小化.最大化.关闭. 在这之后,我们还缺少窗体的缩放-当鼠标移动到窗体的边框-左.上.右.下 ...

  7. delphi 窗体透明

        TransparentColor:=true;    TransparentColorValue:=clFuchsia;    Color:= TransparentColorValue;  ...

  8. Delphi窗体创建释放过程及单元文件小结(转)

    Delphi窗体创建释放过程及单元文件小结 Delphi中的窗体,有模式窗体与非模式窗体两种.两种窗体的调用方式不同,模式窗体使用ShowModal显示,非模式窗体使用Show显示.当显示模式窗体的时 ...

  9. 解决mdi窗体闪烁的问题

    /// 解决mdi窗体闪烁的问题 /// </summary> protected override CreateParams CreateParams { get { CreatePar ...

随机推荐

  1. Window Operations详解

    window(windowLength, slideInterval):返回窗口长度为windowLength,每隔slideInterval滑动一次的window DStream countByWi ...

  2. pandas 常规操作大全

    那年夏天抓住了蝉的尾巴 gitbook 前言 pandas 抓住 Series (排序的字典), DataFrame (row + 多个 Series) 对象 , 就如同 numpy 里抓住 ndar ...

  3. WPS专业版及序列号

    目录 1. 软件下载 2. 序列号(永久) 1. 软件下载 城通网盘:https://sn9.us/dir/13403389-35833830-3fc98f (仅Android版) 官网: https ...

  4. Java程序员集合框架面试题

    Java集合框架是最常被问到的Java面试问题,要理解Java技术强大特性,就有必要掌握集合框架.这里有一些实用问题,常在Java面试中问到. 1. 什么是Java集合API Java集合框架API是 ...

  5. GIT 开发流程

    1.git clone 使用 git clone 将一个项目下载到本地 2.git checkout -b branchName 新建一个branchName的本地分支 3.git add file/ ...

  6. PAT Advanced 1077 Kuchiguse (20 分)

    The Japanese language is notorious for its sentence ending particles. Personal preference of such pa ...

  7. PAT Basic 1046 划拳 (15 分)

    划拳是古老中国酒文化的一个有趣的组成部分.酒桌上两人划拳的方法为:每人口中喊出一个数字,同时用手比划出一个数字.如果谁比划出的数字正好等于两人喊出的数字之和,谁就赢了,输家罚一杯酒.两人同赢或两人同输 ...

  8. 用element-ui进行文件的上传

    在进项的项目中,我使用vue配合element搭建的项目,现在需要用到上传文件的写法!现在列举下我的项目中所使用的上传文件的方法! <el-upload style="display: ...

  9. Codeforces Round #573 (Div. 2) D. Tokitsukaze, CSL and Stone Game (博弈,思维)

    D. Tokitsukaze, CSL and Stone Game time limit per test1 second memory limit per test256 megabytes in ...

  10. Educational Codeforces Round 32 Almost Identity Permutations CodeForces - 888D (组合数学)

    A permutation p of size n is an array such that every integer from 1 to n occurs exactly once in thi ...