对话框不能重绘问题

csl312211865 2010-04-20 02:35:52
非模态对话框D1,标题栏和最小最大关闭按钮是都自己画的,也就说没有非客户区,自己画的标题栏位蓝色,背景色为默认的银灰色。
上面有个按钮,是打开文件的(打开文件对话框D2,模态对话框),点这个按钮后,出来D2,左右移动这个对话框,D1的标题栏会被覆盖。
覆盖后,把D2再移开,就是不覆盖D1的标题栏了,但是D1的标题栏不会变回蓝色,而是默认的银灰色。
求解。
...全文
341 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2010-04-29
  • 打赏
  • 举报
回复
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面界面版关于版主结帖工作的具体办法
尹成 2010-04-21
  • 打赏
  • 举报
回复
Invalidate();
UpdateWindow(); 重绘刷新

void CChatDlg::OnPaint()
{
CPaintDC dc(this);
Graphics graphics(dc.GetSafeHdc());

CRect rcClient;
GetClientRect(&rcClient);
//内存图像和内存Graphics
Bitmap bmp(rcClient.Width(), rcClient.Height());

Graphics* buffergraphics = Graphics::FromImage(&bmp);
//画标题栏,即自己定制的标题栏
DrawHeadClient(buffergraphics, rcClient);

//把绘好的图从内存画到屏幕
graphics.DrawImage(&bmp, 0, 0, rcClient.Width(), rcClient.Height());

delete buffergraphics;
graphics.ReleaseHDC(dc.GetSafeHdc());
ReleaseDC(&dc);
}
D3DEB21 2010-04-21
  • 打赏
  • 举报
回复
在PreTranslateMessage中转发消息就可以,
调用D1::PreTranslateMessage();
csl312211865 2010-04-21
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 xianglitian 的回复:]
引用 12 楼 csl312211865 的回复:
引用 11 楼 xianglitian 的回复:
引用 9 楼 csl312211865 的回复:
引用 8 楼 xianglitian 的回复:
引用 4 楼 csl312211865 的回复:
引用 2 楼 shiliangsl0115 的回复:
LRESULT CTalking::DefWindowProc(UINT messa……
[/Quote]
void CChatDlg::OnPaint() 
{
CPaintDC dc(this);
Graphics graphics(dc.GetSafeHdc());

CRect rcClient;
GetClientRect(&rcClient);
//内存图像和内存Graphics
Bitmap bmp(rcClient.Width(), rcClient.Height());

Graphics* buffergraphics = Graphics::FromImage(&bmp);
//画标题栏,即自己定制的标题栏
DrawHeadClient(buffergraphics, rcClient);

//把绘好的图从内存画到屏幕
graphics.DrawImage(&bmp, 0, 0, rcClient.Width(), rcClient.Height());

delete buffergraphics;
graphics.ReleaseHDC(dc.GetSafeHdc());
ReleaseDC(&dc);
}
向立天 2010-04-20
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 csl312211865 的回复:]
引用 11 楼 xianglitian 的回复:
引用 9 楼 csl312211865 的回复:
引用 8 楼 xianglitian 的回复:
引用 4 楼 csl312211865 的回复:
引用 2 楼 shiliangsl0115 的回复:
LRESULT CTalking::DefWindowProc(UINT message, WPARAM wParam, LPARAM l……
[/Quote]

那就奇怪了
不应该出现这种问题啊
OnPaint代码看看
csl312211865 2010-04-20
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 xianglitian 的回复:]
引用 9 楼 csl312211865 的回复:
引用 8 楼 xianglitian 的回复:
引用 4 楼 csl312211865 的回复:
引用 2 楼 shiliangsl0115 的回复:
LRESULT CTalking::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: 在此添加专用……
[/Quote]标题栏的绘制是在OnPaint里完成的,OnEraseBkgnd直接返回的TRUE
向立天 2010-04-20
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 csl312211865 的回复:]
引用 8 楼 xianglitian 的回复:
引用 4 楼 csl312211865 的回复:
引用 2 楼 shiliangsl0115 的回复:
LRESULT CTalking::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: 在此添加专用代码和/或调用基类

LRESULT lst= ……
[/Quote]

你自绘的过程是在OnPaint里完成的么?
OnEraseBkgnd怎么处理的?
an_bachelor 2010-04-20
  • 打赏
  • 举报
回复
你可以移开后重绘制上一个被覆盖的区域 RedrawWindow之类都可以
csl312211865 2010-04-20
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 xianglitian 的回复:]
引用 4 楼 csl312211865 的回复:
引用 2 楼 shiliangsl0115 的回复:
LRESULT CTalking::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: 在此添加专用代码和/或调用基类

LRESULT lst= CDialog::DefWindowProc(me……
[/Quote]看来真是我没说清楚,D1窗口就是隐藏标题栏,并且在客服区自己绘制的标题栏
向立天 2010-04-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 csl312211865 的回复:]
引用 2 楼 shiliangsl0115 的回复:
LRESULT CTalking::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: 在此添加专用代码和/或调用基类

LRESULT lst= CDialog::DefWindowProc(message, wParam, lParam);
i……
[/Quote]

2楼的方法是正确的
你应该在D1中做类似处理
除非你是隐藏标题栏在客户区绘制而不是自绘非客户区
liumenghappy 2010-04-20
  • 打赏
  • 举报
回复
估计是消息的截获与发送问题,学习下
顺便说下,lz的头像很个性!
backwinds 2010-04-20
  • 打赏
  • 举报
回复
我也遇到了对话框重绘的问题,也在跪求答案,借宝地一游
csl312211865 2010-04-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yujia120 的回复:]
Invalidate();
UpdateWindow();
[/Quote]请问这段代码应该往哪放?
csl312211865 2010-04-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 shiliangsl0115 的回复:]
LRESULT CTalking::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: 在此添加专用代码和/或调用基类

LRESULT lst= CDialog::DefWindowProc(message, wParam, lParam);
if(!IsWindow(m_hWnd))
{
ret……
[/Quote]是不是我没说明白,我的意思是,模态对话框D2在D1上移动,D1的标题栏不能自己重绘
社会栋梁 2010-04-20
  • 打赏
  • 举报
回复
Invalidate();
UpdateWindow();
小石头0115 2010-04-20
  • 打赏
  • 举报
回复
LRESULT CTalking::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: 在此添加专用代码和/或调用基类

LRESULT lst= CDialog::DefWindowProc(message, wParam, lParam);
if(!IsWindow(m_hWnd))
{
return lst;
}
if(message==WM_MOVE || message==WM_NCPAINT||message==WM_NCACTIVATE ||message == WM_NOTIFY)
{
CDC* pWinDC = GetWindowDC();
if (pWinDC)
DrawTitleBar(pWinDC); //这里是你画标题的函数
ReleaseDC(pWinDC);
}

return lst;

}
King030609 2010-04-20
  • 打赏
  • 举报
回复
纯粹帮顶

15,979

社区成员

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

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