2013-08-25 74 views
0

我在网上搜索了很多,但找不到我想要的!
假设我有一个来自CWnd的类。事实上,这是我为我自己的目的而定制的课程COpenGLControl here in codeguru
WM_MOUSEMOVE按钮事件处理程序编写如下:如何在MFC中启用或禁用事件处理程序?

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); 
} 

但我不希望这个事件处理程序,在任何时候都activeenabled。我想在名为panrotatezoom的对话框中放上三个按钮。
当我点击pan我想OnMouseMove活跃起来只是中间的按钮
当我点击rotate我想中间的按钮获取无效和左键活跃起来
当我点击zoom我想左键获取无效,右一个得到积极所以。
最后当我点击另一个按钮像Zoom extent,select等,我希望OnMouseMove事件处理程序处于非活动状态,即使我在opengl窗口Maya-style mouse不会被激活?
如何在my customized COpenGLControl classMy MFC dialog中执行这样的操作?
请给我一些指示,开始我的搜索找出更多。


------------------------------------------- ----------------------------------------------- 已编辑部分我的问题的
我也想过手动添加一个事件处理程序上我的课就像OnDraw功能在COpenGLControl class这样做了这样的事情:

OpenGLContro.h

afx_msg void Pan(UINT nFlags, CPoint point); 

OpenGLControl.cpp

void COpenGLControl::Pan(UINT nFlags, CPoint point) 
{ 
    int diffX = (int)(point.x - m_fLastX); 
    int diffY = (int)(point.y - m_fLastY); 
    if (nFlags & MK_MBUTTON) 
    { 
     m_fPosX += (float)0.05f * diffX; 
     m_fPosY -= (float)0.05f * diffY; 
    } 
    OnDraw(NULL); 
} 

,每当按钮pan点击我会调用该函数但我不是仍然在OpenGL Window,不知道帽子传递作为参数的函数Pan

回答

1

向类中添加一个state/mode成员变量,并为每个“mode”添加一个专用处理函数。事件处理程序使用模式变量来决定从事件处理程序中调用哪些模式相关处理程序,并传递所有参数。

+0

我的意思是上述代码的处理程序总是处于活动状态(无论何时在opengl窗口中)我是否可以使其处于非活动状态? – sepideh

+0

我也想过为这个类手动添加一个事件处理程序。如果您有兴趣,请参阅我的问题的编辑部分。 – sepideh

+0

谢谢@datenwolf你能解释一下你的答案吗? – sepideh

相关问题