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

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

你可能感兴趣的:(自己设计自定义界面组件的注意事项)