MFC 绘制折线一直狂闪 invalidate函数是不是用错了?
voidCThreedrawView::OnDraw(CDC*pDC){CThreedrawDoc*pDoc=GetDocument();ASSERT_VALID(pDo...
void CThreedrawView::OnDraw(CDC* pDC)
{
CThreedrawDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
if (m_PressLine)
{
CPoint pt;
int size;
size=linepts.GetSize();
pDC->MoveTo(linestartpt);
for (int i=0;i<size;i++)
{
pt=(CPoint)linepts.GetAt(i);
pDC->LineTo(pt);
}
Invalidate();
}
}
请问是怎么回事??? 展开
{
CThreedrawDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
if (m_PressLine)
{
CPoint pt;
int size;
size=linepts.GetSize();
pDC->MoveTo(linestartpt);
for (int i=0;i<size;i++)
{
pt=(CPoint)linepts.GetAt(i);
pDC->LineTo(pt);
}
Invalidate();
}
}
请问是怎么回事??? 展开
1个回答
展开全部
Invalidate(); 这是就是让系统调用OnDraw()的。
你把Invalidate(); 写在OnDraw()里面,如果一旦OnDraw被调用。就相当于一个死循环。
百科里抄的:
void Invalidate( BOOL bErase = TRUE );
参数: bErase 决定了是否要在WM_PAINT消息前发送WN_ERASEBKGND
该函数的作用是使整个窗口客户区无效。窗口的客户区无效意味着需要重绘,例如,如果一个被其它窗口遮住的窗口变成了前台窗口,那么原来被遮住的部分就是无效的,需要重绘。这时Windows会在应用程序的消息队列中放置WM_PAINT消息。MFC为窗口类提供了WM_PAINT的消息处理函数OnPaint,OnPaint负责重绘窗口。视图类有一些例外,在视图类的OnPaint函数中调用了OnDraw函数,实际的重绘工作由OnDraw来完成。参数bErase为TRUE时,重绘区域内的背景将被擦除,否则,背景将保持不变。
相当于
Invalidate -> OnPaint ->OnDraw
你把Invalidate(); 写在OnDraw()里面,如果一旦OnDraw被调用。就相当于一个死循环。
百科里抄的:
void Invalidate( BOOL bErase = TRUE );
参数: bErase 决定了是否要在WM_PAINT消息前发送WN_ERASEBKGND
该函数的作用是使整个窗口客户区无效。窗口的客户区无效意味着需要重绘,例如,如果一个被其它窗口遮住的窗口变成了前台窗口,那么原来被遮住的部分就是无效的,需要重绘。这时Windows会在应用程序的消息队列中放置WM_PAINT消息。MFC为窗口类提供了WM_PAINT的消息处理函数OnPaint,OnPaint负责重绘窗口。视图类有一些例外,在视图类的OnPaint函数中调用了OnDraw函数,实际的重绘工作由OnDraw来完成。参数bErase为TRUE时,重绘区域内的背景将被擦除,否则,背景将保持不变。
相当于
Invalidate -> OnPaint ->OnDraw
追问
那应该写在哪里??ONDRAWLINE()里吗?可是把这个INVALIDATE注销掉就什么都画不出
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询