更新控件位置,界面刷新问题

chinatjlzy 2016-08-23 10:30:47
因项目需要窗口最大化,做了一个更新控件位置的程序,发现在更新过程中,重绘有顺序,比如以一个bmp图片作为背景,之上有其他控件,如文本框、按键等等,最大化、还原过程中会出现闪烁的情况。个人猜测与重绘的顺序有关,请教大家这个是什么原因,如何解决?有问题的源程序如下:http://download.csdn.net/detail/chinatjlzy/9609070,频繁最大化、还原会看出控件闪烁。

再有就是界面文本框需要实时更新数据,采用定时器刷新的方式,但是会闪烁,之前自绘界面的时候做过双缓冲,这种文本框、按键控件的需要怎么弄?
谢谢
...全文
646 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2016-08-30
  • 打赏
  • 举报
回复
那个图片控件去掉了: init: //加载背景图片 m_hBitmapBK= ::LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BMP_BK)); bFirstRun = TRUE; 、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、 paint: if(m_hBitmapBK) { CPaintDC dc(this); // device context for painting CRect rc; GetClientRect(rc); CDC memDC; memDC.CreateCompatibleDC(&dc); HBITMAP old=(HBITMAP)memDC.SelectObject(m_hBitmapBK); dc.BitBlt(0,0,rc.Width(),rc.Height(),&memDC,0,0,SRCCOPY); memDC.SelectObject(old); } 、、、、、、、、、、、 BOOL CCenterDlg::OnEraseBkgnd(CDC* pDC) { // TODO: Add your message handler code here and/or call default return TRUE; // return CDialog::OnEraseBkgnd(pDC); }
schlafenhamster 2016-08-30
  • 打赏
  • 举报
回复
改了改:

void CCenterDlg::OnSize(UINT nType, int cx, int cy) 
{
	CDialog::OnSize(nType, cx, cy);
	CRect rcTmp;
	int iControlCount = 1;
	LockWindowUpdate( );
//
	if (nType == SIZE_RESTORED)// =0
	{
		int iCaptionHeight = GetSystemMetrics(SM_CYCAPTION);
		iCaptionHeight +=3;
		
		CWnd* pWnd = GetTopWindow();
		while(pWnd != NULL) 
		{ 
			int ID = pWnd->GetDlgCtrlID();
			rcTmp=rcOrig[iControlCount];
			rcTmp.top   -= (rcOrig[0].top+iCaptionHeight);
			rcTmp.bottom-= (rcOrig[0].top+iCaptionHeight);
			rcTmp.left  -= (rcOrig[0].left+3);
			rcTmp.right -= (rcOrig[0].left+3);
			pWnd->MoveWindow(&rcTmp,FALSE);
//
			pWnd = pWnd->GetNextWindow();
			iControlCount++;
		}
	}
//
	if (nType == SIZE_MAXIMIZED)// =2
	{
		int iCaptionHeight = GetSystemMetrics(SM_CYCAPTION);
		CWnd* pWnd = GetTopWindow();
		while(pWnd != NULL) 
		{ 
			rcTmp=rcOrig[iControlCount];
			rcTmp.top    -= iCaptionHeight;
			rcTmp.bottom -= iCaptionHeight;
			pWnd->MoveWindow(&rcTmp,FALSE);
//
			pWnd = pWnd->GetNextWindow();
			iControlCount++;
		}
	}
	UnlockWindowUpdate( );
}
schlafenhamster 2016-08-30
  • 打赏
  • 举报
回复
每个控件 MoveWindow 使窗口不停的 Update 试试 红色 部分 void CCenterDlg::OnSize(UINT nType, int cx, int cy) { CDialog::OnSize(nType, cx, cy); int iControlCount = 1; //还原 LockWindowUpdate( ); ....... UnlockWindowUpdate( ); }
凌乱哥 2016-08-24
  • 打赏
  • 举报
回复
1.觉得闪烁不是很严重 2.至于位置问题,建议在OnSize中用代码计算各个控件的位置、相互间隙、大小、比例等等,只要写好这些值,怎么变化大小都没问题 3.你可以百度下EasySize的使用,比如比如这个
schlafenhamster 2016-08-24
  • 打赏
  • 举报
回复
不只是 闪烁 问题!
schlafenhamster 2016-08-24
  • 打赏
  • 举报
回复
开始

最大化后
叶恭介叶恭介 2016-08-24
  • 打赏
  • 举报
回复
最大化、还原过程中会出现闪烁的情况 下了代码,没觉得有多么的闪烁,闪一下,这是正常的吧。
schlafenhamster 2016-08-24
  • 打赏
  • 举报
回复
下载看看再说
大树学长 2016-08-24
  • 打赏
  • 举报
回复
如果窗口要最大化显示,没有别的要求,那么将窗口大小就一直设置为最大化界面,背景图片和控件一起刷新闪烁,可以使用区域刷新,控件被遮住的背景部分图片区域不刷新。 文本框更新数据使用Up什么(true)和Up什么(false)那个函数啊,不是真刷新控件
zgl7903 2016-08-24
  • 打赏
  • 举报
回复
父窗口选择 WS_CLIPCHILDREN 剪裁属性

15,979

社区成员

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

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