




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、用c+ builder创建具有吸附效果的窗口在许多程序中,窗口可以被拖放到另一个窗口中,并溶合为一体,例如c+ builder中的Class Explorer与其它窗口就是典型一例,在c+ builder中,这种特性被称为"窗口吸附”。在bcb中的许多组件都具有与"吸附”功能相关的属性,例如: DockSite属性、UseDockManage属性,以及 DragKing属性,它的属性可以设置为dkDock。如果将这些属性值简单设置一下,窗口将自动具有吸附功能,不过这样的吸附功能非常死板,没有实用价值。下面笔者就给大家介绍一下如何在c+ builder中实现真正的窗口吸附效果
2、。一、设计一个主窗口新建一工程,主窗体命名为MainForm,单元文件命名为 Main。添加一个 TMainMenu命名为MainMenu1 ,双击该主菜单添加两个子菜单分别为"红色窗口 "和"蓝色窗口 ”,这两个子菜单分别用来显示不同颜色的窗口。接着在窗口的最右端添加一个宽度为0,高度为整个窗口高的Pane l组件并命名为 DockPanel,建立Panel组件是因为被”吸附”的窗口必须要有一 个”吸附区”,这种吸附区可以是窗口,也可以是窗口化组件,如Panel。再在Panel右边添加一个Splliter组件,命名为 VSplliter宽度设为4,高度为窗体的高
3、度。建立 Splliter组件是为 了有效地建立被吸附窗口的间隔区,并且可以方便用户调整被吸附窗口所占据的宽度。(如图1所示)二、设计”被吸附”窗口作为主窗口的设计窗体,除了一般的属性设置外,有关Dock的属性均无需修改,只要将”被吸附”窗体的属性进行修改就可以了。选择"File | New Form"命令,建立一个新窗体,将新窗体命令为DockWindow 和吸附功能相关的属性修改如下:DockSiteDockKindDockMode在窗体中放置一个属性TruedkDockdmAutomaticMem。组件,并将其Align属性修改为alClient ,使其充满整个窗口区
4、域。放置Memo组件的目的是使窗口在被吸附时有明显的边界特征,并且可以赋予窗口不同颜色。三、设计实现"吸附”功能实际上,产生吸附作用的并不是主窗体,而是主窗体中的Panel组件,所以Panel组件中与吸附功能有关的组件也必须和吸附窗口一样进行修改,修改值如上表所示。接着为Panel添加如下事件:OnDockOver、OnGetSiteinfo、OnDockDrop、OnUndock 代码与解释如下:/ void _fastcall TMainWin: - ockPanelDockOver(TObject *Sender,TDragDockObject *Source, int X,
5、int Y, TDragState State,bool &Accept)(Accept = (dynamic_cast<TDockableForm*>(Source->Control) != NULL); / (1) if (Accept)/ (2)( Windows:TPoint TopLeft = DockPanel->ClientToScreen(Point(0, 0);/ (3)Windows:TPoint BottomRight = DockPanel->ClientToScreen(Point(this->ClientWidth / 3
6、, DockPanel->Height); / (4) Source->DockRect = Windows:TRect(TopLeft, BottomRight); (5) /解释:OnDockOver事件是在被吸附窗口拖动经过吸附面板时产生的,也就是说,当用户拖 动被吸附窗口经过 DockPanel组件时,就会产生这个事件。第(1)句作用是首先将句柄接受的参数Source->Control(代表吸附窗口) 强制转换为TDockableForm类型(可吸附窗体);然 后判断强制转换是否成功或者Source中是否包含可吸附对象;最后将判断结果保存到 Accept变量中。第(2
7、)句的作用是如果上述转换成功后,才可设置吸附区域的虚框。第(3) (4)句用来设置要显示的吸附区域,其中使用了 Panel组件的Client To Screen方法,该方法可将面板从标系下的点转换为目前屏幕坐标系中的点。(5)句是将上面设置的区域指定给被吸附的对象。 /void _fastcall TMainWin: - ' ockPanelGetSiteInfo(TObject *Sender,TControl *DockClient,TRect &InfluenceRect, TPoint &MousePos,bool &CanDock) (CanDock
8、= (dynamic_cast<TDockableForm*>(DockClient) != NULL);/解释:当一个吸附组件的DockSite属性为True时,OnGetSiteInfo事件将在 OnDockDrop事件之前产生,其中的代码可以用被吸附对象进行一些初始化。 /4'1 void _fastcall TMainWin: - ockPanelDockDrop(TObject *Sender,TDragDockObject *Source,int X, int Y)(TPanel* SenderPanel = dynamic_cast<TPanel*>
9、;(Sender);/ 将调用该方法的对象强制转换为 TPanel类型组件if (SenderPanel = NULL) /判断上句的转换是否成功,若不成功则给出一个提示 throw EInvalidCast("");if (SenderPanel->DockClientCount = 1)/判断是否包含被吸附窗口,如果存在,那么调用 ShowPanel重新显示Panel组件 ShowPanel(SenderPanel, true, NULL);SenderPanel->DockManager->ResetBounds(true);/ 重新画被吸附窗口 /
10、解释:OnDockDrop事件是在被吸附窗口吸附到面板上之后产生的事件,吸附之后,程序应该调用后面定义的 ShowPanel函数,使Panel组件按照新的大小显示出来 (包含被吸附窗口), 然后利用它的DockManager重画被吸附的窗口。/void _fastcall TMainWin:WockPanelUnDock(TObject *Sender,TControl *ClientTWinControl*NewTarget, bool &Allow)TPanel* SenderPanel = dynamic_cast<TPanel*>(Sender);if (Sende
11、rPanel = NULL)throw EInvalidCast("");if (SenderPanel->DockClientCount = 1) /确保当前吸附面板中包含了被吸附对象,然后调用ShowPanel方法”解放”它ShowPanel(SenderPanel, false, NULL);/OnUndock事件是在吸附对象被"解放”之前被调用的,所以这里可以为用户提供一个不 "解放 ”吸附对象的机会。接下来自定义一个函数ShowPanel()用来控制吸附对象其中:各参数说明:APanel-吸附面板对象, MakeVisible-面板可见标
12、志,Client-重新显示面板时要显示的吸附对象。/void TMainWin:ShowPanel(TPanel* APanel, bool MakeVisible, TControl* Client)if (!MakeVisible && (APanel->VisibleDockClientCount > 1)/判断如果面板不可见, 并且其中包含一个以上的被吸附对象,则直接返回return;if (APanel = DockPanel)/判断如果调用函数时得到的Panel对象是吸附面板,则将 Splliter组件的可见性与 Panel对象保持一致VSplitter
13、->Visible = MakeVisible;if (MakeVisible)/在吸附面板可见的情况下,将面板的宽度设为窗口客户区的1/3,并同时将Splliter移动到面板的右边APanel->Width = ClientWidth / 3;VSplitter->Left = APanel->Width + VSplitter->Width;elseAPanel->Width = 0;/面板不可见时,维护面板宽度为0if (MakeVisible && (Client != NULL)Client->Show();/显示被吸附对象,
14、并且要确保面板可见/下面的工作就是实现菜单命令的功能,”红色窗口 ”命令生成红色窗口,"兰色窗口 ”命令生成兰色窗口,"关闭”命令关闭整个程序。下面只给出动态生成红色窗口的事件句柄如下:(兰 色窗口跟这个代码类似,这里省略)/”红色窗口 ”命令的OnClick事件句柄:void _fastcall TMainWin:CMredwindowClick(TObject *Sender)(TDockableForm *redform=new TDockableForm(this);redform->Memo1->Color=clRed;要实现兰色窗口的动态生成,将上句
15、改为redform->Memo1->Color=clBlue;redform->Show();接下来在被吸附窗口DockWindow的OnClose事件添加如下代码:/void _fastcall TDockableForm:FormClose(TObject *Sender,TCloseAction &Action)(if (dynamic_cast<TPanel*>(HostDockSite) != NULL)MainWin->ShowPanel(static_cast<TPanel*>(HostDockSite), false, N
16、ULL);Action = caHide;接下来在被吸附窗口DockWindow的OnDockOver事件中添加如下代码:/void _fastcall TDockableForm:FormDockOver(TObject *Sender,TDragDockObject *Source, int X, int Y , TDragState State,bool &Accept)(TRect ARect;Accept = (dynamic_cast<TDockableForm*>(Source->Control) != NULL);/ Draw dock preview
17、 depending on where the cursor is relative to our client areaif (Accept && (ComputerDockAlign(ARect, Point(X, Y) != alNone) Source->DockRect = ARect;/接下来在被吸附窗口DockWindow的OnDockAlign事件中添加如下代码:TAlign TDockableForm:ComputerDockAlign(TRect & DockRect, const TPoint & MousePos) (Windows
18、:TRect DockTopRect,DockLeftRect,DockBottomRect,DockRightRect,DockCenterRect;Windows:TPoint TopLeft,BottomRight;TAlign Result = alNone;/ Divide form up into docking "Zones"TopLeft = Windows:TPoint(0, 0);BottomRight = Windows:TPoint(ClientWidth / 5, ClientHeight);DockLeftRect = Windows:TRect
19、(TopLeft, BottomRight);TopLeft = Windows:TPoint(ClientWidth / 5, 0);BottomRight = Windows:TPoint(ClientWidth / 5 * 4, ClientHeight / 5);DockTopRect = Windows:TRect(TopLeft, BottomRight);TopLeft = Windows:TPoint(ClientWidth / 5 * 4, 0);BottomRight = Windows:TPoint(ClientWidth, ClientHeight);DockRight
20、Rect = Windows:TRect(TopLeft, BottomRight);TopLeft = Windows:TPoint(ClientWidth / 5, ClientHeight / 5 * 4);BottomRight = Windows:TPoint(ClientWidth / 5 * 4, ClientHeight);DockBottomRect = Windows:TRect(TopLeft, BottomRight);TopLeft = Windows:TPoint(ClientWidth / 5, ClientHeight / 5);BottomRight = Wi
21、ndows:TPoint(ClientWidth / 5 * 4, ClientHeight / 5 * 4);DockCenterRect = Windows:TRect(TopLeft, BottomRight);/ Find out where the mouse cursor is,/ to decide where to draw dock preview.if (PtInRect(&DockLeftRect, MousePos)(Result = alLeft;DockRect = DockLeftRect;DockRect.Right = ClientWidth / 2;elseif (PtInRect(&DockTopRect, MousePos)(Result = alTop;DockRect = DockTopRect;DockRect.Left = 0;DockRect.Right = ClientWidth;DockRect.Bottom = ClientHeight / 2;elseif (PtInRect(&DockRightRect, Mo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度私人珠宝抵押典当贷款协议
- 2025年度新能源材料研究院校企合作协议书
- 二零二五年度商铺租赁合同终止及商业设施维护协议
- 2025年度电力系统调试电力工程劳务承建合同
- 2025年度火锅加盟店加盟费及利润分配合同
- 二零二五年度变压器运输保险与安全协议
- 二零二五年度租赁房屋提前解除合同
- 二零二五年度科研机构员工劳务派遣合作协议
- 2025年度生物制品简易供货合同
- 二零二五年度项目经理聘用协议(航空航天领域项目管理)
- 《钠离子电池产业发展白皮书》
- 油气田开发专业危害因素辨识与风险防控
- 假肢安装合同范本
- DB37-T4824-2025 乡镇(街道)应急物资配备指南
- 教育部人文社科 申请书
- 无菌手术台铺置的细节管理
- 《重大基础设施项目涉及风景名胜区选址论证报告编制技术规范》编制说明
- 议论文8(试题+审题+范文+点评+素材)-2025年高考语文写作复习
- 2025年中国中煤能源股份有限公司招聘笔试参考题库含答案解析
- 2025-2030年(全新版)中国软冰淇淋市场发展趋势与投资战略研究报告
- 2024年苏州健雄职业技术学院高职单招语文历年参考题库含答案解析
评论
0/150
提交评论