关于浮动工具条的关闭问题?(50分)

  • 主题发起人 主题发起人 youhard
  • 开始时间 开始时间
Y

youhard

Unregistered / Unconfirmed
GUEST, unregistred user!
将ToolBar放在ControlBar中,能做出类似Office97风格的浮动工具栏和菜单,在运行
时将ToolBar从ControlBar中拖出后,ToolBar的标题栏上有一个很小的关闭按钮,如果按
下就会关闭ToolBar,我不想让用户关闭这个ToolBar,能不能在不让这个关闭按钮显示出
来,各位大虾,有何高见,请不吝赐教?
 
在ToolBar的EndDock事件里——
procedure TForm1.ToolBar1EndDock(Sender, Target: TObject; X, Y: Integer);
var
H: THandle;
begin
H := GetParent(ToolBar1.Handle);//ToolBar在拖出来之后被“套进”另一个窗口里了
if H <> ControlBar1.Handle then begin//以下的操作都是针对这个临时的父窗口的
SetWindowLong(H, GWL_STYLE, GetWindowLong(H, GWL_STYLE) and not WS_SYSMENU);//把它的关闭按钮去掉
ShowWindow(H, SW_HIDE);//这两句是为了让它刷新,使关闭按钮马上消失
ShowWindow(H, SW_SHOW);//如果没有这两句,必须移动一下或者调整一下大小才行
end;
end;
 
dq兄:
按照您所说的去做,我已经顺利的解决了这个问题,只是有一个小小的遗憾,当工具条
被拖出来,鼠标左键松开后,关闭按钮还是闪现了一下,如何避免这种情况?还请大虾继续
指点!
 
是吗?我测试的时候倒没看到闪烁:),所以不知道和什么有关。
要不试试手动地移动一下父窗口——
procedure TForm1.ToolBar1EndDock(Sender, Target: TObject; X, Y: Integer);
var
H: THandle;
R: TRect;//记录父窗口的位置大小信息
begin
H := GetParent(ToolBar1.Handle);
if H <> ControlBar1.Handle then begin
SetWindowLong(H, GWL_STYLE, GetWindowLong(H, GWL_STYLE) and not WS_SYSMENU);
GetWindowRect(H, R);//主要是为了取得当前的位置
SetWindowPos(H, 0, R.Left, R.Top - 1, 0, 0, SWP_NOSIZE);//往上移动一个像素(用户感觉不出来的:)
end;
end;
 
不需要winapi

toolbar1.FloatingDockSiteClass:=TForm2;
Form2 设置相应的没有按钮,最上面的属性即可。
 
To soul兄:
你说的方法好象不行,关闭按钮依然存在。而且,当用鼠标拖动时,工具条有时条会
莫名奇妙的消失!
dq兄的方法是可行的,我试了第二种方法,但鼠标左键放下一瞬间,还是看到关闭
按钮闪现了一下(然后消失),跟第一种方法现象是一样的,我可能是有些吹毛求疵,
想尽善尽美!^_*
 
to youhard:
soul兄的方法是可行的,只是他没说那么详细:)——
你New一个Form(如Form2),
1. 把它的BorderStyle设为bsSizeToolWin;
2. BorderIcons里的biSystemMenu设为False(去掉关闭按钮);
3. DragKind设为dkDock(跟ToolBar一样)。
然后在Form1的OnCreate里写上:ToolBar1.FloatingDockSiteClass := TForm2;
在ToolBar的OnEndDock里只需这么一句:ToolBar1.HostDockSite.Show;//显示浮动窗口
就OK了!
 
Form2 设置相应的没有按钮,最上面的属性即可!!!!
你设置了属性没有?我测试过在告诉你的。
而且拖动时非但不会消失,而且大小和form一样不原来的还舒服。而且这个拖出来的
form你时可以定制的。对了,别忘了autosize=True
是的是的,还有dock的一些属性。呵呵。
 
忘了一点!
4.Form2的FormStyle要设为fsStayOnTop。
——你可以参考一下TToolDockForm和TCustomDockForm的源码。
实际上ToolBar在浮动的时候的临时父窗口就是一个TToolDockForm。
 
不对不能设置form2的dock属性
 
仔细看了看,以前疏忽了不少东西;
正确的做法是:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
toolwin;
type
TForm2 = class(TToolDockForm) //必须的,否则会有很多bug
private
{ Private declarations }
protected
//把菜单消去
procedure CreateParams(var Params: TCreateParams); override;
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
{$R *.DFM}
{ TForm2 }
procedure TForm2.CreateParams(var Params: TCreateParams);
begin
inherited;
with Params do
Style := Style and (not WS_SYSMENU);
end;
end.
 
感谢二位的热情指导,这个问题我终于完全解决了,Soul兄的方法完全可行。

 
接受答案了.
 
后退
顶部