工具栏怎样做到不能被关闭?

kezhu 2003-09-11 11:42:31
想利用工具栏来做停靠(dock),但在被拖出来后有一个关闭图标,如何让他不出现?没有找到类似bordericon的属性,或者类似OnCloseQuery之类的事件可以取消关闭。
...全文
46 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
kezhu 2003-09-16
  • 打赏
  • 举报
回复
如果不行,给个说法,我就改成窗口实现了(虽然比较麻烦)。
kezhu 2003-09-15
  • 打赏
  • 举报
回复
ding
kezhu 2003-09-13
  • 打赏
  • 举报
回复
我的需求是这样的:
我的界面上作了一个缩略图和几个命令按钮,都是固定位置,但客户说布局不好,希望把这两个部分从主界面中分离出去,可以在界面上拖动,其中
工具条(即命令按钮)
一开始就浮动
可以停靠(包括上下左右,所以按钮需要根据位置重新排列,还要改变CoolBar的大小及界面其他部分的工作区大小,好像Word那样)
不能被关闭(不出现X或点它无效)
取消停靠时要恢复大小。
缩略图
可以被关闭
始终浮动
不能停靠
开始不出现
点击某按钮后出现再点一下消失(出现与否容易实现)。
它们都不能被用户随意改变大小,以上效果如果用独立窗口可以实现,但程序改动太大,能否用ToolBar代替窗口实现?

能否给些具体的想法?因为以前没做过类似的效果。
xuv2002 2003-09-12
  • 打赏
  • 举报
回复
或是这样
同样是OnEndDock事件
void __fastcall TForm1::ToolBar1EndDock(TObject *Sender, TObject *Target,
int X, int Y)
{
if(Target && Target!= this){
TCustomForm * form = (TCustomForm*) Target;
HMENU menu = GetSystemMenu(form->Handle,false); //得到窗口菜单句柄
EnableMenuItem (menu,SC_CLOSE, MF_BYCOMMAND|MF_DISABLED );
//将Close菜单Disable掉
}

不过这样用Alt+F4 可以关掉

^_^
}
xuv2002 2003-09-12
  • 打赏
  • 举报
回复
试试下面的方法
void __fastcall TForm1::ToolBar1EndDock(TObject *Sender, TObject *Target,
int X, int Y) //ToolBar的OnEndDock事件
{
if(Target && Target!= this){ //判断ToolBar Dock目标是否为本窗口
TForm * form = (TForm*)(Target);
form->OnCloseQuery = ToolParentClose;//给Dock目标OnCloseQuery事件赋值
}
}

void __fastcall TForm1::ToolParentClose(TObject *Sender,bool &CanClose)
{
CanClose = false;
}
xuv2002 2003-09-12
  • 打赏
  • 举报
回复
试试下面的方法
void __fastcall TForm1::ToolBar1EndDock(TObject *Sender, TObject *Target,
int X, int Y) //ToolBar的OnEndDock事件
{
if(Target && Target!= this){ //判断ToolBar Dock目标是否为本窗口
TForm * form = (TForm*)(Target);
form->OnCloseQuery = ToolParentClose;//给Dock目标OnCloseQuery事件赋值
}
}

void __fastcall TForm1::ToolParentClose(TObject *Sender,bool &CanClose)
{
CanClose = false;
}
kezhu 2003-09-12
  • 打赏
  • 举报
回复
ding
xuv2002 2003-09-12
  • 打赏
  • 举报
回复
ManualFloat 可能不响应OnEndDock事件了

假如是这样你在ManualFloat 之后判断一下ToolBar->Parent
其实跟上边的代码是一样的
kezhu 2003-09-12
  • 打赏
  • 举报
回复
谢谢,确实不出错了,但用了ManualFloat以后,禁止关闭就失效了,这是为什么?

还有就是toolbar上的按钮如何竖排?因为停靠的位置可能是窗口上下,也可能是左右,象Word那样。
xuv2002 2003-09-12
  • 打赏
  • 举报
回复
void __fastcall TForm1::ToolBar1EndDock(TObject *Sender, TObject *Target,
int X, int Y)
{
if(Target && Target!= this)//改成Target!=CoolBar1
//因为你的ToolBar只会停靠在CoolBar或是浮动起来
{
TForm * form = (TForm*)(Target);
form->OnCloseQuery = ToolParentClose; }
}


kezhu 2003-09-12
  • 打赏
  • 举报
回复
加了form->BorderStyle=bsDialog;一停靠就报错了,哎.....
kezhu 2003-09-12
  • 打赏
  • 举报
回复
让用户无法改变该ToolBar的宽度及高度好像已经找到了,接着写
form->BorderStyle=bsDialog;就可以了。
kezhu 2003-09-12
  • 打赏
  • 举报
回复
新建的工程,一个CoolBar和一个ToolBar,ToolBar上有两个按钮,CoolBar的DockSite=true,ToolBar的DragKind=dkDock,DragMode=dmAutomatic,只有两个函数,
void __fastcall TForm1::ToolBar1EndDock(TObject *Sender, TObject *Target,
int X, int Y)
{
if(Target && Target!= this)
{
TForm * form = (TForm*)(Target);
form->OnCloseQuery = ToolParentClose; }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ToolParentClose(TObject *Sender, bool &CanClose)
{
CanClose=false;
}
//---------------------------------------------------------------------------
.h文件中加了对ToolParentClose函数的声明,就这些了。

一开始就浮动可以了,谢谢,还有就是如何让用户无法改变该ToolBar的宽度及高度?就像Photoshop的工具栏那样。
xuv2002 2003-09-12
  • 打赏
  • 举报
回复
我试了,没有出错

不知道是不是CloseQuery的缘故
因为ToolBar浮动Dock出来,它的Target类型为TToolDockForm
这里有个强制转换,我不清楚是不是因为这个缘故
可能的话,把相关代码贴出来看看

一开始就浮动

ToolBar->ManualFloat(Rect); // Rect 就是ToolBar要dock的矩形区域
kezhu 2003-09-12
  • 打赏
  • 举报
回复
谢谢,用你的第一种方法可以,但form这个变量是否应该释放?因为在我将ToolBar1停靠到CoolBar1上,再拖出来,然后关闭整个窗口,结果在Forms.hpp的析构函数处报错。

还有就是如何让ToolBar1一开始就是悬浮状态(即出现标题栏),而不是停靠在窗口某处?给用户的感觉就是独立窗口。
tengxueqi 2003-09-11
  • 打赏
  • 举报
回复
想利用工具栏来做停靠(dock),但在被拖出来后有一个关闭图标,如何让他不出现?没有找到类似bordericon的属性,或者类似OnCloseQuery之类的事件可以取消关闭。

13,822

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