|
楼主 |
发表于 2012-1-16 22:40:16
|
显示全部楼层
回复【10楼】118139
-----------------------------------------------------------------------
翻了下以前照着那本书上抄的代码,用到了多态,m_pTempElement->Draw(&aDC); 这个调用的函数里面也没有用到Invalidate
持续纳闷中。。。估计是MFC在这方面相比以前的版本做了点修改吧, mouse move特别照顾,文档上也说了,大部分的画图都是在OnDraw里面完成的
“Nearly all drawing in your application occurs in the view's OnDraw member function, which you must override in your view class. (The exception is mouse drawing, discussed in Interpreting User Input Through a View.) ”(引自 vs2010 help -> Drawing in a View)
又或者是我的电脑有问题(话说网上也看到几个和我类似的问题。。。) ,
这个是那本书上的 在mouse move 里实时画图的函数(完整的程序在我的电脑上运行是没问题的)
void CtestMFC02View::OnMouseMove(UINT nFlags, CPoint point)
{
// Define a Device Context object for the view
CClientDC aDC(this); // DC is for this view
OnPrepareDC(&aDC);
aDC.DPtoLP(&point);
if(m_MoveMode)
{
MoveElement(aDC, point); // Move the element
return;
}
if((nFlags & MK_LBUTTON) && (this == GetCapture()))
{
m_SecondPoint = point; // Save the current cursor position
if(m_pTempElement)
{
if(CURVE == GetDocument()->GetElementType()) // Is it a curve?
{ // We are drawing a curve so add a segment to the existing curve
static_cast<CCurve*>(m_pTempElement)->AddSegment(m_SecondPoint);
m_pTempElement->Draw(&aDC); // Now draw it
return; // We are done
}
// If we get to here it's not a curve so
// redraw the old element so it disappears from the view
aDC.SetROP2(R2_NOTXORPEN); // Set the drawing mode
m_pTempElement->Draw(&aDC); // Redraw the old element
delete m_pTempElement; // Delete the old element
m_pTempElement = nullptr; // Reset the pointer
}
// Create a temporary element of the type and color that
// is recorded in the document object, and draw it
m_pTempElement = CreateElement(); // Create a new element
m_pTempElement->Draw(&aDC); // Draw the element
}
else
{
CtestMFC02Doc* pDoc = GetDocument();
CElement* pOldSelected(m_pSelected);
m_pSelected = pDoc->FindElement(point);
if(m_pSelected != pOldSelected)
{
if(m_pSelected)
InvalidateRect(m_pSelected->GetBoundRect(), FALSE);
if(pOldSelected)
InvalidateRect(pOldSelected->GetBoundRect(), FALSE);
pDoc->UpdateAllViews(nullptr);
}
}
}
照着Ivor Horton的 <Beginning Visual C++ 2010> 的书上抄的程序代码ourdev_713415QW1IJN.zip(文件大小:3.10M) (原文件名:sketch.zip) ,事隔半年多了。忘得差不多了。
那时是急着想看完那本书,然后用临时学到的windows编程去完成了C++实验课的大作业(当时比较闲,大作业的要求没挑战性,就想自己加点东西进去~) |
|