刷新MainFrame背景窗口

副组长 2016-11-29 12:11:27
好久没来了,大家好!
问个问题。MFC多文档,带一些CDockablePane的浮动窗口。想在创建ChildFrame之前获得MainFrame的窗口范围画点东西,要不然一大片空白不好看。可是pMainFrame->GetClientRect()得到的是整个的MainFrame的客户区,也包括了浮动窗口和Bar等区域,怎么才能得到真正的空白部分区域的大小?
还有就是往MainFrame里画的东西,记得以前在OnEraeseBkgroud就可以,现在都被刷新掉了。应该在什么时间画?
...全文
568 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
副组长 2016-12-03
  • 打赏
  • 举报
回复
果不其然,就是一个函数OnEraseMDIClientBackground()搞定,还不用自己计算剩余的空白。 有pDC了,想画就画吧。一并谢谢大家!
副组长 2016-12-03
  • 打赏
  • 举报
回复
同学们不要争嘛! 不管是给出链接的还是具体代码的,都是好同学。对楼主都有参考意义。 来这儿问问题的好处就是可以节省自己的时间和精力,大家加油啊。 OnEraseMDIClientBackground() , 这里是问题所在喽。
lonelyhacker 2016-11-29
  • 打赏
  • 举报
回复
其实我是觉得没必要去算哪个真正的空白处,算出来绘制东西上去,你浮动窗口改变位置的时候呢?不也得重新绘制,总不能改变位置后,原来的位置不绘制吧,那样就会感觉不美观。。个人想法,不喜勿喷哦。

void CMainFrame::OnPaint()
{
	//CPaintDC dc(this); // device context for painting
	// TODO: Add your message handler code here
	// Do not call CMDIFrameWndEx::OnPaint() for painting messages
	CMDIFrameWnd::OnPaint();
	CRect rc;
	CDC dc;
	dc.m_hDC = ::GetDC(this->m_hWndMDIClient);
	CBrush br(RGB(100, 0, 100) );
	dc.SelectObject(&br);
	this->GetClientRect(&rc);
	dc.PatBlt(rc.left,rc.top,rc.Width(),rc.Height(),PATCOPY);
	ReleaseDC(&dc);
}

BOOL CMainFrame::PreTranslateMessage(MSG* pMsg)
{
	// TODO: Add your specialized code here and/or call the base class
	if( (pMsg->hwnd == m_hWndMDIClient) && (pMsg->message == WM_PAINT) )
		PostMessage(WM_PAINT);
	return CMDIFrameWndEx::PreTranslateMessage(pMsg);
}

BOOL CMainFrame::OnEraseMDIClientBackground( CDC *pDC )
{
	//CMDIFrameWnd::OnPaint();
	CRect rc;
	CDC dc;
	dc.m_hDC = ::GetDC(this->m_hWndMDIClient);
	CBrush br(RGB(100, 0, 100) );
	dc.SelectObject(&br);
	this->GetClientRect(&rc);
	dc.PatBlt(rc.left,rc.top,rc.Width(),rc.Height(),PATCOPY);
	ReleaseDC(&dc);
	return TRUE;
}
lonelyhacker 2016-11-29
  • 打赏
  • 举报
回复
BOOL CMainFrame::OnEraseMDIClientBackground( CDC *pDC ) 取代以前的OnEraeseBkgroud
lonelyhacker 2016-11-29
  • 打赏
  • 举报
回复
个人想法:因为不太清楚你要求,比如你在空白处绘制了东西上去,其他浮动窗口移动的时候呢?是否需要重新获取有效空白重新绘制呢?个人想法,未经过实践。
1.GetClientRect()获取整个窗口的客户区。然后获取其他窗口和BAR的区域,把窗口和BAR的区域去除,剩下的就是你所需要的空白处。
2.OnPaint()
void CMainFrame::OnPaint()
{
//CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
// Do not call CMDIFrameWndEx::OnPaint() for painting messages
CMDIFrameWnd::OnPaint();
CRect rc;
CDC dc;
dc.m_hDC = ::GetDC(this->m_hWndMDIClient);
CBrush br(RGB(100, 0, 100) );
dc.SelectObject(&br);
this->GetClientRect(&rc); //这里需要算你要显示的区域
dc.PatBlt(rc.left-50,rc.top-40,rc.Width()-200,rc.Height()-200,PATCOPY);
ReleaseDC(&dc);
}
3.在PreTranslateMessage中添加下列内容
BOOL CMainFrame::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if( (pMsg->hwnd == m_hWndMDIClient) && (pMsg->message == WM_PAINT) )
PostMessage(WM_PAINT);
return CMDIFrameWndEx::PreTranslateMessage(pMsg);
}
孤客天涯 2016-11-29
  • 打赏
  • 举报
