读书人

SDK 如何避免 WM_PAINT

发布时间: 2012-01-30 21:15:58 作者: rapoo

SDK 如何处理 WM_PAINT?
想做一个类似 记事本 的程序,用sdk来写,不用 资源/控件,整个窗口就当成一个记事本界面。
我现在考虑当 WM_PAINT 到来的时候,我该怎么处理?

貌似每次 WM_PAINT 时,需要重画的矩形框都很小,我是该每次都重画那些 小矩形框?
还是等几个 WM_PAINT 之后再花,那此时该重画的区域又怎么确定??
还是干脆全部窗口都重画??
还是说有更好的其他的方式??

Windows 是怎么做的??
有太多的疑问,请求帮助,可以给方案,推荐资料,推荐书,或者类似的代码~~ 感谢

[解决办法]
InvalidateRect
The InvalidateRect function adds a rectangle to the specified window's update region. The update region represents the portion of the window's client area that must be redrawn.

BOOL InvalidateRect(
HWND hWnd, // handle to window
CONST RECT *lpRect, // rectangle coordinates
BOOL bErase // erase state
);
只重画一部分
[解决办法]
限制重画区域可以用BOOL InvalidateRect(
HWND hWnd, // handle to window
CONST RECT *lpRect, // rectangle coordinates
BOOL bErase // erase state
);
PAINT中可以整个画,只有重画区域内的才会被重画,其他的不起作用。这样Paint方便些。也可以按
PAINTSTRUCT ps;、、中的 rcPaint
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
来计算要重绘的内容,不过同样花时间。
[解决办法]
重画哪一部分,是有道理的, 比如向下滚动一行的时候,肯定是只画最下面一行,往上类似

输入字符的时候,一般重画当前行,而到了边界之后,一般都是向左滚动一个字符的宽度,这样,就在最右边画出每行的最后一个字符。

[解决办法]
窗口A 移开的时候,重绘区会很大,所以不如全部重绘,反正重绘区外不起作用。
[解决办法]
下载我的“ClipPaint.rar”做参考。
[解决办法]

探讨

引用:
重画哪一部分,是有道理的, 比如向下滚动一行的时候,肯定是只画最下面一行,往上类似

输入字符的时候,一般重画当前行,而到了边界之后,一般都是向左滚动一个字符的宽度,这样,就在最右边画出每行的最后一个字符。

恩,这些还比较好弄,
我主要想得比较烦的是,窗口A 遮住我的窗口,然后 窗口A 移开的时候,这个时候的WM_PAINT的小矩形又多……

[解决办法]
如果你不用控件的话,那么就是全部自绘了?
那你用到的API就多了。。。

GDI的几个Clip函数。
SaveDC/RestoreDC,这个也是我最近才学会的。
[解决办法]
csdn中搜索“ClipPaint.rar”

读书人网 >VC/MFC

热点推荐