自己设计自定义界面组件的注意事项

原创 2015年11月19日 15:05:46

自己写组件本质是画图,所以需要了解画图的各方面主要的内容,消息队列和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组件就更好了。

相关文章推荐

VB.NET自定义组件方法及注意事项

Imports System.ComponentModelImports System.IOImports System.Windows.FormsImports YeWuBillPublic Cla...

软件界面交互式设计注意事项

如何设计一个优秀的向导式界面: 1、避免要求用户提供过多的信息,避免过多的步骤个数; 2、避免在每个步骤的界面上显示无用的图片; 3、在向导过程结束前,将用户的所有输入信息回显出来,以便用户确认...

《java入门第一季》之HashSet存储自定义对象问题以及注意事项

上一篇http://blog.csdn.net/qq_32059827/article/details/51578158 写到存储字符串类型的时候出现了无序,而且这个无序不是随机那种无序,它是有一定...

Robotframework中自定义库的加载及注意事项

1.自定义库的文件名必须与库的类名相同 如:文件名为HttpAutoLib.py则其类名必须为HttpAutoLibclass HttpAutoLib(object): def __ini...

自定义view分类和注意事项

自定义view一直是我们开发中的难题,也是创新点,在很多初学者都对它感到很头疼,我也是如此,这里写出来与大家分享,希望我们都能成功解决这块蛋糕。 一、自定义view的分类:         1、继...

用xib自定义UITableViewCell的注意事项——重用问题 -

用xib自定义UITableViewCell的注意事项——重用问题 - 原文  http://www.cnblogs.com/wengzilin/p/3514947.html 问题...

C++ stl container 存放含动态数据自定义类的注意事项(堆已损坏)

Author: YuMaNzI Date: 2015/04/24 stl实现的多种容器使用简单,性能良好,能极大提高日常的c++ code开发效率。但我们在用这些容器存储自定义类(而不是简...

UE4中自定义的碰撞几何体使用注意事项

简单的碰撞几何体对于优化游戏中的碰撞检测是很重要的。虚幻引擎4在 静态网格物体编辑器 中提供了创建碰撞几何体的基本工具。但是,某些时候,最好还是通过在您的3D建模应用程序中创建自定义的碰撞几何体然后再...

JAVA基础再回首(十九)——异常的概述、Try…Catch、多异常处理、Throws、throw、finally、自定义异常及异常的注意事项

JAVA基础再回首(十九)——异常的概述、Try…Catch、多异常处理、Throws、throw、finally、自定义异常及异常的注意事项 版权声明:转载必须注明本文转自程序员杜鹏程的博客:h...
  • m366917
  • m366917
  • 2016年09月03日 13:48
  • 817

Qt编写自定义控件插件路过的坑及注意事项

在一日一控件的口号下,终于写好了五十几个自定义控件,包括各种仪表盘,各种温度计,各种进度条,各种按钮等,具体可参见(http://www.cnblogs.com/feiyangqingyun/p/61...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:自己设计自定义界面组件的注意事项
举报原因:
原因补充:

(最多只允许输入30个字)