ここで codeguru の COpenGLControl クラスを考えてみましょう。最終的なクラスをここにアップロードしましたが、MFC コントロールで OpenGL をセットアップする Web ページの下部からダウンロードできます。興味があれば、ファイルの名前は BF_oglMFCDialog_Part2.zipです。
私の質問は、クラスのヘッダーで表示m_fLastX
およびm_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
関数で使用されるアルゴリズムは何ですか?
または、イベント ハンドラーは他の関数とどのように異なるのでしょうか?