用c++ builder 创建具有吸附效果的窗口

上传人:wt****50 文档编号:36327478 上传时间:2018-03-27 格式:DOC 页数:6 大小:52.50KB
返回 下载 相关 举报
用c++ builder 创建具有吸附效果的窗口_第1页
第1页 / 共6页
用c++ builder 创建具有吸附效果的窗口_第2页
第2页 / 共6页
用c++ builder 创建具有吸附效果的窗口_第3页
第3页 / 共6页
用c++ builder 创建具有吸附效果的窗口_第4页
第4页 / 共6页
用c++ builder 创建具有吸附效果的窗口_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《用c++ builder 创建具有吸附效果的窗口》由会员分享,可在线阅读,更多相关《用c++ builder 创建具有吸附效果的窗口(6页珍藏版)》请在金锄头文库上搜索。

1、用 c+ builder 创建具有吸附效果的窗口在许多程序中,窗口可以被拖放到另一个窗口中,并溶合为一体,例如 c+ builder 中 的 Class Explorer 与其它窗口就是典型一例,在 c+ builder 中,这种特性被称为“窗口吸附 “。在 bcb 中的许多组件都具有与“吸附“功能相关的属性,例如:DockSite 属性、 UseDockManage 属性,以及 DragKing 属性,它的属性可以设置为 dkDock。如果将这些属 性值简单设置一下,窗口将自动具有吸附功能,不过这样的吸附功能非常死板,没有实用 价值。下面笔者就给大家介绍一下如何在 c+ builder 中实

2、现真正的窗口吸附效果。一、设计一个主窗口新建一工程,主窗体命名为 MainForm,单元文件命名为 Main。添加一个 TMainMenu 命名为 MainMenu1,双击该主菜单添加两个子菜单分别为“红色窗口“和“蓝色窗口“,这两 个子菜单分别用来显示不同颜色的窗口。接着在窗口的最右端添加一个宽度为 0,高度为 整个窗口高的 Panel 组件并命名为 DockPanel,建立 Panel 组件是因为被“吸附“的窗口必须 要有一个“吸附区“,这种吸附区可以是窗口,也可以是窗口化组件,如 Panel。再在 Panel 右边添加一个 Splliter 组件,命名为 VSplliter 宽度设为 4

3、,高度为窗体的高度。建立 Splliter 组件是为了有效地建立被吸附窗口的间隔区,并且可以方便用户调整被吸附窗口所 占据的宽度。 (如图 1 所示)二、设计“被吸附“窗口作为主窗口的设计窗体,除了一般的属性设置外,有关 Dock 的属性均无需修改,只 要将“被吸附“窗体的属性进行修改就可以了。选择“File | New Form“命令,建立一个新窗体,将新窗体命令为 DockWindow 和吸附功 能相关的属性修改如下:属性 值 DockSite True DockKind dkDock DockMode dmAutomatic 在窗体中放置一个 Memo 组件,并将其 Align 属性修改

