[GDI]如何擦除DC上次画的内容

YaYiYaO 2007-01-30 04:40:54
自画控件,背景透明,每隔一段时间刷新重画
现在的问题是每次重画,上次的东西没有擦掉,画面重叠

问:如何将上次画的东西擦掉??

注:因为背景是透明的,背景显示的是父窗口,父窗口背景复杂,不知道怎么画的,因此不可能重画背景

记得SetROP2(R2_NOTXORPEN),画两次,可以将上次PEN画的线擦掉
那能不能用Bitblt画反色将上次的画面擦掉

还有Bitblt的XOR,OR,AND操作我实在是搞不清楚,有没有人明白的,解释一下
...全文
583 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
rayland 2007-01-31
  • 打赏
  • 举报
回复
要想不重画背景,可以用 XOR 操作。
在原位置上先重画一次。 //两次 XOR 后,恢复之前的画面。
然后在新位置上 XOR 。
//这种方法的可能后果之一,是你不知道背景已经刷新过,而继续在原位置 XOR,结果反而会留下痕迹。

或者你重画前发消息通知被覆盖的窗口重画自身.
YaYiYaO 2007-01-31
  • 打赏
  • 举报
回复
父窗口InvalidateRect还真的可以的
但是我以前也试过,那个时候没有效果,后来想起来是应为父窗口设了WS_CLIPCHILDREN风格
感谢夏娃兄弟,呵呵
mynamelj 2007-01-30
  • 打赏
  • 举报
回复
你要想文字移动,干脆把窗口背景弄成透明的,直接移动子窗口就不会产生这种问题了。
mynamelj 2007-01-30
  • 打赏
  • 举报
回复
通知父窗口重绘试试:

CRect rect;
GetWindowRect(&rect);
GetParent()->ScreenToClient(&rect);
GetParent()->InvalidateRect(&rect);
YaYiYaO 2007-01-30
  • 打赏
  • 举报
回复
没有重载WM_ERASEBKGND消息
就比如:
void CMyWnd::OnPaint()
{
CPaintDC dc(this);
int OldMode = dc.SetBkMode(TRANSPARENT);
dc.TextOut(10,m_CurPos,"move text");
dc.SetBkMode(OldMode);
}
m_CurPos是不断变化的,实现文字的移动
大家可以试一下,文字是重叠的
mynamelj 2007-01-30
  • 打赏
  • 举报
回复
不可能不会擦除,除非你重载了WM_ERASEBKGND消息

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