如何固定窗口的长宽比(50分)

新手

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大虾,我正在制作一个播放器,所以我想播放器窗口
按播放图像的比例而伸缩大小,就是固定窗口的长宽比
如何做到,好像直接用Tform很难做到呀!
 
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
procedure FormCanResize(Sender: TObject;
var NewWidth,
NewHeight: Integer;
var Resize: Boolean);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
Ratio:Single;
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCanResize(Sender: TObject;
var NewWidth,
NewHeight: Integer;
var Resize: Boolean);
begin
if NewWidth<>Width
then
NewHeight:=Round(NewWidth*Ratio)
else
NewWidth:=Round(NewHeight/Ratio);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Ratio:=0.8;
end;

end.

比金山影霸的还要好,金山影霸只能一边动。
 
楼上朋友的方法不太好,改变窗体大小时会闪烁得很厉害。下面是我的一位朋友帮我写的,很不错的!
我拿出来给大家啦!顺便给大家拜年啦![:D][:D]
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type
TForm1 = class(TForm)
procedure FormCanResize(Sender: TObject;
var NewWidth,
NewHeight: Integer;
var Resize: Boolean);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
bFromHight, bFromWidth: Boolean;
//bFromHight=true,宽度按照高度来修改
//bFromWidth=true,高度按照宽度来修改
procedure WMExitSizeMove(var Meg: TMessage);
message WM_EXITSIZEMOVE;
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.DFM}
{ TForm1 }
procedure TForm1.WMExitSizeMove(var Meg: TMessage);
begin
bFromHight := false;
bFromWidth := false;
end;

procedure TForm1.FormCanResize(Sender: TObject;
var NewWidth,
NewHeight: Integer;
var Resize: Boolean);
begin
if NewHeight <> Height then
if bFromWidth then
NewHeight := Trunc(NewWidth/1.5)
else
begin
NewWidth := Trunc(NewHeight*1.5);
bFromHight := true;
end
else
if NewWidth <> Width then
if bFromHight then
NewWidth := Trunc(NewHeight*1.5)
else
begin
NewHeight := Trunc(NewWidth/1.5);
bFromWidth := true;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Height := Trunc(Width/1.5)
end;
end.
 
to小笨苯: 我在Delphi7.0+Win2K下没有一点闪铄感,你的系统?
 
很容易计算。
请看我的《大事》软件,是最好的范例。http://www.to-happy.com
 
DarwinZhang大哥,我是Delphi5+补丁+Win2000,用你的代码确实闪烁得厉害,我没用过Delphi7,
不知是不是有了改进。那你用我的代码在Delphi7下编译执行,是否有闪烁呀?望告知[:D][:D]
 
to 小笨苯: 也不闪
 
to 小笨苯,看看这个程序(简单),看是否有闪烁?
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
InResize:Boolean;

Ratio:Single;
OldW,OldH:Integer;
procedure WMExitSizeMove(var Meg: TMessage);
message WM_EXITSIZEMOVE;
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.WMExitSizeMove(var Meg: TMessage);
begin
if ClientWidth<>OldW
then
ClientHeight:=Round(Width/Ratio)
else
ClientWidth:=Round(Height*Ratio);
OldW:=ClientWidth;
OldH:=ClientHeight;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
InResize:=False;
OldW:=ClientWidth;
OldH:=ClientHeight;
Ratio:=OldW/OldH;
end;

end.
 
DarwinZhang大哥:
你这段代码确实简单了不少,不过还是有问题呀!在我这里无法实现在鼠标拖动边框的同时使宽,高
始终成比例,而仅仅是放开鼠标后才成比例。我水平低,你再把你的代码改一改吧,确实比较简单一些。
 
我晓得产生闪烁的原因了,是 显示器设置/效果/拖动时显示窗口内容 设置的原因。
只要在这时禁止重绘就应该可以了。
 
DarwinZhang大哥:
>>显示器设置/效果/拖动时显示窗口内容
这个是用户的自由,我们无法干涉呀!希望能找到既简单又好用的万全之策![:)]
 
你原来的那个方法还不错,暂时还没有更好的办法。
 
那是别人帮我写的,我哪有那个水平呀[:(]
呵呵,如果暂时没有,大家将就用吧![:)]
 
好象可以通过设置双缓冲解决这个问题
应该是设置DoubleBuffered:=true
 
vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
你名副其实,笨!你说:“这个是用户的自由,我们无法干涉呀!”
难道你不是程序员吗?你不是可以替用户干很多事吗?我们黑客做得多么优秀啊。
我的《大事》软件是新奇技巧集锦,有很多绝招范例。http://www.to-happy.com
大方一点,把你那219分给我,或者让“新手”出3000分(我很黑,是勒索癖),
我会一语点破梦中人。
vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
 
tohappy:
>>你名副其实,笨!
你说话客气一点!!咱们两人到底谁笨,看看下面的话就知道了!
>>难道你不是程序员吗?你不是可以替用户干很多事吗?我们黑客做得多么优秀啊。
真是大言不惭啊!就你这个糟烂的理解能力,还好意思说别人笨?!哈哈哈,真是让人笑掉大牙!
你根本就没有理解DarwinZhang大哥的意思!DarwinZhang“显示器设置/效果/拖动时显示窗口内容”
这句话的意思是:用鼠标右键单击Windows的桌面,在弹出菜单中选择“属性”,这时,就打开了
“显示属性”对话框,在其中的“效果”页中有这么一个选项“拖动时显示窗口内容”,如果选中
它,拖动窗口时,被拖窗口整体跟着鼠标移动;反之,拖动过程中只显示一个虚框,放开鼠标后,
窗口才显现出真正的样子。(上面说的是Windows2000的,我很长时间没用Win9x和NT了,估计某些
名称稍有不同,但意思都是一样的)DarwinZhang大哥的意思是他的那段代码,只有在没有选中
“拖动时显示窗口内容”时效果比较好。
但每个用户都有自己的个人爱好,我就是喜欢选中“拖动时显示窗口内容”时的效果,难道运行了
你的程序,你就要强行改变吗?你这是什么程序员啊?一点都不替用户考虑!!
[:(!][:(!][:(!][:(!][:(!]
再有,你那个破软件,我都不屑一看,还自觉得不错呢?
 
小贲贲:
我没有理解错。
我的大事软件运行反黄反黑之后就已经自动实现了您上文提到的“拖动时显示窗口内容”,
和手工操作一样自如。
请不要把自己的名字sb说出来。
 
tohappy:
和好了,和好了,以后不能随便出口不逊,记住了吗?好了,这个事情就算过去了![:)]
 
呵呵,早知道同志们很讨论的这么的激烈,我就多加点分了
对不起大家了
分分
祝大家新年快乐
 
顶部