【问题标题】:How to enable or disable an event hander in MFC?如何在 MFC 中启用或禁用事件处理程序?
【发布时间】:2013-08-28 02:32:18
【问题描述】:

我在网上搜索了很多,但找不到我想要的东西!
假设我有一个派生自CWnd 的类。其实就是我为自己的目的定制的COpenGLControl here in codeguru类。
WM_MOUSEMOVE 按钮的事件处理程序编写如下:

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 extentselect 等)时,我希望 OnMouseMove 事件处理程序以这样的方式处于非活动状态,即使我在 opengl 窗口上 Maya-style mouse 也不会活跃吗?
无论是在my customized COpenGLControl class 还是My MFC dialog,我如何才能实现这样的功能?
请给我一些指示以开始我的搜索以了解更多信息。


----------------------------------- ------------------------------------------------------- 编辑了我的部分问题
我还考虑向我的类手动添加一个事件处理程序,就像COpenGLControl class 中的OnDraw 函数一样,所以做了这样的事情:

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

【问题讨论】:

    标签: visual-studio-2010 mfc dialog event-handling


    【解决方案1】:

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

    【讨论】:

    • 我的意思是上面代码的处理程序总是处于活动状态(只要你在 opengl 窗口上)我可以让它有时不活动吗?
    • 我还考虑过手动向类添加事件处理程序。如果您有兴趣,请查看我的问题的编辑部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多