模仿outlook快捷方式栏的一个控件
2007-07-05 16:04
232 查看
hi,cnblogs readers,this is my first article here.——jinfd
这是我的第一篇在这里的随笔,我在最近两三天把这个控件的主要代码写完了。
这是一个用c#写的控件,它的原型是outlook 2000里面左侧的快捷方式栏,类似的控件也会在QQ,Visio等常用软件中找到,我为这个控件写了一个dll,并且做了一个demo演示它。
如下图所示:
SideBar.SideBar sbar=new SideBar.SideBar();
2//赋予imagelist
3sbar.ImageList=this.imageList1;
4sbar.AddGroup("第一组");
5sbar.AddGroup("第二组");
6//添加items,参数列表为:itemtext,imageindex
7sbar.Groups[0].Items.Add("item0",0);
8sbar.Groups[1].Items.Add("item1",1);
9sbar.VisibleGroupChanged+=new SbGroupEventHandler(sbar_VisibleGroupChanged);
10sbar.ItemClick+=new SbItemEventHandler(sbar_ItemClick);
可以通过鼠标点击自动完成当前显示组的切换,也可以使用代码来完成:
1//设置当前显示的组
2sbar.VisibleGroupIndex=1;
晚上的时候,我为这个控件加入了对拖放item的功能支持。不过这个功能确实具有一定挑战性,因为涉及到的鼠标处理比较复杂。我们可以看到,鼠标操作的主要特点是:
1.当按下某个控件(例如按钮)时,保持鼠标按下状态,并移开控件,则该控件会弹起,如果此时抬起鼠标,则该控件不会被点击。如果保持鼠标按下并移回控件,控件继续显示成按下状态。即,必须按下和抬起时都捕捉到该控件,点击才有效。估计这是windows设计者考虑到了用户的误操作,允许用户可以此种方法取消点击控件。
2. 当鼠标按下一个item并拖动它到临界区(靠近itemsbox边缘)时,如果item很多,则自动开始滚动。
3. 当鼠标移动到其他GroupHeader时,会切换当前显示的Group。即允许用户将item从一个Group拖动到其他Group中。
上面的挑战性和难点在于,需要根据鼠标的位置计算出需要插入的索引位置,以及要绘制标记插入位置的反馈,并且再位置改变时更新它。具体的细节比较复杂,为此我为sidebar引入了很多成员变量来记录一些必要的信息。也使得mousedown,mouseup,mousemove里面的代码量增加了几乎一倍。。。
不过上面的烦琐细节都被我封装在内部,在外部的使用还是非常简单的。我提供了一个AllowDragItem属性,只需要简单的设置它即可选择是否支持拖放item。同时我考虑为控件增加一个新的事件把它通知给外部。
1//使控件支持鼠标拖放条目
2Sbar.AllowDragItem=true;
你可以在这里下载到这个控件和例子的最新源代码:
http://files.cnblogs.com/hoodlum1980/SideBar20070707.rar
在这个网站上面还有我的其他几个比较小但是有趣的例子源码,也许会在以后详细介绍它们。
——————————————————————————————
小Bug记录:
1.修改了调整字体后布局错误的bug。
2.修改了在demo中的一个疏忽:在显示字体对话框时,错误的将字体初始化为了form1的字体。
3.我把影响外观的一些属性修改后的刷新显示封装在了控件内部。这个并不算什么严重的bug
但会使外部使用时更为简便。例如,对enabled,view(大图标,小图标...),flatstyle等属性的修改,都会在控件内部调用刷新。在外部只要简单的设置它们的值即可。
这是我的第一篇在这里的随笔,我在最近两三天把这个控件的主要代码写完了。
这是一个用c#写的控件,它的原型是outlook 2000里面左侧的快捷方式栏,类似的控件也会在QQ,Visio等常用软件中找到,我为这个控件写了一个dll,并且做了一个demo演示它。
如下图所示:
SideBar.SideBar sbar=new SideBar.SideBar();
2//赋予imagelist
3sbar.ImageList=this.imageList1;
4sbar.AddGroup("第一组");
5sbar.AddGroup("第二组");
6//添加items,参数列表为:itemtext,imageindex
7sbar.Groups[0].Items.Add("item0",0);
8sbar.Groups[1].Items.Add("item1",1);
9sbar.VisibleGroupChanged+=new SbGroupEventHandler(sbar_VisibleGroupChanged);
10sbar.ItemClick+=new SbItemEventHandler(sbar_ItemClick);
可以通过鼠标点击自动完成当前显示组的切换,也可以使用代码来完成:
1//设置当前显示的组
2sbar.VisibleGroupIndex=1;
晚上的时候,我为这个控件加入了对拖放item的功能支持。不过这个功能确实具有一定挑战性,因为涉及到的鼠标处理比较复杂。我们可以看到,鼠标操作的主要特点是:
1.当按下某个控件(例如按钮)时,保持鼠标按下状态,并移开控件,则该控件会弹起,如果此时抬起鼠标,则该控件不会被点击。如果保持鼠标按下并移回控件,控件继续显示成按下状态。即,必须按下和抬起时都捕捉到该控件,点击才有效。估计这是windows设计者考虑到了用户的误操作,允许用户可以此种方法取消点击控件。
2. 当鼠标按下一个item并拖动它到临界区(靠近itemsbox边缘)时,如果item很多,则自动开始滚动。
3. 当鼠标移动到其他GroupHeader时,会切换当前显示的Group。即允许用户将item从一个Group拖动到其他Group中。
上面的挑战性和难点在于,需要根据鼠标的位置计算出需要插入的索引位置,以及要绘制标记插入位置的反馈,并且再位置改变时更新它。具体的细节比较复杂,为此我为sidebar引入了很多成员变量来记录一些必要的信息。也使得mousedown,mouseup,mousemove里面的代码量增加了几乎一倍。。。
不过上面的烦琐细节都被我封装在内部,在外部的使用还是非常简单的。我提供了一个AllowDragItem属性,只需要简单的设置它即可选择是否支持拖放item。同时我考虑为控件增加一个新的事件把它通知给外部。
1//使控件支持鼠标拖放条目
2Sbar.AllowDragItem=true;
你可以在这里下载到这个控件和例子的最新源代码:
http://files.cnblogs.com/hoodlum1980/SideBar20070707.rar
在这个网站上面还有我的其他几个比较小但是有趣的例子源码,也许会在以后详细介绍它们。
——————————————————————————————
小Bug记录:
1.修改了调整字体后布局错误的bug。
2.修改了在demo中的一个疏忽:在显示字体对话框时,错误的将字体初始化为了form1的字体。
3.我把影响外观的一些属性修改后的刷新显示封装在了控件内部。这个并不算什么严重的bug
但会使外部使用时更为简便。例如,对enabled,view(大图标,小图标...),flatstyle等属性的修改,都会在控件内部调用刷新。在外部只要简单的设置它们的值即可。
相关文章推荐
- 模仿outlook快捷方式栏的一个控件(C#)
- 用js文件创建一个带参数的view client的快捷方式(类似的bat形式也可模仿实现),并实现自动登录
- windows -- 怎么创建一个网页快捷方式
- 【起航计划 022】2015 起航计划 Android APIDemo的魔鬼步伐 21 App->Launcher Shortcuts 为某个非主Activity在Home Screen上建立一个快捷方式
- C# 创建一个文件夹快捷方式
- 纪念一个曾经的软件产品(六)——快捷方式,联系人,任务管理器
- 在linux里如何建立一个快捷方式,连接到另一个目录
- ASP.NET 2.0 - 如何以程控方式动态建立一个 GridView 控件
- Ajax命名空间一个获取指定的页面元素的快捷方式——$get()
- Windows 7如何建立一个FTP的快捷方式
- 一个apk多个入口,在桌面上创建多个应用图标的桌面快捷方式
- 通过发送广播来向桌面添加一个快捷方式
- 为普通的键盘设计一个休眠快捷方式让电脑快速休眠
- 服务器端控件怎样使用一键快捷方式
- 一个向客户端桌面推送快捷方式的脚本
- (android/swig实现)用c/c++混合编程方式为ios/android实现一个自绘日期选择控件(三)
- 通过模仿AsyncTask的封装方式,实现一个后台预读数据的线程,(使用AsyncTask有导致应用FC的风险)
- Linux系统:Ubuntu下如何在桌面创建一个应用程序的“快捷方式”?
- 模仿spring,自定义的一个mvc框架,有ioc和aop功能,全部采用注解的方式
- 为什么双击任何一个快捷方式都是打开的同一个软件啊???