photoshop或flash等程序的工具箱是怎么做的? (100分)

  • 主题发起人 主题发起人 chemstar
  • 开始时间 开始时间
C

chemstar

Unregistered / Unconfirmed
GUEST, unregistred user!
经常见到一些很特别的窗体类型,但在delphi里却不能通过简单的设置来实现,提出来供大家讨论。
1、很多程序带有工具箱或工具面板,比如photoshop或flash等,它那个工具箱即不是一个独立的窗口,也是一个toolbar,
那么它是怎么做成的呢?
2、在windows的资源管理器里复制文件时出现的那个动画窗口,即使它已失去了焦点,也总是在资源管理器的前面
(但又不是stayontop或者showmodal,也不是MDI),而且资源管理器好像是那个窗口的父窗口似的,当资源管理器
最小化时,它也会跟着消失。还有比如记事本等程序的“查找”窗口,它们都是一种什么类型的
窗口?

 提出来,供有志之士解答!
 
delphi里面设置模式窗体不就可以了吗?
 
可以做,但今天不行,我这几天要马上完成一个项目。
 
"标题栏永远不会变灰"很容易
但永远保持焦点不可能
 
1。你说的意思是像word里面的查询子窗体那样吧。
建一个子窗体,formstyle 设置为alontop(好像是这个吧,在属性叶,呵呵,忘名字了,你查查)
2。听别人说
 
1. 在 A 中将 B ShowModel 出来即可(显示为模态)
2. FormStyle := fsStayOnTop;
 
第一个问题可以设置窗体的FormStyle为fsStayOnTop或用B.ShowModel就可以了。
第二个问题 标题栏永远不会变灰 可以做到,但总能保持焦点就做不到了。
以下是标题栏永远不会变灰的代码。适合MDI子窗体,也适合一般窗体。
unit Unit1;

interface

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

type
TForm1 = class(TForm)
private
{ Private declarations }
procedure WMNCActivate(var Mes : TWMNCActivate); message WM_NCACTIVATE;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}
procedure TForm1.WMNCActivate(var Mes : TWMNCActivate);
begin
Mes.Active := True;//永远返True,就为不变灰,如果返回False,则总是灰的。
inherited;
end;
end.
 
to lfpsoft:
1、对于第一个问题:如果设置B窗体的FormStyle为fsStayOnTop,那么B窗体就始终在前了,
(甚至在其它程序的窗体的前面)。若用B.ShowModel,则在关闭B之前你就不能再干别的事
了。仔细观察资源管理器,它显然不是这样的。似乎它和它的复制窗口之间存在一种层次关系
似的:A是B的父窗口,若A最小化B也会最小化,但B的层次又大于A,以至于B既使失去焦点也
总在A的前面。
2、第二个题:我的说法是错误的,B不可能永远保持焦点,只是能永远不变灰罢了。其实我的
问题是如何才能实现像photoshop等软件里面的工具箱和各种面板那样的效果:标题栏永远是蓝
色的,而且永远在主窗口的前面。其实在word里面当把工具栏拖出来时也是这样的效果。按照
你的方法,若在MDI程序里是可行的,但在SDI里就不可以了。尽管也能总保持不变灰,但一旦
失去焦点后就会被其它的窗体盖住。
 
我终于找到问题的答案了。看来求人不如求已。我花了一个晚上的时间思考,终于知道
怎么做了。
要想制作一个类似于photoshop里面那样的工具箱。只要将一个窗体的borderstyl设为
toolwindows,再将它的formstyle设为stayontop.
 
你自己知道了啊。
 
但是新的问题又来了,也是关于窗口的:
在前面我说过,可以通过一定的设置来实现像一些程序里那样的工具箱的效果。
我们知道在word里面,如果将工具栏拖出来的话就会成为一个浮动的工具箱。
我的问题就是如何使这个工具条在程序一启动后就以工具箱的形式存而不是以工
具条的形式存在呢,其实如果像我前面所讲的方法也可以实现类似的效果----但这
仅是表面现象而已,它实际上仍然是两个独立的窗口。
 
Hi,好点子,我在以前也提出了这个同样的问题,但没有得到解决。我很欣赏的工具条
就是这种,象MACROMEDIA的产品,FIREWORKS,DREAMWEAVER,FLASH等等,今天偶然看
到这个帖子,有所悟。
 
看看MSDN的API Createwindowex,它的dwExStyle和dwStyle的的值的组合创建出
各种样式的窗口,Delphi将它们封装成form的一些属性.
 
to: xeen
你能具体说说在Delphi中如何达到这种效果吗?我觉得chemstar的方法是不行的。
我也想到在msdn中查找,可是一是没时间,二是看的不太明白。
 
怎么没有人会这个问题吗?失望!高手呢?
 
  Delphi引入了一些新特征。Docking 就是其中的一项,有人将Docking译为对接、入坞、结合等,也可以译为“窗口融合技术”。那么什么是窗口融合技术呢?窗口融合是一项先进的界面设计技术,体现了当今的发展趋势。Word97的浮动工具栏就是一种窗口融合技术,有时也称为Word97风格的浮动工具栏。下面针对目前比较流行的窗口与窗口的融合例程来进行:
  经过笔者一段时间的使用,发现Panel控件最适合作两个窗口融合的工具。由于这是最一般的情况,所以这里举一个具有代表性的例子详细说明。我们要达到的要求是:程序运行后,出现主窗口,按一个按钮,出现另一个窗口,拖动此窗口,与主窗口融合在一起,融合后主窗口的Caption变成两个窗口的Caption相加。在主窗口form1中放置两个Panel控件(panel1和panel2),一个Button控件(button1);另一个窗口form2为空白窗口。具体属性设置如下:

  panel1:
  align:alleft;
  docksite:true;
  usedockmanager:true;
  panel2:
  align:albottom;
  docksite:true;
  usemanager:true;
  form2:
  anchors:[aktop,akbottom,akleft,akright];
  dragmode:dmautomatic;
  dragkind:dkdock;
  设置button1的onclick事件,对应的代码如下:
  procedure TForm1.Button1Click(Sender: TObject);
  begin
  form2.Show;
  a:=form1.caption;
  b:=form2.caption;
  end;
  设置panel1和panel2的onundock事件,代码如下:
  procedure TForm1.Panel1UnDock(Sender: TObject; Client: TControl; NewTarget: TWinControl; var Allow: Boolean);

  begin
  form1.caption:=a;
  form1.Refresh;
  end;
  设置panel1和panel2的ondockdrop事件,代码如下:
  procedure TForm1.Panel1DockDrop(Sender:TObject; Source: TDragDockObject; X, Y: Integer);
  begin
  form1.Caption:=a+′,′+b;
  form1.Refresh;
  end;
  其中a,b为String型变量,用以保存窗口的最初标题,在form1的接口处声明。
 
to 41426277,
答非所问,PS及flash的工具面板可以停放吗?
 
toolwindow+stayontop+...
 
做得好也不容易啊.
只是设置几个属性?
 
后退
顶部