一个关于InvalidateRect的问题 求解

来源:百度知道 编辑:UC知道 时间:2024/09/24 04:51:27
我用VC++ 6.0
看到书上一例子如下

case WM_TIMER:
干其他事情....
InvalidateRect (hwnd, NULL, FALSE) ;
return 0;

case WM_PAINT:
hdc = BeginPaint (hwnd, &ps) ;
GetClientRect (hwnd, &rc) ;

改变szBuffer的内容

DrawText (hdc, szBuffer, -1, &rc,
DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
EndPaint (hwnd, &ps) ;
return 0 ;

我门都知道 如果InvalidateRect 用 FALSE ,BeginPaint 是不会用背景画刷擦除背景的。只会使无效阵矩变为有效。
可是问题是 当我改变了szBuffer后 用DrawText输出的时候 居然上一次的文本被擦除了。

而且我确定 这条WM_PAINT 是InvalidateRect 导致发出的,因为我已经建立窗口时已经锁定了 窗口大小 ,是不会有WM_SIZE 出现 而引发WM_PAINT的。

我觉得奇怪 按道理来说应该这一次输出的字体会覆盖到上一次字体上。形成字体累积。
可是居然上一次文字却不见了被擦除掉了。而这一次字体被好好绘制出来了
我很奇怪到底什么时候被擦除掉的呢

希望高手解答

你是用DrawText输出字符串,默认情况下字体颜色是黑色,背景颜色是白色。你这种情况应该是DrawText用背景颜色覆盖了上一次的字符串。在DrawText之前把背景颜色设置成透明就应该可以了。SetBkMode就可以完成需要。