自己设计自定义界面组件的注意事项
来源:互联网 发布:java容器有哪些 编辑:程序博客网 时间:2024/05/22 14:07
自己写组件本质是画图,所以需要了解画图的各方面主要的内容,消息队列和GDI接口在window下需要熟悉,跟画相关的的消息主要有WM_PAINT,WM_NCPAINT,WM_ERASEBKGND三个,其他就是跟RGN和RECT相关的接口和GDI接口,首先先说,BeginPaint和GetUpdateRect这两个接口,都可以获得窗口目前的更新区域范围(RECT),GetUpdateRect可以随时调用查询,但是一般应该在BeginPaint之前使用,按照MSDN的说明,BeginPaint接口调用后在PAINTSTRUCT参数中会返回窗口当前需要的更新区域,区域的内容和GetUpdateRect得到的内容是完全一样的,但是BeginPaint调用会同时清除窗口所有的无效区域(invalide rect,即:无效区域就是需要更新区域的别名),所以在调用了BeginPaint接口后,立即调用GetUpdateRect接口,将返回一个空更新区域,即:没有需要更新的区域了。但是一般大家会习惯在调用通过先调用GetUpdateRect接口,获得更新区域(无效区域),然后再调用BeginPaint,进行绘画。所以调用了BeginPaint后,就没有必要调用GetUpdateRect接口了,因为已经没有更新区域了(已经被BeginPaint清空),所以也可以直接使用BeginPaint接口来获得更新区域,MSDN上说明了,BeginPaint接口和GetUpdateRect接口获得的更新区域是完全相同的,即两个接口获取更新区域是等同的,只是BeginPaint具有更多其他功能。
更新的操作相关的接口主要有InvalidateRect,InvalidateRgn,ValidateRect,ValidateRgn,RedrawWindow,UpdateWindow,注意:(InvalidateRect,InvalidateRgn)和(ValidateRect,ValidateRgn)是相反的操作,是增加和移除的关系,即:(InvalidateRect,InvalidateRgn)是增加无效区域,(ValidateRect,ValidateRgn)是移除无效区域,又名增加有效区域;RedrawWindow功能最强大几乎包含了其他更新接口的功能也复杂了;UpdateWindow主要是向窗口发送WM_PAINT消息,当窗口有更新消息的时候会发送立即WM_PAINT消息(调用窗口过程),窗口没有更新区域时则什么都不做,具体功能可以参考MSDN。其他GDI接口就是画图用的了,不会有异议。最后需要注意的是WM_PAINT消息的发送,这个消息主要由系统自动发送,当系统消息队列里没有任务消息时,并且窗口有无效区域(更新区域)时,系统将自动发送WM_PAINT消息,如果无效区域(更新区域)一直存在,那么WM_PAINT消息系统会一直发送,直到无效区域(更新区域)为空,提示:前面说了BeginPaint接口和ValidateRect接口都可以清空无效区域(更新区域)。忘了说BeginPaint接口必须和EndPaint接口配对,画图结束后需要使用EndPaint接口。
熟悉windows API也是设计界面组件需要用到的东西,比如SetWindowLongPtr等等,跟窗口有关的接口,需要积累和多思考学习,慢慢就熟悉了,多设计代码也是成长的过程,但个人觉得多思考为什么这样设计更多重要,能在熟悉点COM的东西,写个OCX COM组件就更好了。
- 自己设计自定义界面组件的注意事项
- 编写组件自己的设计器
- 编写组件自己的设计器
- 软件界面交互式设计注意事项
- Visual C#实现自定义组件的设计
- Visual C#实现自定义组件的设计
- 自己设计的自定义表单代码雏形!
- 创建属于自己的页面,自定义初始界面
- 【译】界面组件化设计
- Android 打包自己的自定义组件成JAR包
- android 打包自己的自定义组件成JAR包
- Android 打包自己的自定义组件成JAR包
- android 打包自己的自定义组件成JAR包
- android 打包自己的自定义组件成JAR包
- android 打包自己的自定义组件成JAR包
- VB.NET自定义组件方法及注意事项
- 自定义泛型类的注意事项
- 自定义Seekbar的注意事项
- JS学习:JavaScript的核心
- java内存泄露介绍
- Unity3D 游戏资源提取工具
- Android并发编程之图文解析volatile关键字
- Android图片加载神器之Fresco-加载图片基础[详细图解Fresco的使用]
- 自己设计自定义界面组件的注意事项
- ListView的原理
- 《Kafka 0.9.0 Documentation》----Getting Started
- Java default protected
- Unity3d·小技巧·物体自转
- Lambada表达式
- UVA 11426 (欧拉函数)
- 12.2 剪贴板的高级用法
- Java利用HttpURLConnection发送请求