MFC GroupBox闪烁问题

removefile 2016-03-27 01:00:33
工具是VS2013,系统是WIN10, 对话框缩放调整大小时,对话框上面的GroupBox控件狂闪,其它控件都处理好了不会闪,就这个GroupBox搞不定,这个控件是不是有点特别啊,求教大牛指点一二
...全文
170 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
removefile 2016-04-17
  • 打赏
  • 举报
回复
groupbox确实是空的,除了标题外。现在问题解决了,groupbox不加TRANSPARENT属样式,在FormView的OnCtlColor中获取groupbox的ClientRect,然后FillSolidRect就OK了。感谢各位的热心帮助
schlafenhamster 2016-04-05
  • 打赏
  • 举报
回复
groupbox 只有“Group” 标题 可以 是 bmp ico 等 , 其他 地方 是 空的 (放 别 的控件的 radio 等)
removefile 2016-04-04
  • 打赏
  • 举报
回复
引用 10 楼 schlafenhamster 的回复:
“groupbox不设置transparent样式的话FormView不会绘制它” ? FormView 加了CLIPCHILDREN样式,, 那么 主窗口 擦除时,主窗口 上 groupbox 那块 区域 不会被 擦除,但 groupbox 还是 会 repaint
我这个怎么没有重绘呢?不设置transparent样式,groupbox是黑色的,难道groupbox默认就是一个黑底的框吗?
schlafenhamster 2016-04-03
  • 打赏
  • 举报
回复
“groupbox不设置transparent样式的话FormView不会绘制它” ? FormView 加了CLIPCHILDREN样式,, 那么 主窗口 擦除时,主窗口 上 groupbox 那块 区域 不会被 擦除,但 groupbox 还是 会 repaint
removefile 2016-04-03
  • 打赏
  • 举报
回复
groupbox直接拖上去的,只改了TRANSPARENT为TRUE,其它都没动
removefile 2016-04-03
  • 打赏
  • 举报
回复
但是static text 和 gtoupbox效果就是不一样,虽然都是cstatic,groupbox不设置transparent样式的话FormView不会绘制它,因为FormView加了CLIPCHILDREN样式,FormView上几有TAB控件,TAB控件又添加了有对话框,对话框上又有其它控件,所以加了CLIPCHILDREN样式,不然闪所有控件都狂闪,加了CLIPCHILDREN样式后,只有groupbox还在闪,其它都很乖
schlafenhamster 2016-04-03
  • 打赏
  • 举报
回复
你的 GroupBox style 是 什么 ?
schlafenhamster 2016-04-03
  • 打赏
  • 举报
回复
”GroupBox控件狂闪“ GroupBox控件是个 cstatic
schlafenhamster 2016-04-03
  • 打赏
  • 举报
回复
vc6 可以 控件 没有 TRANSPARENT 样式 而且控件多(cstatic)的话,效果最好
removefile 2016-04-03
  • 打赏
  • 举报
回复
这样做要将所有控件加上TRANSPARENT样式,而且控件多的话,效果不是很好
schlafenhamster 2016-03-28
  • 打赏
  • 举报
回复
主要 就是 2个函数

void CSizingFormViewView::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
// get size , 
	CRect rc;
	GetWindowRect(&rc);
	rc.OffsetRect(-rc.left,-rc.top);
#ifndef VIEW_NO_BORDER
	rc.OffsetRect(-2,-2);// offset -2,-2
#endif
// Create a compatible memory DC 
	CDC memDC;
	memDC.CreateCompatibleDC(&dc);
// Select a compatible bitmap into the memory DC
	CBitmap bitmap;
	bitmap.CreateCompatibleBitmap( &dc, rc.Width(), rc.Height());
	HBITMAP oldBmp=(HBITMAP)memDC.SelectObject(&bitmap);
// Erase bkg
	memDC.FillSolidRect(&rc,GetSysColor(COLOR_MENU));// RGB(210,210,210));
