程序边画图边显示其他信息的问题

wwzlgxwhx 2008-12-24 03:45:27
我做了一个程序,实现连续画多个点,每画一个点,在textbox框中显示该点的坐标信息,然后再画第二个点,这两个点之间需要有几秒钟的延时,我用sleep实现延时。
现在可以实现连续画点,每两个点之间有延时,但是在textbox框中只显示最后一个点的坐标,其他点的坐标都不显示。在画点的时候textbox没有反应。这种问题如何解决?先谢谢了。
...全文
144 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
wwzlgxwhx 2009-01-13
  • 打赏
  • 举报
回复
解决了,过年之前散分!
路人乙2019 2008-12-27
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 gswwn 的回复:]
顺便请教各位专家一个小问题:
在其他类中定义如下:
CTestdlg test;
test.m_qd.ShowWindow(SW_SHOW);
提示最后一句出错:
assert(::IsWindow(m_hwnd))
这是什么意思啊?如何解决?谢谢!
[/Quote]
是大写的吧?这个是断言,只有()里的值为真才继续执行,否则暂停。
zzz822163 2008-12-27
  • 打赏
  • 举报
回复
CTestDlg *test=new CTestDlg;
  test->Create(IDD_TEST_DLG,NULL);
  test->m_qd.ShowWindows(SW_SHOW);

gswwn 2008-12-26
  • 打赏
  • 举报
回复
顺便请教各位专家一个小问题:
在其他类中定义如下:
CTestdlg test;
test.m_qd.ShowWindow(SW_SHOW);
提示最后一句出错:
assert(::IsWindow(m_hwnd))
这是什么意思啊?如何解决?谢谢!
gswwn 2008-12-26
  • 打赏
  • 举报
回复
大方向采用楼上的就可以。但是需要定义一个公共变量记录点的个数,每执行一次timer,此变量增加1,可以实现点之间的延迟。
Tinary3v0 2008-12-24
  • 打赏
  • 举报
回复
很简单 不要用Sleep 用定时 使用内存绘图 用不到线程那么麻烦

简单说一下过程:
定义数组 CPoint pt[100]; //这里还可以使用CArray类来设定自增长度数组
定义点个数 int Nm; //初始化时 设定 Nm =0;

在OnPaint或者OnDraw里面:
直接绘制:
for(int i = 0; i< Nm; i ++ )
{
pDC->Ellipse( pt[i].x-1, pt[i].y-1, pt[i].x+1, pt[i].y+1 );//半径为1的圆
}


设定定时器 SetTimer(1,500,NULL); //找适当的位置 例如按钮触发开始计时 设定定时间隔为你需要的间隔
然后在OnTimer事件中,以Dialog为例:
void C**Dlg::OnTimer(UINT_PTR nIDEvent)
{
Nm++;
//-----------------更新控件显示信息-----将Edit设定为MultiLine-------------------
CString NwTx;
NwTx.Format("第%d点 X坐标:%d,Y坐标:%d",Nm,pt[Nm-1].x,pt[Nm-1].y ); //新点信息

CString strTemp;
GetDlgItemText( EditID, strTemp ); //以前点信息
NwTx += "\r\n";
NwTx += strTemp; //相加
SetDlgItemText( EditID, NwTx ); //重新设定Edit内容

//-----------------内存绘图-----------------------------------------------------------

CDC *pdc=this->GetDC();
CDC MenDC;
CBitmap bm;

CRect rt;
GetClientRect(&rt);
MenDC.CreateCompatibleDC(pdc);
bm.CreateCompatibleBitmap(pdc,rt.Width(),rt.Height());
MenDC.SelectObject(&bm);
//-------------------------------------------------------------------
MenDC.FillSolidRect(0,0,rt.Width(),rt.Height(),RGB(255,255,255)); //用白色清屏
for(int i = 0; i< Nm; i ++ )
{
MenDC.Ellipse( pt[i].x-1, pt[i].y-1, pt[i].x+1, pt[i].y+1 ); //用内存DC绘图
}
//-------------------------------------------------------------------
pdc->BitBlt(0,0,rt.Width(),rt.Height(),&MenDC,0,0,SRCCOPY); //贴回屏幕DC
MenDC.DeleteDC();
bm.DeleteObject();
ReleaseDC(pdc);
//-------------------------------------------------------------------------------------------
CDialog::OnTimer(nIDEvent);
}


基本过程就是这样啦 代码大部分直接手写的 可能有错误。
wzaen 2008-12-24
  • 打赏
  • 举报
回复
不知道画点怎么处理的?
1.用计时器,画完一个点,计时,时间到,画下一个点。
2.如果无法拆分每个点的操作而需要在一个过程里面处理,那采用线程的处理方式。
wwzlgxwhx 2008-12-24
  • 打赏
  • 举报
回复
用双缓冲技术可以实现吗?如果可以实现,如何实现?
hxyman 2008-12-24
  • 打赏
  • 举报
回复
创建一个线程。在线程中进行画点操作,在线程中sleep,画完一个点postmessage给窗口,让窗口对textbox进行修改。

------------------------------------
Posted By EasyCsdn1.0
wwzlgxwhx 2008-12-24
  • 打赏
  • 举报
回复
在线等
wwzlgxwhx 2008-12-24
  • 打赏
  • 举报
回复
楼上的,那用什么方法能解决这个问题?
wzaen 2008-12-24
  • 打赏
  • 举报
回复
sleep的时候,主线程阻塞住了,窗口没有处理消息,于是没有刷新。

19,464

社区成员

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

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