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

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

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

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

下载LOFTER我的照片书  |

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

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

const
  MinWidth = 500;
  MinHeight = 400;

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

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

  //限制最小高度
  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

专注的力量成就梦想

时间: 2024-10-07 05:31:21

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

解决delphi的 dbgrid在读取access文本型字段显示TWideMemoField的问题

原文:http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E7%9F%A5%E8%AF%86%E5%BA%93/22028.shtml "解决delphi的 dbgrid在读取access文本型字段显示TWideMemoField的问题": 关键词:解决 delphi dbgrid 读取 access 文本 型 字段 显示 twidememofield 问题 如题:delphi 的dbgrid在读取access文本型字段会显示twi

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

窗体缩放是一个困扰我多时的问题,为了解决这个问题,我从网上找了很多相关的资料,很多人说用Anchor和Dock属性,但是我试了以后,始终不能达到想要的效果. 后来,搜到了一个帖子,终于解决了这个问题,再次对该贴作者表示感谢.原帖链接为: http://www.cnblogs.com/sydeveloper/archive/2013/01/29/2881521.html 以下是笔者的实现过程: 1.  首先在窗体上放上一个Panel容器,并将容器的Dock属性设为Fill,即所有的控件都放在了这个

delphi 窗体只显示控件

procedure TForm1.FormCreate(Sender: TObject);begin    BorderStyle := bsNone;    Brush.Style := bsClear;end; delphi 窗体只显示控件,布布扣,bubuko.com

delphi 窗体添加背景图片

var   Bmp: TBitmap; procedure TForm1.FormCreate(Sender: TObject); begin   Bmp := TBitmap.Create;   Bmp.LoadFromFile('D:\test.bmp');   Brush.Bitmap := Bmp; end; procedure TForm1.FormDestroy(Sender: TObject); begin   Bmp.Free; end; delphi 窗体添加背景图片

delphi 窗体透明

TransparentColor:=true;    TransparentColorValue:=clFuchsia;    Color:= TransparentColorValue;    BorderStyle:=bsNone; delphi 窗体透明http://hi.baidu.com/duduppp/item/f347df3a16dbb9607c034bd5 来自为知笔记(Wiz) delphi 窗体透明

C# WinForm 解决子窗体放大后,子窗体图标放大的问题

解决子窗体放大后,子窗体的图标占用主窗体的菜单栏的问题. C#子窗体最大化时, 那个图标跑到主窗体的前面去了, 造成界面不统一也不美观. 所以需要进行处理, 只要有主窗体的菜单ItemAdded事件中加进下面代码: if (e.Item.Text.Length == 0 || e.Item.Text == "还原(&R)" || e.Item.Text == "最小化(&N)") {     e.Item.Visible = false;} 运行再查

C#解决MDI窗体闪屏的方法

最近从师兄手上接了一个C#的项目,需要用到MDI窗体,可是每当我显示子窗体的时候会有一次“闪烁”,很明显,看起来非常不爽,查找许久,知道是每次在show()子窗体的时候都会调用子窗体构造函数重绘窗体,其中需要将子窗体的尺寸调整到我在程序中设置的大小,无论我这样设置,这个窗口大小变化总会在show()的时候显示出来,我试过网上说的设置双缓冲.先隐藏窗体等启动之后再显示.借助定时器设置窗体的opacity属性,可是问题依旧,没有任何变化,一个偶然的机会找到了微软的MSDN论坛,发现遇到这个问题的哥们

WinForm 窗体缩放动画效果

using System; using System.Collections.Generic; using System.Text; using System.Threading; using System.Windows.Forms; using System.Drawing; using System.Diagnostics; namespace AnimatedTransform { static class FormTransform { public static void Trans

VS2012 webservice的创建并在iis上发布,发布完后解决“测试窗体只能用于来自本地计算机的请求.”问题视频教程

VS2012 webservice的创建并在iis上发布,发布完后解决"测试窗体只能用于来自本地计算机的请求."问题视频教程 http://yunpan.cn/cZckwQc7FyFN9 访问密请下载查看  http://download.csdn.net/detail/u014180504/8503089