gpt4 book ai didi

c++ - 为什么 OnDraw 不够用(在 MFC 中,Scribble 教程)

转载 作者:行者123 更新时间:2023-11-28 03:44:11 26 4
gpt4 key购买 nike

我正在制作 Scribble 教程来学习 MFC,MouseMove 事件中有这段代码:

void CScribbleView::OnMouseMove(UINT nFlags, CPoint point)
{
// Mouse movement is interesting in the Scribble application
// only if the user is currently drawing a new stroke by
// dragging the captured mouse.

if( GetCapture( ) != this )
return; // If this window (view) didn't capture the
// mouse, the user isn't drawing in this window.

// Add the new point to the current stroke
m_pStrokeCur->m_pointArray.Add(point);

CClientDC dc( this );

// Draw a line from the previous detected point in the mouse
// drag to the current point.
CPen* pOldPen =
dc.SelectObject( GetDocument( )->GetCurrentPen( ) );
dc.MoveTo( m_ptPrev );
dc.LineTo( point );
dc.SelectObject( pOldPen );

m_ptPrev = point;

CView::OnMouseMove(nFlags, point);
}

还有这个关于stroke的绘制函数(由 View 的OnDraw调用):

BOOL CStroke::DrawStroke( CDC* pDC )
{
CPen penStroke;
if( !penStroke.CreatePen(PS_SOLID, m_nPenWidth, RGB(0,0,0)))
return FALSE;
CPen* pOldPen = pDC->SelectObject( &penStroke );
pDC->MoveTo( m_pointArray[0] );
for( int i=1; i < m_pointArray.GetSize(); i++ )
{
pDC->LineTo( m_pointArray[i] );
}
pDC->SelectObject( pOldPen );
return TRUE;
}

我检查过每次帧更新时都会调用此函数。但是,如果我在鼠标移动事件上取消绘图,则不会发生任何事情,即使我正在注册所有笔画并且正在调用绘图笔画函数。只有当我对窗口进行更改(如最大化)时, then 才会出现。如果函数

正在被调用,为什么不在窗口上绘制呢?我在这里试图弄清楚 MFC 的内部工作原理,这不是错误或任何东西。

最佳答案

当您的全部或部分窗口已过时(称为“无效”)时,消息循环将最终收到两条消息:WM_ERASEBKGND 和 WM_PAINT。 Windows 应用程序绘制的典型方法是在 WM_ERASEBKGND 和 WM_PAINT 处理程序中绘制所有内容。 (我不是MFC专家,但我认为WM_PAINT对应于MFC中的OnDraw。)

因此处理此问题的正常方法是让鼠标移动处理程序记录笔划(就像它所做的那样),然后将窗口标记为无效。这最终会导致画线。但是,可能会有轻微的延迟,并且可能会导致闪烁。在现代计算机上,延迟可能微不足道(但 Scribble 很旧)。有多种方法可以处理闪烁。

Scribble 作者似乎选择通过直接在鼠标移动处理程序中绘制线条来处理延迟和闪烁,而不是使窗口无效并让 OnDraw 稍后再做。

失效是关键。您从 OnMouseMove 中删除了绘图,因此不会在那里绘制线条。但是没有什么可以告诉 Windows 窗口内容现在已经过时(无效),因此它不会收到 WM_PAINT 消息,也不会调用 OnDraw。 (稍后,当您执行调整大小或最大化窗口之类的操作时,确实会使它无效,并且会调用 OnDraw 并且该行突然出现。)

如果您想从 OnMouseMove 中删除绘图,则必须将其替换为 InvalidateRect 调用。这将告诉 Windows 需要重新绘制窗口。

关于c++ - 为什么 OnDraw 不够用(在 MFC 中,Scribble 教程),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8139678/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com