回复
重载 virtual BOOL OnEraseMDIClientBackground (CDC* pDC);
zengzhuan7760 2016-11-29
  • 打赏
  • 举报
回复
引用 7 楼 zhao4zhong1 的回复:
[quote=引用 5 楼 zengzhuan7760 的回复:] [quote=引用 4 楼 zhao4zhong1 的回复:] 仅供参考: Codejock.Xtreme.Toolkit.Pro.v15.3.1.Full.Source.Retail.Incl.Keymaker-ZWT.rar
这货又来灌水了[/quote] 如果谁真的逐个看过这里面的每行代码,我相信他就不会再问楼主所问的问题了。[/quote] 好比一个学生问老师问题,老师说你把书逐字逐句看一遍就不会有疑问了。那要老师 何用,师者,传达授业解惑。况且你根本不算老师,你可以不回答,我相信来CSDN问问题的人,都是经过自己 思索,还不得解决方法的人,渴望得到帮助的人。我满怀期待的等待答案,看到回答的人是你,我的心就凉了。 我就知道不会从你那里得到解决方案。请不要浪费CSDN的服务器存放你那几字节的无用陈述。 我来CSDN不太长时间,发现基本每个帖子你都回答,但你的回答全部解决不了问题。 我随便点了几个有你的回答,你自己看你都回答的什么玩意 这是什么,浙能解决什么。
引用
请牢记:源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要,重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。
这不是凑数是干啥
引用
空杯心态
谁知道这是什么鬼
引用
Codejock.Xtreme.Toolkit.Pro.v15.3.1.Full.Source.Retail.Incl.Keymaker-ZWT.rar
你好自为之吧
赵4老师 2016-11-29
  • 打赏
  • 举报
回复
引用 6 楼 zengzhuan7760 的回复:
[quote=引用 4 楼 zhao4zhong1 的回复:] 仅供参考: Codejock.Xtreme.Toolkit.Pro.v15.3.1.Full.Source.Retail.Incl.Keymaker-ZWT.rar
广海有个叫 源代码 的跟你一样一样的。[/quote] 那又能说明什么问题呢?
赵4老师 2016-11-29
  • 打赏
  • 举报
回复
引用 5 楼 zengzhuan7760 的回复:
[quote=引用 4 楼 zhao4zhong1 的回复:] 仅供参考: Codejock.Xtreme.Toolkit.Pro.v15.3.1.Full.Source.Retail.Incl.Keymaker-ZWT.rar
这货又来灌水了[/quote] 如果谁真的逐个看过这里面的每行代码,我相信他就不会再问楼主所问的问题了。
zengzhuan7760 2016-11-29
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
仅供参考: Codejock.Xtreme.Toolkit.Pro.v15.3.1.Full.Source.Retail.Incl.Keymaker-ZWT.rar
广海有个叫 源代码 的跟你一样一样的。
zengzhuan7760 2016-11-29
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
仅供参考: Codejock.Xtreme.Toolkit.Pro.v15.3.1.Full.Source.Retail.Incl.Keymaker-ZWT.rar
这货又来灌水了
赵4老师 2016-11-29
  • 打赏
  • 举报
回复
仅供参考: Codejock.Xtreme.Toolkit.Pro.v15.3.1.Full.Source.Retail.Incl.Keymaker-ZWT.rar
副组长 2016-11-29
  • 打赏
  • 举报
回复
没法确定除去浮动窗口以外剩下区域的大小。
副组长 2016-11-29
  • 打赏
  • 举报
回复
是的,以前的就是这个样子的,贴上一个Window。可是现在加上浮动窗口和RIBON BAR什么的,这个方法就不灵了呢?

15,980

社区成员

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

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