关键字:自定义控件(Custom Control),C++,WIN32 SDK

    本文发布的是我在工作中开发的自定义控件。第一个是多选控件,该控件主要启发来自于 ExplorerBar,即资源管理器左侧的 DirectDraw 部分,例如打开文件夹,位于左侧的那个可以扩展收缩的多面板组成的“文件夹任务”等。本控件的开发需求主要是用于在很多个Items中进行快速方便的选择和定位,因此我称它为多选控件。从外观上来看,它是由一些列面板从上到下的方式排列而成(我们把一个Group称为控件的一个Child,即第一层子结点的LineSize = 1),它和 Outlook 侧边栏的主要区别是,outlook侧栏是多个面板共享一个公用的较大客户区,即同一时刻通常仅可见一个面板(这一点类似TabControl),显然这个特征有时是我们需要的,但有时是我们不希望的。即 ExploerBar 和本控件则是多个面板同时可见的。比如说,TabPage上通常是按照功能分组归类到多个页面,这些页面彼此之间独立性较强,互相不依赖,因此在同一时刻只见到一个页面是比较符合用户意愿的。而我们要做的多选空间,他们都是本质上相同的,因此我希望随意组合式的多页面展示,这样可以给我们一个灵活又广阔的全局和局部视角组合,这种特点就是ExploreBar的特点。

    因此总结下这个控件的诞生需求:是我们需要多选,多个面板保证灵活和快速定位的需求,即我们需要对Items进行一些分类并放入面板,可以任何折叠。使得提供灵活的视图。面板内部,由于Items的特征小而多,因此采用类似ListView的图标视图的做法,将他们从左到右进行布局。这样就可以比 TreeView 节省垂直方向的空间(因为Treeview每个节点都要占据一行),在这个控件里主要是各个元素之间都有边框,元素之间的间隔,边距等元素,这些元素显然会浪费一些空间。

    本控件的组织架构是有顶层的代表窗口的一个类来管理的,下设Group集合。每个Group下面含有Items。每个Item为最基本单位,类似一个CheckBox。每个 Group 由Header和“客户区”组成。点击Header可以对其展开和折叠,同时左侧的按钮采用的是七帧图片得到旋转动画。截图如下所示:

    

    另一个控件是时钟控件,该控件模仿的是 windows mobile 系统上的闹钟设置控件。主要用于设置时刻(例如闹钟),里面内置两个属性,Hour 和 minute,没有日期。因此这是它和 DateTimePicker 的主要区别。用户可以用鼠标拖动分针和时针,进行时刻的设置。时钟控件由于主要时为用户设置时间而提供,因此绘制上追求的原则是高效和对时间清楚的示意性,而不在于界面的美观和华丽,因此它在外观上显得“朴素”。控件内默认的分针拖动单位是5分钟(也可以设置为最小的 1 分钟分辨率,则拖动时的运动会更加平稳),指针捕捉误差缓冲为 3 分钟左右。

    此两个控件都采用了内存绘制技术用于防止闪烁。

    由于开发的比较紧急,因此尤其多选控件还缺乏足够的测试,可能有些接口方法还需要进一步改进,一些接口也有待于增加。具体用法由于精力所限,我就不在这里用代码做示范了,可以参考 Demo 项目的代码。在发行文件夹里有一个MulSelCtl.h 头文件,模仿windows sdk的做法我已经定义了一些对应的宏。因为时间原因,我还没有写出具体的说明文档。

    最后增加一些技术总结:

    (1)读写文本文件时,应该尽量避免使用unicode版本的函数(fgetws等),因为读写中文时可能乱码。因此本控件中先把 unicode 转换到ansi 再和文件进行交互。

    (2)写文本文件时,应该把“\r\n"转换成单个”\n“,否则写入文本文件时,由于底层函数自作主张的翻译,会把\r\n写成\r\r\n。在文本框文本和文件之间交换数据时,这一点尤其需要注意。

    (3)自定义控件要写成DLL被其他进程加载和使用,则ClassStyle中需要添加CS_GLOBAL样式,否则其他进程无法创建其实例。

    (4)自定义控件由于可能被创建出多个实例,因此其窗口过程不能使用 Static 变量持有和窗口实例相关的内部数据(状态)。这一点和我们写普通窗口(主窗口,模态对话框)过程时不同,因为它们通常时进程范围内唯一的,因此可以使用 Static 变量持有窗口数据,这一点尤其要注意。正确做法时在注册窗口类时,告知系统为每个窗口保留其窗口数据额外空间的大小,在 WM_NCCREATE 时分配和填写数据。

    Demo项目和控件发行包(*.h, *.lib, *.dll)的下载连接如下:

    http://files.cnblogs.com/hoodlum1980/MulSelCtl_BIN.zip

    【更新】

    [1]. 修复多选控件中的一个BUG,点击 GroupHeader 上的 CheckBox 时,由于没有更新内部状态。会造成后续点击时,CheckBox 状态错误。2013-5-5;

    [2]. DEMO项目对话框上,新增时钟控件的拖动单位设置(1或5分钟)。2013-5-5。    

