0

ここで 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関数で使用されるアルゴリズムは何ですか?
または、イベント ハンドラーは他の関数とどのように異なるのでしょうか?

4

1 に答える 1