【求助】绘图被其他窗口覆盖后消失

Squall001 2014-04-08 05:59:43
我在一个对话框里面画了图,具体就是点一个按钮,然后在这个按钮里面用Invalidate(false); 然后在OnPaint()里面画图,画好了过后,正常,但是只要拖动其他窗口遮住画图的地方,或者把对话框最小化,再恢复,画图的东西就全部不在了。又要重画才有,这个怎么解决?

下面是我画图的方法 我直接在对话框上面画图的 没有像其他那样 拖放static控件上去,然后在static控件上面画图,而是直接画,下面是代码

引用 7 楼 gz_qmc 的回复:
///////////////////////////////////////////////////////////////////////////////////////////////////
//
// cx和cy 表示圆心, r表示半径,sc是外圆颜色,fc是填充颜色
// needfill表示是否填充,填充就是画实心圆,不填充就画空心圆
//
//////////////////////////////////////////////////////////////////////////////////////////////////
void CXXXXXDlg::Circle(CDC *pDC,int cx, int cy, int r, COLORREF sc, COLORREF fc, BOOL needfill)
{
CRect rect(cx,cy,cx,cy);
rect.InflateRect(r,r,r,r);
CPen p,*op;
CBrush b,*ob;

p.CreatePen(0,1,sc);
op=pDC->SelectObject(&p);

if(needfill)
{
b.CreateSolidBrush(fc);
ob=pDC->SelectObject(&b);
pDC->Ellipse(rect);
pDC->SelectObject(ob);
b.DeleteObject();
}
else pDC->Arc(rect,rect.TopLeft(),rect.TopLeft());

pDC->SelectObject(op);
p.DeleteObject();
}


那么调用就简单了
void CXXXXXDlg::OnPaint() 
{
CPaintDC dc(this);

Circle(&dc,100,100,25,RGB(0,0,0),0,FALSE);
Circle(&dc,100,200,25,RGB(255,0,0),RGB(255,0,0),TRUE);
Circle(&dc,200,100,25,RGB(0,255,0),RGB(0,255,0),TRUE);
}
...全文
131 点赞 收藏 11
写回复
11 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
kuankuan_qiao 2014-04-09
引用 7 楼 Squall001 的回复:
[quote=引用 6 楼 dingxz105090 的回复:] 那把你【产生过后再画图并更新界面】的代码贴出来看看
我现在知道了 任何重绘消息都会触发OnPaint函数。我在OnPaint里面做了条件判断的 也就是说在按钮按下的时候才判断出画图

void CADConvertDlg::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	if( ((CButton *)GetDlgItem(IDC_CHECK_StartAndStop))->GetCheck() )
		if( ((CButton *)GetDlgItem(IDC_CHECK_EnableAD1))->GetCheck() )
	{			
			Device1Paint(&dc);
	}
}
所以我只有在OnPaint() 里面画个“底板"的图形,然后再在后面加上以上代码 [/quote]哈哈
回复
schlafenhamster 2014-04-09
参考"RGB相加混色.rar" 0 分 http://download.csdn.net/detail/schlafenhamster/4480304 "显示 RGB 相加混色过程。红绿蓝3个园重合时,显示相加后的颜色。"
回复
schlafenhamster 2014-04-09
闪是因为 擦除背景, 在erasebackground 中, return true
回复
Squall001 2014-04-08
引用 5 楼 schlafenhamster 的回复:
为什么用Invalidate(false); ? 用Invalidate();
用用Invalidate(false); 不会闪
回复
Squall001 2014-04-08
引用 6 楼 dingxz105090 的回复:
那把你【产生过后再画图并更新界面】的代码贴出来看看
我现在知道了 任何重绘消息都会触发OnPaint函数。我在OnPaint里面做了条件判断的 也就是说在按钮按下的时候才判断出画图

void CADConvertDlg::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	if( ((CButton *)GetDlgItem(IDC_CHECK_StartAndStop))->GetCheck() )
		if( ((CButton *)GetDlgItem(IDC_CHECK_EnableAD1))->GetCheck() )
	{			
			Device1Paint(&dc);
	}
}
所以我只有在OnPaint() 里面画个“底板"的图形,然后再在后面加上以上代码
回复
凌乱哥 2014-04-08
引用 3 楼 Squall001 的回复:
也就是说在窗口产生前就去绘制好,那么就不会消失,只要产生过后再画图,就会消失
那把你【产生过后再画图并更新界面】的代码贴出来看看
回复
schlafenhamster 2014-04-08
为什么用Invalidate(false); ? 用Invalidate();
回复
hushoubo 2014-04-08
我把楼主的代码测试了一下,不存在楼主说的情况
回复
Squall001 2014-04-08
引用 2 楼 dingxz105090 的回复:
如果你的所有绘制都是在OnPaint里做的,肯定不会出现那样的情况 你1楼给的链接的帖子里也写了: 但是如果有别的窗口覆盖了我的对话框,按键中画出的新数值就消失了,只剩下原来在OnPaint函数里画的数值了 说明Onpaint里是肯定不会消失的
并不是这样的,即使所有绘图都在OnPaint里做,也会消失,不会消失的情况是在OnInitDialog()里面调用OnPaint就不会消失。也就是说在窗口产生前就去绘制好,那么就不会消失,只要产生过后再画图,就会消失
回复
凌乱哥 2014-04-08
如果你的所有绘制都是在OnPaint里做的,肯定不会出现那样的情况 你1楼给的链接的帖子里也写了: 但是如果有别的窗口覆盖了我的对话框,按键中画出的新数值就消失了,只剩下原来在OnPaint函数里画的数值了 说明Onpaint里是肯定不会消失的
回复
Squall001 2014-04-08
我和以下这个帖子的情况一样 http://bbs.csdn.net/topics/310127402 但是,这个帖子的13楼看来 貌似也没有解决问题,
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2014-04-08 05:59
社区公告

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