gpt4 book ai didi

c++ - 其中 m_fLastX 和 m_fLastY 在 COpenGLControl 类中初始化

转载 作者:行者123 更新时间:2023-11-28 07:27:38 27 4
gpt4 key购买 nike

考虑 COpenGLControl class here in codeguru .我已经上传了期末课here适合你,但你可以下载它at the bottom of the webpage Setting Up OpenGL in an MFC Control. the name of the file is BF_oglMFCDialog_Part2.zip如果你有兴趣。
我的问题是,您看到在类的 header 中定义了 m_fLastXm_fLastY:

OpenGLControl.h

class COpenGLControl : public CWnd
{
public:
/******************/
/* Public Members */
/******************/
UINT_PTR m_unpTimer;
// View information variables
float m_fLastX;
float m_fLastY;
float m_fPosX;

但是它们没有在类的构造函数中初始化,也没有在其他任何地方初始化,而是在没有初始化的情况下在 OnMouseMove 事件处理程序中使用:

OpenGLControl.cpp

COpenGLControl::COpenGLControl(void)
{
m_fPosX = 0.0f; // X position of model in camera view
m_fPosY = 0.0f; // Y position of model in camera view
m_fZoom = 10.0f; // Zoom on model in camera view
m_fRotX = 0.0f; // Rotation on model in camera view
m_fRotY = 0.0f; // Rotation on model in camera view
m_bIsMaximized = false;
}

void COpenGLControl::OnMouseMove(UINT nFlags, CPoint point)
{
int diffX = (int)(point.x - m_fLastX);
int diffY = (int)(point.y - m_fLastY);
m_fLastX = (float)point.x;
m_fLastY = (float)point.y;

// Left mouse button
if (nFlags & MK_LBUTTON)
{
m_fRotX += (float)0.5f * diffY;

if ((m_fRotX > 360.0f) || (m_fRotX < -360.0f))
{
m_fRotX = 0.0f;
}

m_fRotY += (float)0.5f * diffX;

if ((m_fRotY > 360.0f) || (m_fRotY < -360.0f))
{
m_fRotY = 0.0f;
}
}

// Right mouse button
else if (nFlags & MK_RBUTTON)
{
m_fZoom -= (float)0.1f * diffY;
}

// Middle mouse button
else if (nFlags & MK_MBUTTON)
{
m_fPosX += (float)0.05f * diffX;
m_fPosY -= (float)0.05f * diffY;
}

OnDraw(NULL);

CWnd::OnMouseMove(nFlags, point);
}

你能解释一下这些未初始化的变量是如何被使用而不出错的吗?
事实上,OnMouseMove 函数中使用的算法是什么?
或者事件处理程序与其他函数有何不同?

最佳答案

使用未初始化的变量不是错误。它会给出不确定的结果,这可能会导致逻辑/算术错误。

现在,在这个例子中,大多数情况下 m_fLastXm_fLastY 没有初始值可能并不重要,因为很少有第一个当 MFC 应用程序接收到鼠标移动事件时,用户按下了鼠标按钮。

无论如何,您应该继续进行更正。我会将这两个变量初始化为 -1.0f(因为 CPoint 永远不会包含负值),然后在 OnMouseMove (...) 的顶部添加一些额外的逻辑:

if (m_fLastX < 0.0f && m_fLastY < 0.0f) {
m_fLastX = (float)point.x;
m_fLastY = (float)point.y;
}

或者,在构造函数中,您可以使用 GetCursorPos (...) 的值初始化 m_fLastXm_fLastY

无论如何,我不会太担心。这只会在 OpenGL 控件第一次接收到鼠标移动事件时影响软件。之后,它将始终有一个用于计算鼠标增量的初始化值。

它采用的算法通过存储上次通知控件光标移动时鼠标的位置并计算它与当前鼠标位置之间的差异来工作。然后根据按下的按钮对其进行缩放并应用转换。它应用旋转(左键)、缩放(右键)或平移(中键)。

至于 MFC 事件处理程序,它们只是面向对象的回调。 MFC 隐藏了内部窗口消息泵,并使用已安装的事件处理程序将事件发送到各个控件。

关于c++ - 其中 m_fLastX 和 m_fLastY 在 COpenGLControl 类中初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18433168/

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