4、为 alClient,使其充满整个窗口区域。 放置 Memo 组件的目的是使窗口在被吸附时有明显的边界特征,并且可以赋予窗口不同颜 色。 三、设计实现“吸附“功能 实际上,产生吸附作用的并不是主窗体,而是主窗体中的 Panel 组件,所以 Panel 组件中与 吸附功能有关的组件也必须和吸附窗口一样进行修改,修改值如上表所示。接着为 Panel 添加如下事件:OnDockOver、OnGetSiteinfo、OnDockDrop、OnUndock 代码与解释如下: /-void _fastcall TMainWin:ockPanelDockOver(TObject *Sender,TDragD

5、ockObject *Source, int X, int Y, TDragState State,bool / (1) if (Accept) / (2) Windows:TPoint TopLeft = DockPanel-ClientToScreen(Point(0, 0); / (3) Windows:TPoint BottomRight = DockPanel-ClientToScreen(Point(this-ClientWidth / 3, DockPanel-Height); / (4) Source-DockRect = Windows:TRect(TopLeft, Bott

6、omRight); (5) /- 解释:OnDockOver 事件是在被吸附窗口拖动经过吸附面板时产生的,也就是说,当用户 拖动被吸附窗口经过 DockPanel 组件时,就会产生这个事件。第(1)句作用是首先将句柄接 受的参数 Source-Control(代表吸附窗口)强制转换为 TDockableForm 类型(可吸附窗体) ; 然后判断强制转换是否成功或者 Source 中是否包含可吸附对象;最后将判断结果保存到 Accept 变量中。第(2)句的作用是如果上述转换成功后,才可设置吸附区域的虚框。第 (3)(4)句用来设置要显示的吸附区域,其中使用了 Panel 组件的 Client

7、To Screen 方法, 该方法可将面板从标系下的点转换为目前屏幕坐标系中的点。 (5)句是将上面设置的区域 指定给被吸附的对象。 /-void _fastcall TMainWin:ockPanelGetSiteInfo(TObject *Sender,TControl *DockClient, TRect /- 解释:当一个吸附组件的 DockSite 属性为 True 时,OnGetSiteInfo 事件将在 OnDockDrop 事件之前产生,其中的代码可以用被吸附对象进行一些初始化。 /-void _fastcall TMainWin:ockPanelDockDrop(TObjec

8、t *Sender,TDragDockObject *Source, int X, int Y) TPanel* SenderPanel = dynamic_cast(Sender);/将调用该方法的对象强制转换为 TPanel 类型组件 if (SenderPanel = NULL) /判断上句的转换是否成功,若不成功则给出一个提示 throw EInvalidCast(“); if (SenderPanel-DockClientCount = 1)/判断是否包含被吸附窗口,如果存在,那么调用 ShowPanel 重新显示 Panel 组件 ShowPanel(SenderPanel, tr

9、ue, NULL); SenderPanel-DockManager-ResetBounds(true);/重新画被吸附窗口 /- 解释:OnDockDrop 事件是在被吸附窗口吸附到面板上之后产生的事件,吸附之后,程序 应该调用后面定义的 ShowPanel 函数,使 Panel 组件按照新的大小显示出来(包含被吸附 窗口) ,然后利用它的 DockManager 重画被吸附的窗口。 /-void _fastcall TMainWin:ockPanelUnDock(TObject *Sender,TControl *Client, TWinControl *NewTarget, bool i

10、f (SenderPanel = NULL) throw EInvalidCast(“); if (SenderPanel-DockClientCount = 1) / 确保当前吸附面板中包含了被吸附对象,然后调 用 ShowPanel 方法“解放“它 ShowPanel(SenderPanel, false, NULL); /- OnUndock 事件是在吸附对象被“解放“之前被调用的,所以这里可以为用户提供一个不“解 放“吸附对象的机会。 接下来自定义一个函数 ShowPanel()用来控制吸附对象 其中:各参数说明:APanel-吸附面板对象,MakeVisible-面板可见标志,Cli

11、ent-重新显示 面板时要显示的吸附对象。 /- void TMainWin:ShowPanel(TPanel* APanel, bool MakeVisible, TControl* Client) if (!MakeVisible if (APanel = DockPanel)/判断如果调用函数时得到的 Panel 对象是吸附面板,则将 Splliter 组件的可见性与 Panel 对象保持一致VSplitter-Visible = MakeVisible;if (MakeVisible)/在吸附面板可见的情况下,将面板的宽度设为窗口客户区的 1/3,并同时将 Splliter 移动到面板

12、的右边APanel-Width = ClientWidth / 3;VSplitter-Left = APanel-Width + VSplitter-Width;elseAPanel-Width = 0;/面板不可见时,维护面板宽度为 0if (MakeVisible /显示被吸附对象,并且要确保面板可见 /- 下面的工作就是实现菜单命令的功能,“红色窗口“命令生成红色窗口,“兰色窗口“命令生成兰色窗口,“关闭“命令关闭整个程序。下面只给出动态生成红色窗口的事件句柄如下: (兰色窗口跟这个代码类似,这里省略) /- /“红色窗口“命令的 OnClick 事件句柄: void _fastcall TMainWin:CMredwindowClick(TObject *Sender) TDockableForm *redform=new TDockableForm(this);redform-Memo1-Color=clRed; /要实现兰色窗口的动态生成,将上句改为 redform-Memo1-Color=clBlue;redform-Show(); 接下来在被吸附窗口 DockWindow 的 OnClose 事件添加如下代码: /- void _fastcall TDockabl

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号