[发布] 多选控件和时钟控件相关推荐

  1. Android Studio利用时钟控件AnalogClock显示模拟时钟以及TextClock显示数字时钟

    前言 利用时钟控件AnalogClock快速制作一个模拟时钟.利用TextClock显示数字时钟. 一.AnalogClock是什么? AnalogClock继承的是View,可重写OnDraw方法. ...

  2. Android 自定义时钟控件 时针、分针、秒针的绘制这一篇就够了

    前言 对于 Android 开发者来说,自定义 View 是绕不开的一个坎.二对一自定义 View 自定义时钟必然是首选,那么我们该如何绘制自定义时钟呢?本篇我结合 github 上一个有趣的三方库, ...

  3. c# winform LED数字时钟控件

    包含颜色选择器,日历控件(类似于Google日历),数字时钟,LED等控件 1.日历控件       calendar.rar 2.Office 2003中的颜色选择器    OfficePicker ...

  4. C#时钟控件 (C# Clock Control)

    周末实现了一个比较漂亮的时钟控件,如下图: 功能: (1)自定义样式(时钟边框颜色,小时.分钟.秒针的颜色自定义,自定义时钟内部填充色,刻度及刻度值颜色,刻度可使用矩形或圆形). (2)可作为图片水印 ...

  5. C 时钟控件 (C Clock Control)

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 周末实现 ...

  6. 自定义Android电子时钟控件

    参照Google的闹钟源码,提取出来其中的一个部分,获取系统的当前时间,并实时进行更新显示,写成一个控件view,以后有需要的话可以放在自己的App中,当做一个通用的控件来使用.本例子中只是简单的把源 ...

  7. Android 自定义模拟时钟控件

    自定义view-透明模拟时钟显示 项目中要用到模拟时钟的显示,查了一些资料根据自己的需要进行了自定义view 思路:重写view,1.根据控件的宽高进行获取模拟时钟的半径大小.2.重写onDraw方法 ...

  8. Android自定义时钟控件

    项目要求访问网络是等待状态要做时钟的样子,经过不懈努力,终于写出来了,现分享出来,功能比较全,直接拷贝代码就可以用,仅供有这种需求的码农们参考,如果采纳,请点个赞,谢谢支持. 效果图 主Activit ...

  9. android 时钟控件风格,android实现widget时钟示例分享

    一.在 AndroidManifest.xml文件中配置Widgets: package="com.example.widget" android:versionCode=&quo ...

最新文章

  1. anacoda的spyder在调用matplotlib的时候无法显示动画效果【学习笔记】
  2. Cartographor定位-shell脚本:不停拉起死掉的程序和脚本
  3. 18.12.09-C语言练习:兔子繁衍问题 / Fibonacci 数列
  4. 《Python Cookbook 3rd》笔记(2.18):字符串令牌解析
  5. elementui设置时间_element-ui 表格数据时间格式化的方法
  6. Matplotlib 中文字体设置
  7. python把文件中的邮箱分类 保存到相应的文件里面
  8. 三大抽样分布、正态总体下的抽样分布
  9. Server concepts 详解
  10. 原生js实现简单的svg编辑器
  11. 如何获取宝宝取名软件注册码
  12. html写前端手机页面,前端编写手机兼容页面(简易方式)
  13. C语言:小写字母与大写字母的转换
  14. 版权变更有哪些流程?
  15. 问题条件数(Conditioning of a problem)
  16. Why c++ coroutine?Why libgo?
  17. 一文搞懂,PO设计模式详解
  18. 电脑遇到的各种蓝屏、断网的问题以及解决办法
  19. 解决AttributeError: ‘NoneType‘ object has no attribute ‘val‘ if left.val!=right.val:Line 17 问题
  20. wininet,winhttp,xmlhttprequest,各版本区别 《转》

热门文章

  1. (转)linux下find查找命令用法
  2. python处理进度条
  3. pacemaker+corosync
  4. Know more about commit
  5. 无法解析的外部符号的几种可能(lib方面的)(还有dll方面的,不在本文中)...
  6. SVN、Apache和AD LDS的集成
  7. WP7 App性能优化(8):检测应用程序性能(Ⅰ)
  8. TCP三次握手的原理及***手段
  9. sc.textFile的相对路径与绝对路径
  10. 启动hiveserver2时报错Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient