谁帮我看看,我想在图片控件上画图,把绘图函数放进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);
}
既然题主不肯发代码,那么我自己试了一下,由于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不停运行绘图:
不知题主说的死循环是什么意思,但我这块的确也实现了实时绘图,并没有什么问题,代码区别出了那两个未设置变量,其他地方都是一致的,那么请题主看一下,指出具体问题,我也好继续协助排查。
代码没有贴完整。
建议你在死循环的时候中断程序进行调试。重点看下调用堆栈窗口(Call Stack Window)
你这个代码很可能是造成无限递归了
也就是说在Paint里面画图的时候触发了窗口移动、显示、刷新之类的代码,导致它又产生了新的Paint消息,……以此类推,不断调用OnPaint
可以用paint去调用下按钮实现,如果按钮可以的话