VS2010 MFC 对话框程序中的控件IDC_STATIC_DRAW1(Picture Control)图层问题2--死循环

谁帮我看看,我想在图片控件上画图,把绘图函数放进onpaint ,结果死循环了。为啥?咋处理?
以下代码死循环了

void CMyCKTXDlg::OnPaint()
{
    DrawArc();//(&dc);
    //Invalidate();

    return;
    }
void CMyCKTXDlg::DrawArc() 
{
    CRect ViewRect;
    CWnd *pWin = GetDlgItem(IDC_STATIC);//获取该控件的指针,就可以对该控件直接操作了
    pWin->GetClientRect(ViewRect);//把控件的长宽、坐标等信息保存在rect里
    //int width=ViewRect.Width();//可以获取宽和高
    //int height=ViewRect.Height();
    CDC *pDC = pWin->GetDC();//获取该控件的画布
    //有了画布,下面可以自由的画图了,想怎么画就怎么话
        CBrush brush;
    brush.CreateSolidBrush(RGB(255,255,255)/*::GetSysColor(COLOR_3DSHADOW)*/);
    pDC->SelectObject(&brush);
    pDC->Rectangle(10,10,ViewEndX,ViewEndY);
    }

同样的代码放在其他地方,比如:OnBnClickedButton1,就没事,可以在图片控件上绘图

void Ctest11Dlg::OnBnClickedButton1()
{
    // TODO: 在此添加控件通知处理程序代码
    CRect rect;
    CWnd *pWin = GetDlgItem(IDC_STATIC);//获取该控件的指针,就可以对该控件直接操作了
    pWin->GetClientRect(rect);//把控件的长宽、坐标等信息保存在rect里
    int width=rect.Width();//可以获取宽和高
    int height=rect.Height();
    CDC *pDc = pWin->GetDC();//获取该控件的画布
    //有了画布,下面可以自由的画图了,想怎么画就怎么话,
    CBrush Brush;
    Brush.CreateSolidBrush(RGB(192,250,233));
    pDc->SelectObject(&Brush);
    pDc->Rectangle(0,0,width,height);
}
c++
phenix2009
白色一大坨 回复lnhv013710: 多谢题主采纳,我看你一直在问类似问题,我也是做这方面的,你有兴趣可以加个联系方式,企鹅 465617727,有问题我好支持一下你
大约一年之前 回复
phenix2009
白色一大坨 回复lnhv013710: 老兄,你放那里肯定不断刷新,要是想解决,就是加个bool变量,初始化true,执行一次以后变成false,然后判断如果是false不执行,就可以了,不过我不建议你把想执行一次的代码放在刷新函数里面
大约一年之前 回复
lnhv013710
lnhv013710 回复白色一大坨: 代码就那些,没有更多的了,就是在onpaint函数内创建一个static picture上绘图
大约一年之前 回复
lnhv013710
lnhv013710 回复白色一大坨: 抱歉,最近忙一直没有过来看,我想您没有解决我的疑问啊。
大约一年之前 回复
phenix2009
白色一大坨 题主,有问题说,没问题结贴
大约一年之前 回复
phenix2009
白色一大坨 请早日回应
大约一年之前 回复
phenix2009
白色一大坨 题主既然不肯发代码,我自己跑了一下请题主看看,代码用的就是你的,并未有什么死循环问题。
大约一年之前 回复
phenix2009
白色一大坨 发代码我调试一下
大约一年之前 回复

3个回答

既然题主不肯发代码,那么我自己试了一下,由于ViewEndX,ViewEndY这两个变量出处不明,我暂且改为获取控件的宽高,我想这块应该不是重点,代码如下:

void CMFCApplication1Dlg::DrawArc()
{
    CRect ViewRect;
    CWnd *pWin = GetDlgItem(IDC_STATIC);//获取该控件的指针,就可以对该控件直接操作了
    pWin->GetClientRect(ViewRect);//把控件的长宽、坐标等信息保存在rect里
    int width=ViewRect.Width();//可以获取宽和高
    int height=ViewRect.Height();
    CDC *pDC = pWin->GetDC();//获取该控件的画布
    //有了画布,下面可以自由的画图了,想怎么画就怎么话
    CBrush brush;
    brush.CreateSolidBrush(RGB(255, 255, 255)/*::GetSysColor(COLOR_3DSHADOW)*/);
    pDC->SelectObject(&brush);
    pDC->Rectangle(10, 10, width, height);
}


void CMFCApplication1Dlg::OnPaint()
{
    DrawArc();
    OutputDebugString("OnPaint\n");
}


而效果就是程序不停的在界面上画矩形,OnPaint不停运行绘图:
图片说明

不知题主说的死循环是什么意思,但我这块的确也实现了实时绘图,并没有什么问题,代码区别出了那两个未设置变量,其他地方都是一致的,那么请题主看一下,指出具体问题,我也好继续协助排查。

phenix2009
白色一大坨 回复lnhv013710: onpaint是刷新界面的,这个不是死循环,只是你用法不对,如果你真想放这个里面,也可以定义一个变量,初始化时候一个状态,执行之后,换另外一个状态,来控制是否执行这些程序
大约一年之前 回复
phenix2009
白色一大坨 回复lnhv013710: 这个很正常啊,你放在这里肯定就会不停的刷新,如果你想执行一次,那么放在初始化界面的OnInitDialog或者其他什么地方
大约一年之前 回复
lnhv013710
lnhv013710 哈哈,我说的死循环就是不停的执行onpaint,但我只需要执行一次就停止。
大约一年之前 回复
dabocaiqq
穷在人世中少你左右我想我连什么价值也没有 你的程序根本不能解决楼主的问题,就这样还想要分?
大约一年之前 回复
phenix2009
白色一大坨 请题主早日回应
大约一年之前 回复

代码没有贴完整。

建议你在死循环的时候中断程序进行调试。重点看下调用堆栈窗口(Call Stack Window)
你这个代码很可能是造成无限递归了
也就是说在Paint里面画图的时候触发了窗口移动、显示、刷新之类的代码,导致它又产生了新的Paint消息,……以此类推,不断调用OnPaint

caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复lnhv013710: 把完整代码放在网盘我看下吧。肯定要调试了才知道。
大约一年之前 回复
lnhv013710
lnhv013710 我不想这样哦,没有根本解决问题,还有为啥死循环了,如何完美的在图片控件上画图,在onpaint内
大约一年之前 回复
caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复lnhv013710: 不然你这样,定义一个ispainting的bool成员变量,在你的paint代码开头写if (ispainting) return; ispainting = true; 结尾写ispainting = false;
大约一年之前 回复
lnhv013710
lnhv013710 我更新了代码,这下看起来是完整的,在函数中的DrawArc() pDC->Rectangle(10,10,ViewEndX,ViewEndY);又调回了onpaint
大约一年之前 回复

可以用paint去调用下按钮实现,如果按钮可以的话

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问