VC中如何强制让窗口重绘,主要是在响应OnMove时让窗口重绘

xiaohuh421 2010-08-20 05:14:57
我的直接想法是让窗透明,但是控件不要透明.我在WM_CTLCOLOR响应函数中只让对话框背景透明.
HBRUSH CTestMgDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);


if(nCtlColor==CTLCOLOR_DLG)
{
return (HBRUSH)GetStockObject(NULL_BRUSH);
}// TODO: Change any attributes of the DC here

// TODO: Return a different brush if the default is not desired
return hbr;
}

但是这个要在窗口重绘时才会得到响应

首先说明:用Invalidate,UpdateWindow,RedrawWindodw,这些函数的一些用法,都不能在OnMove中使对话框背景重绘.

//CDialog::OnPaint();
//CClientDC dc(this);
//Invalidate(FALSE);
//UpdateWindow();
//RedrawWindow(NULL,NULL,RDW_ERASENOW);
// TODO: Add your message handler code here
// HDC hDC=this-> GetDC()->m_hDC;
// LPARAM lParam=0;
//
// lParam=LOWORD(this->m_hWnd);
// lParam+=CTLCOLOR_DLG<<16;
// //::SendMessage(this-> m_hWnd,WM_CTLCOLOR,(WPARAM)hDC,lParam);
//::SendMessage(this->m_hWnd,WM_SHOWWINDOW,SW_HIDE,NULL);
//ShowWindow(SW_HIDE);
//::SendMessage(this->m_hWnd,WM_ACTIVATE,WA_ACTIVE,(LPARAM)this->m_hWnd);


问题: 还有没有其它方法让对话框背景重绘?

请大家帮下,不过还请先试试,能在OnMove时重绘背景再给我说哈,再次谢谢大家......
...全文
1636 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
蓝鹰 2012-03-09
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 xiaohuh421 的回复:]

引用 8 楼 liberty724048 的回复:
靠!在WM_MOVE的OnMove中添加一条语句:
SendMessageW(WM_PAINT);
这样还不行吗?


不行,前面几楼的都说过了,都没有背景,是不会刷新的.
[/Quote]
楼主说的对,我也在纠结这个问题
xiaohuh421 2010-08-23
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 liberty724048 的回复:]
靠!在WM_MOVE的OnMove中添加一条语句:
SendMessageW(WM_PAINT);
这样还不行吗?
[/Quote]

不行,前面几楼的都说过了,都没有背景,是不会刷新的.
xiaohuh421 2010-08-23
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 s11143 的回复:]
Invalidate 或者直接自己抛消息
[/Quote]

这个发消息到消息队列中,不一定会马上响应这个消息.
xiaohuh421 2010-08-23
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 leeihcy 的回复:]
可以参考 迅雷 弹出来的那个 对话框,应该就是背景透明(分层),然后在这层背景之上附加了一层用于放置控件的窗口,所以在拖动背景窗口的时候能发现上面那层控件窗口也在移动。

(个人还是觉得迅雷这个窗口很 e xin.. )
[/Quote]

没看到哪个框框?????
Liberty-Bird 2010-08-22
  • 打赏
  • 举报
回复
靠!在WM_MOVE的OnMove中添加一条语句:
SendMessageW(WM_PAINT);
这样还不行吗?
s11143 2010-08-20
  • 打赏
  • 举报
回复
Invalidate 或者直接自己抛消息
leeihcy 2010-08-20
  • 打赏
  • 举报
回复
可以参考 迅雷 弹出来的那个 对话框,应该就是背景透明(分层),然后在这层背景之上附加了一层用于放置控件的窗口,所以在拖动背景窗口的时候能发现上面那层控件窗口也在移动。

(个人还是觉得迅雷这个窗口很 e xin.. )
xiaohuh421 2010-08-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xxd_qd 的回复:]
首先说明:用Invalidate,UpdateWindow,RedrawWindodw,这些函数的一些用法,都不能在OnMove中使对话框背景重绘.
严重逻辑错误。这些东西都能让窗口重画(不信你设断点看看)。但你是想让窗口透明,靠本窗口自己来重画怎么可能画出个“透明”来?只有你窗口下面的东西重画、而你的窗口又没有重画的情况下,窗口才是“透明”的。
[/Quote]

好像是这样的...多谢提醒
xiaohuh421 2010-08-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 xianglitian 的回复:]
让窗口透明直接用LayerWindow不就好了么
做一个子母窗口联动来实现控件的不透明这是现在普遍采用的方法
如果你要自己实现恐怕不想你想的那么容易
另外
应该在OnMoving中调用Invalidate吧
[/Quote]

子母窗口联动 新东西,学习了^_^
xxd_qd 2010-08-20
  • 打赏
  • 举报
回复
首先说明:用Invalidate,UpdateWindow,RedrawWindodw,这些函数的一些用法,都不能在OnMove中使对话框背景重绘.
严重逻辑错误。这些东西都能让窗口重画(不信你设断点看看)。但你是想让窗口透明,靠本窗口自己来重画怎么可能画出个“透明”来?只有你窗口下面的东西重画、而你的窗口又没有重画的情况下,窗口才是“透明”的。
向立天 2010-08-20
  • 打赏
  • 举报
回复
让窗口透明直接用LayerWindow不就好了么
做一个子母窗口联动来实现控件的不透明这是现在普遍采用的方法
如果你要自己实现恐怕不想你想的那么容易
另外
应该在OnMoving中调用Invalidate吧
zgsdzhaolanxiang1 2010-08-20
  • 打赏
  • 举报
回复
if(nCtlColor==CTLCOLOR_DLG)
{
return (HBRUSH)GetStockObject(NULL_BRUSH);//这里 是窗口没有背景,,
}// TODO: Change any attributes of the DC here

所谓的透明只是,窗口的背景没话,,用对应屏幕的背景,,这样背景无法更新,,不能实现透明,除非一直隐藏 显示 窗口才能更新。

15,978

社区成员

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

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