// Let the dialog draw into memDC.
	SendMessage(WM_PRINT,(WPARAM)memDC.m_hDC,
				(LPARAM)(PRF_CHILDREN | PRF_CLIENT ));//| PRF_NONCLIENT | PRF_ERASEBKGND | PRF_OWNED));
// copy to CB for checking
#ifdef TEST
	memDC.SelectObject(oldBmp);
	OpenClipboard();
	EmptyClipboard(); 
	SetClipboardData(CF_BITMAP,bitmap);
	CloseClipboard();
	oldBmp=(HBITMAP)memDC.SelectObject(&bitmap);
#endif
	dc.BitBlt(rc.left,rc.top, rc.Width(), rc.Height(),&memDC,0,0,SRCCOPY);
// set back
	memDC.SelectObject(oldBmp);
// free
	DeleteObject(bitmap.m_hObject);
	DeleteObject(memDC);
// do not draw all Ctls !
#if 1
	UINT id=0;
	CWnd *pWnd=0;
//
	pWnd=GetDlgItem(IDC_BUTTON1);
	pWnd->GetClientRect(&rc);
	pWnd->ValidateRect(&rc);
//
	pWnd=GetDlgItem(IDC_BUTTON2);
	pWnd->GetClientRect(&rc);
	pWnd->ValidateRect(&rc);
//
	pWnd=GetDlgItem(IDC_GROUP);
	pWnd->GetClientRect(&rc);
	pWnd->ValidateRect(&rc);
//
	pWnd=GetDlgItem(IDC_RADIO1);
	pWnd->GetClientRect(&rc);
	pWnd->ValidateRect(&rc);
//
	pWnd=GetDlgItem(IDC_RADIO2);
	pWnd->GetClientRect(&rc);
	pWnd->ValidateRect(&rc);
// 
	pWnd=GetDlgItem(IDC_STATIC1);
	pWnd->GetClientRect(&rc);
	pWnd->ValidateRect(&rc);
//
	pWnd=GetDlgItem(IDC_PICTURE);
	pWnd->GetClientRect(&rc);
	pWnd->ValidateRect(&rc);
//
	pWnd=GetDlgItem(IDC_EDIT1);
	pWnd->GetClientRect(&rc);
	pWnd->ValidateRect(&rc);
//
	pWnd=GetDlgItem(IDC_EDIT2);
	pWnd->GetClientRect(&rc);
	pWnd->ValidateRect(&rc);
//
	pWnd=GetDlgItem(IDC_EDIT3);
	pWnd->GetClientRect(&rc);
	pWnd->ValidateRect(&rc);
//
	pWnd=GetDlgItem(IDC_EDIT4);
	pWnd->GetClientRect(&rc);
	pWnd->ValidateRect(&rc);
#endif
//	CFormView::OnPaint();
}

BOOL CSizingFormViewView::OnEraseBkgnd(CDC* pDC) 
{
	// TODO: Add your message handler code here and/or call default
	return TRUE;
//	return CFormView::OnEraseBkgnd(pDC);
}
OnPaint 中 // Let the dialog draw into memDC. SendMessage(WM_PRINT,(WPARAM)memDC.m_hDC, (LPARAM)(PRF_CHILDREN | PRF_CLIENT ));//| PRF_NONCLIENT | PRF_ERASEBKGND | PRF_OWNED)); 是 把 窗口 所有的 东西 画一遍,因为 各个控件 已经 画好了 , 所以 要 把 所有控件 都 变为 窗口 有效。 即 // do not draw all Ctls ! #if 1 UINT id=0; CWnd *pWnd=0; 。。。。。。
removefile 2016-03-27
  • 打赏
  • 举报
回复
还是不行啊,这样做GroupBox不闪了,其它控件绘制出问题
schlafenhamster 2016-03-27
  • 打赏
  • 举报
回复
参考 “ CFormView 在改变大小时,控件闪烁的问题” http://blog.csdn.net/schlafenhamster/article/details/49885731

16,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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