Delphi高级停靠(Dock)技术的实现
- 格式:doc
- 大小:239.00 KB
- 文档页数:26
Dorado7 组件详解上海锐道信息技术有限公司 2012 年 6 月1.【Button】按钮 ............................................................................................................................. 8 1.1. 1.2. 1.3. 1.4. 1.5. 1.6. 1.7. 1.8. 【Button】普通按钮 ........................................................................................................ 8 【Button】含图标的按钮 ................................................................................................ 9 【Button】有系统提示的按钮 ...................................................................................... 11 【Button】绑定菜单的按钮 .......................................................................................... 12 【Button】被禁用的按钮 .............................................................................................. 14 【Button】带 Ajax 功能的按钮 .................................................................................... 15 【Button】简单按钮 ...................................................................................................... 18 【Button】简单图标按钮 .............................................................................................. 202.【CardBook】卡片盒 ................................................................................................................. 22 2.1. 【CardBook】卡片盒常规用法 ..................................................................................... 223.【DataPilot】数据导航条 .................................................................................................................. 25 3.1【DataPilot】数据导航条的常规用法 .................................................................................... 25 3.2【DataPilot】数据导航条显示增加,删除,取消按钮 ........................................................ 27 4.【Dialog】对话框 ............................................................................................................................... 28 4.1【Dialog】对话框常规用法 ..................................................................................................... 28 4.2【Dialog】对话框 Buttons 和 Toos ......................................................................................... 30 4.3【Dialog】对话框的模态和最大化 ......................................................................................... 31 5.【FieldSet】FieldSet ........................................................................................................................... 32 5.1【FieldSet】FieldSet 常规用法 ................................................................................................ 32 5.2【FiledSet】FiledSet 中 Buttons .............................................................................................. 35 6.【FloatContainer】浮动容器 ............................................................................................................. 36 6.1【FloatContainer】浮动容器常规用法 ................................................................................... 36 6.2【FloatContainer】浮动容器的模态和动画 ........................................................................... 37 7.【GroupBox】GroupBox ..................................................................................................................... 38 7.1【GroupBox】GroupBox 常规用法 ......................................................................................... 38 7.2【GroupBox】GroupBox 中 Buttons ........................................................................................ 40 8【IFrame】IFrame 组件 ...................................................................................................................... 41 8.1【IFrame】IFrame 组件常规用法 ........................................................................................... 41 9.【Panel】和【FloatPanel】面板容器和浮动面板容器 ................................................................... 43 9.1【Panel】和【FloatPanel】面板常规用法 ............................................................................. 43 9.2【Panel】、【FloatPanel】面板 Buttons 和 Tools ................................................................. 469.2.3 要点说明............................................................................................................................... 47 10.【ProgressBar】滚动条 .................................................................................................................... 49 10.1【ProgressBar】滚动条的静态效果 ..................................................................................... 49 10.2【ProgressBar】动态滚动条 ................................................................................................. 50 11.【Section】 .................................................................................................................................. 53 12.【Slider】滑动条 ............................................................................................................................ 53 12.1.【Slider】通过滑动条获得图片百分比 ............................................................................. 53 13.【SplitPanel】分割面板 ................................................................................................................. 55 13.1.【SplitPanel】与菜单结合 ................................................................................................. 55 14.【Tabbar】标签条 .......................................................................................................................... 57 14.1.【Tabbar】显示效果 .......................................................................................................... 57 14.2.【Tabbar】和【Tab】结合显示效果................................................................................ 58 15.【TabControl】标签页 ................................................................................................................... 60 15.1.【TabControl】和 IframeTab 结合 ................................................................................... 60 16.【Tip】提示信息控件 ..................................................................................................................... 62 16.1.【Tip】不同形态显示效果 ................................................................................................. 62 17.【ToolBar】工具栏......................................................................................................................... 64 17.1.【ToolBar】工具栏常见形态 ............................................................................................. 64 18.【Label】文本标签 ........................................................................................................................ 65 18.1.【Label】文本标签控件 ....................................................................................................... 65 19.【TextEditor】文本编辑器 .............................................................................................................. 68 19.1.【TextEditor】带 mapping 的文本编辑器 ........................................................................... 68 19.2.【TextEditor】使用 dataset 的文本编辑器 ......................................................................... 71 20.【TextArea】多行文本编辑器 ...................................................................................................... 74 20.1.【TextArea】多行文本编辑器控件 ..................................................................................... 74 21.【DataLabel】文本标签 ............................................................................................................... 75 21.1.【DataLabel】文本标签控件................................................................................................ 7522.【Link】超链接 ............................................................................................................................... 77 22.1.【Link】超链接 ..................................................................................................................... 77 23.【CheckBox】复选框 .................................................................................................................... 79 23.1.【CheckBox】复选框 ............................................................................................................ 79 24.【PasswordEditor】密码编辑器 ................................................................................................. 82 24.1.【PasswordEditor】密码编辑器 .......................................................................................... 82 25.【FormProfile】表单配置 ............................................................................................................ 85 25.1.【FormProfile】表单配置..................................................................................................... 85 26.【NumberSpinner】数字微调编辑器 ........................................................................................ 87 26.1.【NumberSpinner】数字微调编辑器 .................................................................................. 87 27.【DateTimeSpinner】日期时间微调编辑器 .............................................................................. 89 27.1.【DateTimeSpinner】日期时间微调编辑器 ........................................................................ 89 28.【CustomSpinner】自定义微调编辑器 ..................................................................................... 91 28.1.【CustomSpinner】自定义微调编辑器 ............................................................................... 91 29.【RadioGroup】单选框组............................................................................................................ 92 29.1.【RadioGroup】单选框组 .................................................................................................... 92 30.【FormElement】表单元素 ......................................................................................................... 95 30.1.【FormElement】表单元素 .................................................................................................. 95 31.【AutoForm】自动表单 ............................................................................................................... 97 31.1.【AutoForm】自动表单 ....................................................................................................... 97 32【Validator】校验器 ...................................................................................................................... 99 32.1【RepExpValidator】正则表达式校验器 ........................................................................ 99 32.2【CustomValidator】用户自定义数据校验器 .............................................................. 102 32.3【RangeValidator】数值区间校验器............................................................................. 103 32.4【LengthValidator】文本长度校验器 ........................................................................... 10533.【Menu】菜单 ............................................................................................................................. 106 33.1【Menu】的一般用法 ....................................................................................................... 106 33.2【Menu】右击显示 ........................................................................................................... 108 34.【Trigger】触发 ........................................................................................................................... 110 34.1【Trigger】的一般用法 .................................................................................................... 110 35. 【ListDropDown】列表型下拉框 .................................................................................. 111 35.1. 35.2. 36. 【ListDropDown】的一般用法 .............................................................................. 111 【ListDropDown】的自定义功能 .......................................................................... 113【YearMonthDropDown】年月下拉框 .............................................................................. 115 36.1. 【YearMonthDropDown】的用法 ....................................................................... 11537.【DateDropDown】日期下拉框 .................................................................................... 116 37.1. 【DateDropDown】的用法 ................................................................................... 11738.【DataSetDropDown】数据绑定下拉框 ...................................................................... 119 38.1. 【DataSetDropDown】的用法 ............................................................................. 11939.【CustomDropDown】自定义下拉框 .......................................................................... 122 39.1. 【CustomDropDown】的用法.............................................................................. 12240.【AutoMappingDropDown】属性下拉框 .................................................................. 125 40.1. 【AutoMappingDropDown】的用法 .................................................................. 12541【PageBanner】页面标签........................................................................................................... 128 41.1【PageBanner】页面标签的一般用法 ........................................................................... 128 42.【BlockView】块状列表控件 ........................................................................................................ 130 42.1.【BlockView】块状列表控件 ............................................................................................. 130 43.【DataBlockView】支持数据绑定的列表控件 ............................................................................. 133 43.1.【DataBlockView】支持 Dataset 的数据绑定列表 ........................................................... 13344.【ListBox】下拉列表控件 ........................................................................................................... 135 44.1.【ListBox】静态数据下拉列表框 ...................................................................................... 135 44.2.【ListBox】动态数据列表控件 .......................................................................................... 137 45.【DataListBox】支持数据绑定的列表控件 .............................................................................. 139 45.1.【DataListBox】支持数据绑定的列表控件 ....................................................................... 139 46.【Grid】表格控件 ........................................................................................................................ 141 46.1.【Grid】普通表格控件 ....................................................................................................... 141 47.【DataGrid】数据表格控件 ....................................................................................................... 144 47.1.【DataGrid】数据表格控件 ............................................................................................... 144 48.【TreeGrid】树状表格 ................................................................................................................ 146 48.1.【TreeGrid】树状表格 ....................................................................................................... 146 49.【Tree】树状列表 ........................................................................................................................ 155 49.1.【Tree】树状列表 .............................................................................................................. 155 50.【DataTree】支持数据绑定的树状列表 ................................................................................... 157 50.1.【Tree】支持数据绑定的树状列表 ................................................................................... 157 51.【DataTreeGrid】支持数据绑定的树状表格控件 ................................................................... 160 51.1.【DataTreeGrid】支持数据绑定的树状表格控件 ............................................................ 160 52.【ButtonPanel】按钮面板 ......................................................................................................... 162 52.1.【ButtonPanel】按钮面板.................................................................................................. 162 52. 【QuickForm】 ................................................................................................................ 166 52.1. 52.2. 53. 【QuickForm】的一般用法 .................................................................................... 166 【QuickForm】不 DataSet 绑定使用 ................................................................... 169【DataType】数据类型 ................................................................................................... 171 53.1. 53.2. 【DataType】递归数据树的建立 ........................................................................... 171 【DataSet】数据类型主从表显示 .......................................................................... 17854.【DataSet】数据集 .......................................................................................................... 180 54.1. 【DataSet】数据集与 DataSetDropDown 组合使用 .............................................. 18054.2. 54.3.【DataSet】数据集与 DataSetDropDown 组合使用 .............................................. 183 【DataSet】数据集实现数据查询功能 .................................................................. 18656.【DatePicker】日期选择控件 .................................................................................................... 189 56.1.【DatePicker】日期选择控件 ............................................................................................ 189 57.【YearMonthPicker】年月选择控件 ........................................................................................ 192 57.1.【YearMonthPicker】年月选择控件 .................................................................................. 192 58.【SubViewHolder】子视图的控件 ........................................................................................... 195 58.1.【SubViewHolder】子视图的控件 ..................................................................................... 195 59.【Accordion】Outlook Bar 效果的布局组件 ......................................................................... 197 59.1.【Accordion】Outlook Bar 效果的布局组件 ..................................................................... 197 60.【HtmlContainer】可完全通过 HTML/DHTML 自定义渲染方式的容器控件 .................... 199 60.1.【HtmlContainer】可完全通过 HTML/DHTML 自定义渲染方式的容器控件 ................. 199 42.2.【BlockView】动态数据块状列表控件并实现控件间的拖动 ......................................... 201 61.【Action】动作控件....................................................................................................................... 204 61.1【Action】动作控件的常规用法 ........................................................................................ 204 62.【AjaxAction】远程过程动作控件 ................................................................................................ 205 62.1【AjaxAction】远程过程动作控件常规用法 ...................................................................... 205 62.2【AjaxAction】远程动作控件带参数后台访问 .................................................................. 207 63.【FormSubmitAction】表单提交动作控件 ................................................................................... 209 63.1【FormSubmitAction】表单提交动作控件的常规用法 ..................................................... 209 63.2【FormSubmitAction】表单提交方式和页面打开方式 ..................................................... 212 64.【UpdateAction】提交动作控件 ................................................................................................... 214 64.1【UpdateAction】提交动作控件的常规用法..................................................................... 2141. 【Button】按钮1.1. 【Button】普通按钮1.1.1. 页面效果基本功能:打开这个页面的时候显示一个按钮,按钮单击可以出现一个"Hello World!" 的信息提示框。
DELPHIHOOK函数建立键盘鼠标动作记录与回放在Delphi中,可以通过使用Hook函数来建立键盘鼠标动作的记录与回放。
Hook函数可以拦截系统消息和事件,并允许我们在消息处理前或处理后执行自定义的代码。
首先,我们需要创建一个DLL来实现Hook函数。
在Delphi中,可以通过创建一个动态链接库项目来实现这一点。
在动态链接库项目中,我们将添加一个Hook函数来拦截键盘和鼠标事件。
在Hook函数中,我们可以使用Windows API来获取键盘和鼠标的状态,以及记录和回放这些动作。
以下是一个简单的示例代码,演示如何创建基本的键盘鼠标动作记录与回放的功能:```delphilibrary MouseKeyboardHook;usesSystem.SysUtils,System.Classes,Winapi.Windows;varFOutputFile: TextFile;function KeyboardHookProc(code: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;varkbHookStruct: PKBDLLHOOKSTRUCT;vkCode: Cardinal;beginif code >= 0 thenbeginkbHookStruct := PKBDLLHOOKSTRUCT(lParam);vkCode := kbHookStruct^.vkCode;//将键盘记录写入文件WriteLn(FOutputFile, 'Keyboard: ' + IntToStr(vkCode));end;// 继续传递消息给下一个HookResult := CallNextHookEx(0, code, wParam, lParam);end;function MouseHookProc(code: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;varmsHookStruct: PMOUSEHOOKSTRUCT;mouseMsg: Cardinal;pt: TPoint;beginif code >= 0 thenbeginmsHookStruct := PMOUSEHOOKSTRUCT(lParam);mouseMsg := msHookStruct^.mouseData;pt := msHookStruct^.pt;//将鼠标记录写入文件WriteLn(FOutputFile, 'Mouse: ' + IntToStr(mouseMsg) + ' X:' + IntToStr(pt.X) + ' Y:' + IntToStr(pt.Y));end;// 继续传递消息给下一个HookResult := CallNextHookEx(0, code, wParam, lParam);end;procedure StartRecording;beginAssignFile(FOutputFile, 'actions.log');Rewrite(FOutputFile);// 安装键盘Hook// 安装鼠标Hookend;procedure StopRecording;begin// 卸载键盘Hook// 卸载鼠标HookCloseFile(FOutputFile);end;exportsStartRecording,StopRecording;beginend.```在上述代码中,我们创建了两个Hook函数:KeyboardHookProc和MouseHookProc。
构建基于Chromium的应⽤程序chromium是google chrome浏览器所采⽤的内核,最开始由苹果的webkit发展⽽出,由于webkit在发展上存在分歧,⽽google希望在开发上有更⼤的⾃由度,2013年google决定⾃⼰开发webcore的分⽀,叫做Blink引擎,⽽后google以BSD伯克利许可开源,BSD许可限制较为宽松,很多浏览器都是基于chromium 开发的,⽐如,此后省略100字。
google在原有基础上做了进⼀步的精简优化,并开发出v8 javascript引擎,2010年google收购了webrtc技术随后开放了源代码,webrtc采⽤vp编码,兼容html5标准,同年google推出了chrome os云操作系统,浏览器的衍⽣产品。
废话不多说,检索⼀下Chromium Embedded Framework,简称cef,你可以在cefbuilds上看到当前chromium最新放出的版本,也可以在google code上下载到,⾥⾯包括浏览器的核⼼库和底层api,⽀持c和c++的编程语⾔,另外也有第三⽅的包括.net/mono、java、python、delphi等开源项⽬。
我们从google code下载win32的c++库,打开release⽂件夹。
这⾥⾯作个介绍:libcef.dll:cef核⼼库。
icudt.dll:编码格式库。
ffmpegsumo.dll:视频解码器,包含vp8 vp9编码库。
d3dcompiler_43.dll、d3dcompiler_46.dll、libEGL.dll、libGLESv2.dll这⼏个是3d图形的库,d3dcompiler_43.dll适⽤于xp,d3dcompiler_46适⽤于xp以上版本。
include⽂件夹⾥⾯是cef c++的头⽂件,可以去github下载.net调⽤的project,叫做cefsharp,提供了winform和wpf的完整demo。
[转]DockPanel用法2010-01-28 00:06:13| 分类:默认分类| 标签:|字号大中小订阅dockpanel中提供了几个可用的类, 重要的有两个, 一是DockPanel, 一是DockContent,DockPanel是从panel继承出来的, 用于提供可浮动的dock的子窗口进行浮动和dock的场所,DockContent是从form类中继承出来的, 用于提供可浮动的窗口基类. 就是说: DockContent对象可以在DockPanel对象中任意贴边, 浮动, TAB化等.WeiFenLuo.winFormsUI.Docking.dll的使用1.建立一个WinForm工程,默认生成了一个WinForm窗体Form1。
2.引用—>添加引用—>浏览—>weiFenLuo.winFormsUI.Docking.dll。
3.窗体属性IsMdiContainer设置为True。
4.工具箱—>右键—>选择项—>.net组件—>浏览—>weiFenLuo.winFormsUI.Docking.dll—>在工具箱出现dockPanel。
5.将dockPanel拖到窗体Form1上,设置Dock属性,我设置的是:Fill。
停靠窗体:1.新建一个WinForm窗体Form2。
2.在代码中修改窗体继承于DockContent。
public partial class Form2 : DockContent{Form1 form1;private DockPanel dp;public Form2(){InitializeComponent();}public Form2(Form1 fm1){form1 = fm1;dp = (DockPanel)form1.Controls["dockPanel1"];}}3.在主窗体Form1中显示停靠窗体。
ActiveBar 是一款设想用户界面必不可少的ActiveX 控件,如果你想让本人的程序变得更专业,就必须用它。
使用它能够制造出像Word 一样的个性化菜单、“自定义”对话框;像Outlook 的快速按钮栏;像CorelDRAW 的入坞式窗口;像Delphi 的控件选择页面。
并且使用十分简单,保存设想图和加载设想图都十分简单,只用几个方法既可。
SP3 中全面支持了XP 样式,能够在非XP 操做系统中实现XP 的介面。
这个控件能够用在VB5、VB6 和VC++ 上。
以下是在程序中使用的部分代码:Dim oTool As ToolacbToolBar.Bands.Add \"系统工程\"With acbToolBar.Bands(\"系统工程\")Set oTool = .Tools.Add(0, \"miProjLoad\")oTool.Caption = \"&ProjLoad\"oTool.SetPicture Index:=0, Picture:=LoadPicture( _App.Path & \"\\图标配置\\工具栏图标\\系统工程\\ProjLoad.ico\"), Color:=&HC0C0C0oTool.Width = 15oTool.ToolTipText = \"载入工程\"oTool.BeginGroup = TrueSet oTool = .Tools.Add(1, \"miProjSave\")oTool.Caption = \"&ProjSave\"oTool.SetPicture Index:=0, Picture:=LoadPicture( _App.Path & \"\\图标配置\\工具栏图标\\系统工程\\ProjSave.ico\"), Color:=&HC0C0C0oTool.Width = 15oTool.ToolTipText = \"保存工程\"Set oTool = .Tools.Add(2, \"miProjClose\")oTool.Caption = \"&ProjClose\"oTool.SetPicture Index:=0, Picture:=LoadPicture( _App.Path & \"\\图标配置\\工具栏图标\\系统工程\\ProjClose.ico\"), Color:=&HC0C0C0oTool.Width = 15oTool.ToolTipText = \"关闭工程\" ‘来源:/bc用Active Bar制作带图标菜单我不是一个编程高手,可也总喜欢编些程序,自从学习了对象化编程,自己编的程序也越来越象模象样。
VB创建停靠工具栏今天,我们将创建一个具有停靠功能的应用程序,程序运行后,可以选择停靠位置如左、右、填充等。
程序运行结果如图所示。
运行结果技术要点●Panel控件●Dock属性实现过程■新建项目打开Visual ,选择“新建项目”,在项目类型窗口中选择“Visual Basic项目”,在模板窗口中选择“Windows应用程序”,在名称域中输入“DockMan”,然后选择保存路径。
单击“确认”。
■添加控件向窗体上添加一个Panel控件,然后向Panel控件上放置一个Button控件,添加一个GroupBox控件,在GroupBox控件上放置六个RadioButton控件。
注意放置顺序。
先放Panel,GroupBox控件,然后再放置别的控件。
■设置属性切换到属性栏,对窗体上的控件设置属性,我们在表中仅列出主要的属性,详细的属性设置请见光盘。
窗体/控件的属性值■添加代码Imports SystemImports ponentModelImports System.DrawingImports System.Windows.FormsNamespace Microsoft.Samples.WinForms.VB.DockManPublic Class DockManInherits System.Windows.Forms.FormPrivate rdbSet As System.Windows.Forms.RadioButtonPublic Sub New()MyBase.New()DockMan = Me'This call is required by the Windows Forms Designer.InitializeComponent()'TODO: Add any initialization after the InitializeComponent() callrdbSet = rdbNoneApplyChanges()End SubPublic Overloads Overrides Sub Dispose()MyBase.Dispose()components.Dispose()End Sub<STAThread()> Shared Sub Main()System.Windows.Forms.Application.Run(New DockMan())End SubPrivate Sub ApplyChanges()'应用更改If rdbSet Is rdbNone ThenbtnDemo.Dock = System.Windows.Forms.DockStyle.NoneElseIf rdbSet Is rdbTop ThenbtnDemo.Dock = System.Windows.Forms.DockStyle.TopElseIf rdbSet Is rdbLeft ThenbtnDemo.Dock = System.Windows.Forms.DockStyle.LeftElseIf rdbSet Is rdbBottom ThenbtnDemo.Dock = System.Windows.Forms.DockStyle.BottomElseIf rdbSet Is rdbRight ThenbtnDemo.Dock = System.Windows.Forms.DockStyle.RightElse ' The default is: if (rdbSet is rbFill)btnDemo.Dock = System.Windows.Forms.DockStyle.FillEnd IfEnd SubPrivate components As ponentModel.IContainerPrivate Sub checkbox_Click(ByVal sender As System.Object, ByVal e AsSystem.EventArgs)ApplyChanges()End SubPrivate Sub radiobutton_Click(ByVal sender As Object, ByVal e As EventArgs) Handles rdbBottom.Click, rdbFill.Click, rdbLeft.Click, rdbRight.Click, rdbTop.Click,rdbNone.ClickrdbSet = CType(sender, RadioButton)ApplyChanges()End SubEnd ClassEnd Namespace■运行程序单击菜单“调试|启动”或单击图标运行程序。
用delphi编程,实现屏蔽Alt+F4正常在电脑关闭一个程序,都有这几种方法:点X,按Alt+F4,从关闭程序对话框中选结束任务,点标题栏中的关闭,点任务中的关闭。
那么,在delphi实际编程中,如何让程序无法被关闭,我们要做的,就是让X消失,Alr+F4失效,让程序从关闭程序和任务栏中消失,让标题栏上的菜单失效。
让X消失很简单,把Form的BorderIcons中所有属性都设为Fasle;让Alt+F4失效:把Form的KeyPreview设为True,然后响应OnKeyDown事件:procedure TForm1.FormKeyDown(Sender:TObject;var Key:Word; Shift:TShiftState);beginif(Key=VK_F4)and(ssAlt in shift)thenKey:=0;end;unit Unit1;interfaceusesWindows,Messages,SysUtils,Classes,Graphics,Controls, Forms,Dialogs,StdCtrls,Menus;typeTForm1=class(TForm)procedure FormCreate(Sender:TObject);procedure FormKeyDown(Sender:TObject;var Key:Word; Shift:TShiftState);private{Private declarations}public{Public declarations}end;varForm1:TForm1;function RegisterServiceProcess(dwProcessID,dwType: Integer):Integer;stdcall;external'KERNEL32.DLL';implementation{$R*.DFM}procedure TForm1.FormCreate(Sender:TObject);beginRegisterServiceProcess(GetCurrentProcessID,1);Form1.KeyPreview:=True;FormStyle:=fsStayOnTop;SetWindowLong(Application.Handle,GWL_EXSTYLE, WS_EX_TOOLWINDOW);end;procedure TForm1.FormKeyDown(Sender:TObject;var Key:Word; Shift:TShiftState);beginif(Key=VK_F4)and(ssAlt in shift)thenkey:=0;end;end.然后你的程序就可以无法关闭了。
dockpanel suite 二次开发
DockPanel Suite是一个托管在GitHub上的开源项目,用于WinForms,是一个简单、美观的界面组件,可以实现类似VS的窗口停靠、悬浮、自动隐藏等功能,同时能够保存窗体布局为XML文件,启动时加载XML配置文件还原布局。
如果需要对DockPanel Suite进行二次开发,可以参考以下步骤:
1. 了解DockPanel Suite的架构和编程接口,以便更好地理解其功能和设计。
2. 确定需要开发的功能,并规划好开发计划。
3. 编写代码,实现相应的功能。
可以使用DockPanel Suite提供的编程接口,也可以根据需要扩展或修改其代码。
4. 进行测试和调试,确保开发的功能符合预期。
5. 完成开发后,将代码集成到DockPanel Suite中,并发布为新的版本。
在进行二次开发时,需要注意遵循DockPanel Suite的许可证和开发规范,确保开发的代码符合要求。
同时,也需要考虑到代码的可维护性和可扩展性,以保证代码的质量和稳定性。
DevExpress 的 10 个使用技巧DevExpress 是非常主流的.NET 控件,目前全世界和中国都用很多用户使用,不过由 于是英文版,初次接触的同学可能会觉得困难,这里就总结 DevExpress 常见的 10 个使 用技巧。
1.TextEditor(barEditItem)取文本以下是代码片段: string editValue = barEditItem1.EditValue.ToString(); //错误, 返回 null string editValue = ((DevExpress.XtraEditors.TextEdit)barEditItem).EditValue.ToString(); //精确,返回文本框内容 DevExpress 使用技巧boBoxEdit(barEditItem)添加以下是代码片段: Item string item = "comboboxItem1"; ((DevExpress.XtraEditors.Repository.RepositoryItemComboBox)this.barEd itItem.Edit).Items.Add(item);boBoxEdit(barEditItem)取文本以下是代码片段: string itemValue = this.barEditItem.EditValue.ToString();4.Ribbon 控件以下是代码片段: //添加 Page DevExpress.XtraBars.Ribbon.RibbonPage ribbonPage = new RibbonPage(); ribbonControl.Pages.Add(ribbonPage); //添加 Group DevExpress.XtraBars.Ribbon.RibbonPageGroup ribbonPageGroup = new RibbonPageGroup(); ribbonPage.Groups.Add(ribbonPageGroup); //添加 Button DevExpress.XtraBars.BarButtonItem barButtonItem = new BarButtonItem(); ribbonPageGroup.ItemLinks.Add(barButtonItem); // 添加 barSubItem DevExpress.XtraBars.BarSubItem barSubItem = new BarSubItem(); ribbonPageGroup.ItemLinks.Add(barSubItem); //barSubItem 下添加 Button barSubItem.AddItem(barButtonItem); //奇 异的删除 Page 问题( DevExpress 使用技巧) while (this.ribbonControl.Pages.Count > 0) { ribbonControl.Pages.Remove(ribbonControl.Pages[0]); //调试正常, 运转报异常 } while (this.ribbonControl.Pages.Count > 0) { ribbonControl.SelectedPage = ribbonControl.Pages[0]; ribbonControl.Pages.Remove(ribbonControl.SelectedPage); //运转正 常 } //遏止 F10 键 Tips (DevExpress 使用技巧)eF10KeyForMenu = false; //DX 按钮 ApplicationIcon 属性改动图标右键 Add ApplicationMenu 添加 evExpress.XtraBars.Ribbon.ApplicationMenu5.HitInfo以下是代码片段: //在 Tab 页上点击右键的工作响应(DevExpress 使用技巧) void xtraTabbedMdiManager_Event(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right && ActiveMdiChild != null) { DevExpress.XtraTab.ViewInfo.BaseTabHitInfo hInfo = xtraTabbedMdiManager.CalcHitInfo(e.Location); //右键点击位置:在 Page 上且不在封闭按钮内 if (hInfo.IsValid && hInfo.Page != null && !hInfo.InPageCloseButton) { this.popupMenu.ShowPopup(Control.MousePosition);//在鼠标位置弹 出,而不是 e.Location } } } //在 ribbon 上点击右键的工作响应 private void ribbonControl1_ShowCustomizationMenu(object sender, RibbonCustomizationMenuEventArgs e) { //禁掉原系统右键菜单 e.ShowCustomizationMenu = false; //右键位置:在 barButtonItem 上 if (e.HitInfo != null && e.HitInfo.InItem && e.HitInfo.Item.Item is BarButtonItem) { this.popupMenu.ShowPopup(Control.MousePosition); } //右键位置: barSubItem 中的 barButtonItem 上 else if (e.Link != null 在 && e.Link.Item != null && e.Link.Item is BarButtonItem) { this.popupMenu.ShowPopup(Control.MousePosition); } }6.皮肤以下是代码片段: //添加皮肤轨范集后注册皮肤( DevExpress 使用技巧) erSkins.OfficeSkins.Register(); erSkins.BonusSkins.Register(); //设置皮肤 erLookAndFeel.Default.SetSkinStyle("Liquid Sky"); //若皮肤称号错误则按系统默许设置(第一个皮肤) //GalleryFilterMenuPopup 工作设置弹出选择菜单的“All Groups”为中文 private void rgbiSkins_GalleryFilterMenuPopup(object sender, GalleryFilterMenuEventArgs e) { e.FilterMenu.ItemLinks[n].Caption = " 一切皮肤"; //n=分组数+1 } //GalleryInitDropDownGallery 工作设置弹出 皮肤列表的表头“ALL Groups”为中文 private void rgbiSkins_GalleryInitDropDownGallery(object sender, InplaceGalleryEventArgs e) { e.PopupGallery.FilterCaption = "一切皮 肤"; }7.dockManager 将视图的状况信息保管到 xml 文件 dockManager1.SaveLayoutToXml("..\\UserConfig\\ViewInfo.xml"); 导出 xml 中保管的状况信息 dockManager1.RestoreLayoutFromXml("..\\UserConfig\\ViewInfo.xml"); 8.barManager 设置 bar 的字体与系统字体 barAndDockingController1.AppearancesBar.ItemsFont = new Font(this.Font.FontFamily, currentFontSize); 9.设置系统字体以下是代码片段: DevExpress.Utils.AppearanceObject.DefaultFont = new Font(this.Font.FontFamily, currentFontSize);10.treeView 为 tree 节点加右键菜单并选中该节点以下是代码片段: private void treeList1_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right) { DevExpress.XtraTreeList.TreeListHitInfo hi = treeList1.CalcHitInfo(e.Location); if (hi.Node != null && hi.Node.ImageIndex == 5) //叶子节点的 ImageIndex == 5 { TreeListNode node = treeList1.FindNodeByID(hi.Node.Id); treeList1.FocusedNode = node; this.popupMenu1.ShowPopup(MousePosition); } } }优秀的菜单控件 DevExpress Bar 使用初探前一阵子在做项目时,用到了 Develper Experss Inc. 的 DevExpress Bar 控件,感觉它真 是一个好东西,可以完全取代 Delphi 现有的 Menu 控件和 ToolBar 控件,其功能也是第三方 控件中的佼佼者。
高级停靠(Dock)技术的实现介绍所谓停靠就是可以用鼠标拖动窗体或者控件,并将其从一个父窗体移出或者移动到另一个父窗体上,可以按水平,垂直方向整齐排列,并且可以停靠在分页控制组件上。
下面的示意图是一个Delphi IDE 的窗口停靠示意图:考察一些常用的软件如Office等大型软件,会发现大多提供窗体停靠的功能。
微软的MFC很早就引入了工具条的拖放功能,可以将工具条上窗口上边拖放到窗口下边。
而Borland则最早在Delphi 4中开始引入停靠功能支持,它实际上就是基于前面我们讲到的VCL拖放技术基础之上的,后面我们会看到两者有多么的类似。
Borland提供了停靠功能的一个演示程序,可以在..\Demos\Docking目录下找到它,不过这个例子的问题就是太过复杂,使用了很多的高级技巧,不易理解。
所以我将抛开复杂的示例,一步一步的揭开停靠的秘密。
一个简单的停靠实现工具条的停靠功能是最常见的功能需求,新建一个程序,在窗体上放置一个工具条,然后任意添加几个按钮,为了让工具条能够从窗体上移出,最简单的办法是设定工具条的DragMode属性为dmAutomatic,将DragKind属性设定为dkDock。
就像在拖放类一章我们说的,DragMode设定为dmAutomatic表示当鼠标在工具条上点击并移动后,会自动发起拖放动作。
而DragKind为dkDock表示接下来的操作是一个停靠操作而不是普通的拖放操作。
运行这个简单的程序,然后拖放工具条,我们发现确实可以将工具条拖离主窗体使其变成一个浮动的工具条。
注意在工具条从窗体拖离时,VCL会在屏幕上画一个矩形表示工具条,我们称其为停靠图像。
见下图:可以看到,VCL强大的停靠支持使我们不用写一行代码就可以实现简单的停靠功能了,但是上面的程序存在几个问题:1、由于使用了dmAutomatic属性,哪怕是单击一下工具条不做任何拖动,都会使它变成浮动的工具条。
2、拖离窗体后变成浮动的工具条无法停靠回原来的位置。
3、浮动的工具条窗口可以被关闭,而关闭后再也没办法调出工具条了。
对于第一个问题,为了实现工具条在鼠标点击后,必须拖放几个像素后才能被拖离界面,可以像前面拖放类章节中所讲的那样,设定工具条的DragMode为dmManual的手工模式,然后在工具条的OnMouseDown事件中使用拖放函数BeginDrag来发起拖离的动作:procedure TForm1.ToolBar1MouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);beginToolbar1.BeginDrag(False);end;而为了让浮动工具条能够被停靠回主界面,我们需要设定窗体的DockSite属性为True,表示窗体是一个停靠的锚点,允许别的控件停靠在它上面。
而当关闭浮动工具条窗口时,VCL其实并没有销毁工具条,它只是将工具条的Visible属性设为False,使其不可见,为了重新显示工具条,我们可以通过一个菜单命令,将其属性设为True。
下面是添加的察看工具条的Action的代码,其中Update 事件判断工具条是否可见,如果不可见,则允许执行Action的OnExecute事件:procedure TForm1.ActionViewToolBarUpdate(Sender: TObject);begin(Sender as TAction).Enabled:=not Toolbar1.Visible;end;procedure TForm1.ActionViewToolBarExecute(Sender: TObject);beginToolbar1.Visible:=True;end;再次运行修改后的停靠程序,多拖放停靠几次后,我们又会发现一个新的问题,那就是虽然浮动工具条可以被停靠回主界面,但是位置不再是同界面顶部对齐,而是可以停靠在任意位置上,这显然不是我们想要的效果,什么原因造成的呢?怎么解决呢?原来,VCL在拖离任何控件后,都会将控件的Align属性修改为alNone,要想解决这个问题,就需要在工具条停靠在窗体上之后将工具条的Align属性重新设定为alTop。
幸好同拖放操作一样,在停靠组件时,VCL同样会产生一系列的事件,其中 OnEndDock事件会在停靠完成后发生,正好满足我们的需要,实现的工具条的OnEndDock事件如下:procedure TForm1.ToolBar1EndDock(Sender, Target: TObject; X, Y: Integer);beginToolbar1.Align:=alTop;end;复杂界面的停靠上面的停靠功能可以满足简单界面的需求了,那么考虑一个复杂的界面停靠操作。
假设你的项目经理要求你在主界面上放置两个面板,上面的面板上有一个工具条,下面的面板上也有一个工具条。
两个面板上的工具条都停靠操作,但是有一个要求是上面面板的工具条只能停靠在上面的面板上,同样下面的工具条也只能停靠在下面的面板上。
当组件在要停靠的组件上被拖动时,会调用被停靠组件的OnDockOver事件,OnDockOver的事件定义如下;type TDockOverEvent = procedure(Sender: TObject; Source: TDragDockObject; X, Y: Integer; State: TDragState; var Accept: Boolean) of object;其中Source是一个VCL在停靠操作中自动创建的TDragDockObject类型的对象,它的Control属性就是停靠组件,所以可以在组件的OnDockOver事件中根据要停靠的组件名称判断是否接收拖放。
实现的判断代码如下:procedure TForm1.Panel1DockOver(Sender: TObject; Source: TDragDockObject;X, Y: Integer; State: TDragState; var Accept: Boolean);beginAccept:=(='ToolBar1');end;procedure TForm1.Panel2DockOver(Sender: TObject; Source: TDragDockObject;X, Y: Integer; State: TDragState; var Accept: Boolean);beginAccept:=(='ToolBar2');end;执行程序后,可以发现确实Toolbar1不会被停靠到Panel2上。
但是有一个问题,虽然Panel2不接收Toolbar1的停靠,但是VCL仍然会在修改Toolbar1的停靠矩形为Panel1的形状,在实际使用中可能会让用户产生一种错觉,以为可以停靠Toolbar1到Panel2上。
为了避免这种混乱,我们可以调整Source对象的DockRect以修改停靠矩形的显示,下面是调整矩形的代码:procedure TForm1.Panel2DockOver(Sender: TObject; Source: TDragDockObject;X, Y: Integer; State: TDragState; var Accept: Boolean);beginAccept := ( = 'ToolBar2');if not Accept thenSource.DockRect := AdjustDockRect(Sender, Source, X, Y);end;function TForm1.AdjustDockRect(Sender: TObject; Source: TDragDockObject; X, Y:Integer): TRect;varARect: TRect;begin//将当前鼠标位置换算成屏幕坐标,赋值给矩形左上角ARect.TopLeft := (Sender as TWinControl).ClientToScreen(Point(X, Y)); //根据被拖放的工具条的尺寸计算出右下角坐标ARect.BottomRight := TWinControl(Sender).ClientToScreen(Point(X + Source.Control.Width, Y + Source.Control.Height));//最后根据鼠标拖动组件的部位计算出实际的矩形X,Y方向上的位移OffsetRect(ARect,-Trunc(Source.Control.Width * Source.MouseDeltaX),-Trunc(Source.Control.Height * Source.MouseDeltaY));Result:=ARect;end;上面的代码过于烦琐,有没有更简单的办法呢?VCL会在DockOver事件前调用OnGetSiteInfo事件获得被停靠组件的信息,同时返回一个CanDock参数表示是否接受停靠组件的停靠,事件定义如下:type TGetSiteInfoEvent = procedure(Sender: TObject; DockClient: TControl; var InfluenceRect: TRect;MousePos: TPoint; var CanDock: Boolean) of object;如果CanDock为False,则后面的DockOver就不会被调用了,也就无须修改工具条停靠矩形了。
我们需要就是判断DockClient的名称,决定是否允许拖放,代码如下:procedure TForm1.Panel1GetSiteInfo(Sender: TObject; DockClient: TControl;var InfluenceRect: TRect; MousePos: TPoint; var CanDock: Boolean); beginCanDock:=='ToolBar1';end;procedure TForm1.Panel2GetSiteInfo(Sender: TObject; DockClient: TControl;var InfluenceRect: TRect; MousePos: TPoint; var CanDock: Boolean); beginCanDock:=='ToolBar2';end;可以看到这种方式要比前一种方式简洁得多。