首页 新闻 会员 周边

MFC的MDI多文档程序,使用RIBBON框架

0
悬赏园豆:50 [待解决问题]

MFC的MDI多文档程序,使用RIBBON框架,控件的事件处理函数只能添加在主框架程序类中吗?可以添加在文档类中吗?可是添加在文档类中,控件是灰色的,不能选中,这是为什么呢?

敲敲敲code的主页 敲敲敲code | 初学一级 | 园豆:152
提问于:2023-07-13 17:11

使用的是VS软件

敲敲敲code 10个月前
< >
分享
所有回答(2)
-1

在MFC的MDI多文档程序中,控件的事件处理函数通常是添加在主框架程序类中的。这是因为Ribbon框架是与主框架紧密相关的,控件的事件处理函数需要在主框架中进行处理。

将控件的事件处理函数添加到文档类中是不被推荐的做法,并且可能导致控件在界面上显示为灰色且无法选中。这是因为文档类是与文档数据相关的,而不是与界面交互相关的。控件的事件处理函数应该处理与界面交互相关的逻辑,因此应该放在主框架程序类中。

以下是一个示例代码,演示如何在主框架程序类中添加控件的事件处理函数:

// MyMainFrame.h

class CMyMainFrame : public CMDIFrameWndEx
{
public:
    CMyMainFrame();

    // 控件事件处理函数
    afx_msg void OnButtonClicked();

    DECLARE_MESSAGE_MAP()
};

// MyMainFrame.cpp

CMyMainFrame::CMyMainFrame()
{
    // 创建Ribbon控件
    CMFCRibbonBar* pRibbonBar = &GetRibbonBar();

    // 创建一个按钮
    CMFCRibbonButton* pButton = new CMFCRibbonButton(ID_BUTTON, _T("Button"));
    pRibbonBar->AddToTabs(pButton);

    // 将按钮与事件处理函数关联
    pButton->SetCommandHandler(this);
}

void CMyMainFrame::OnButtonClicked()
{
    // 处理按钮点击事件
    // ...
}

BEGIN_MESSAGE_MAP(CMyMainFrame, CMDIFrameWndEx)
    ON_COMMAND(ID_BUTTON, OnButtonClicked)
END_MESSAGE_MAP()

在这个示例中,我们在主框架程序类CMyMainFrame中创建了一个Ribbon按钮,并将按钮与事件处理函数OnButtonClicked()关联起来。当按钮被点击时,事件处理函数将被调用。

lanedm | 园豆:2381 (老鸟四级) | 2023-07-13 17:57

意思是只能将控件的事件处理函数添加在MainFrame主框架类中吗,要是想要添加到别的类中,有什么方法吗?还是说只有添加到主框架类中这一种方法?

支持(0) 反对(0) 敲敲敲code | 园豆:152 (初学一级) | 2023-07-13 20:19

@敲敲敲code: 在MFC的MDI多文档程序中,使用Ribbon框架时,确实可以将控件的事件处理函数添加到MainFrame主框架类中。这是因为Ribbon框架是与主框架类紧密集成的,控件的事件处理函数通常与主框架类的功能和UI交互相关。

然而,如果你想将控件的事件处理函数添加到其他类中,也是有方法的。以下是一种常见的做法:

  1. 在其他类中定义一个成员函数,作为控件的事件处理函数。例如,你可以在子文档类或视图类中定义一个成员函数。

  2. 在MainFrame主框架类中,获取对其他类的引用或指针。这可以通过在主框架类中保存对其他类的引用或指针,并在创建其他类的实例时进行设置。

  3. 在MainFrame主框架类的事件处理函数中,调用其他类的事件处理函数。例如,你可以在MainFrame主框架类的事件处理函数中调用子文档类或视图类的事件处理函数。

通过这种方式,你可以将控件的事件处理函数分散到多个类中,以便更好地组织代码和实现功能。但请注意,确保在调用其他类的事件处理函数时,遵循正确的线程上下文和逻辑顺序,以避免潜在的问题。

以下是一个示例代码,在子文档类中定义一个成员函数作为控件的事件处理函数:

// MyChildView.h

class CMyChildView : public CView
{
    DECLARE_DYNCREATE(CMyChildView)

public:
    CMyChildView(); // 构造函数
    virtual ~CMyChildView(); // 析构函数

    // 控件事件处理函数
    afx_msg void OnButtonClicked();

protected:
    DECLARE_MESSAGE_MAP()
};

// MyChildView.cpp

IMPLEMENT_DYNCREATE(CMyChildView, CView)

CMyChildView::CMyChildView()
{
}

CMyChildView::~CMyChildView()
{
}

BEGIN_MESSAGE_MAP(CMyChildView, CView)
    ON_COMMAND(ID_BUTTON_CLICK, &CMyChildView::OnButtonClicked)
END_MESSAGE_MAP()

void CMyChildView::OnButtonClicked()
{
    // 控件的事件处理逻辑
    // ...
}

在上述示例代码中,我们在CMyChildView类中定义了一个成员函数OnButtonClicked(),作为控件的事件处理函数。在BEGIN_MESSAGE_MAP宏中,我们将ID_BUTTON_CLICK与OnButtonClicked()函数关联起来,以便在点击按钮时调用该函数。

请注意,示例代码中的ID_BUTTON_CLICK是一个自定义的命令ID,你需要根据实际情况进行调整。另外,如果你在Ribbon框架中使用的是CMFCRibbonButton控件,你还需要将按钮的ID与ID_BUTTON_CLICK关联起来。

在子文档类中定义控件的事件处理函数后,你可以在MainFrame主框架类中获取对子文档类的引用或指针,并在需要的地方调用该函数。例如,在MainFrame的事件处理函数中调用子文档类的事件处理函数。

这样,你就可以将控件的事件处理函数分散到不同的类中,以便更好地组织代码和实现功能。

支持(0) 反对(0) lanedm | 园豆:2381 (老鸟四级) | 2023-07-14 09:28

@lanedm: 您好,在MainFrame的事件处理函数中调用子文档类的事件处理函数,这个具体怎么做您尝试过吗?谢谢大佬帮助

支持(0) 反对(0) 敲敲敲code | 园豆:152 (初学一级) | 2023-07-14 11:38

@敲敲敲code: 他知道个屁,他这个回复明显是把AI回答的内容粘贴出来,本身毛都不懂

支持(0) 反对(0) 天道茜 | 园豆:241 (菜鸟二级) | 2023-07-17 10:45
0

在 MFC 的 MDI 多文档程序中,使用 Ribbon 框架时,控件的事件处理函数通常会添加在主框架程序类中。这是因为 Ribbon 框架是在主框架程序类中进行初始化和管理的。

默认情况下,MFC 的文档类并不直接处理控件的事件,因为文档类主要负责管理和操作文档数据。控件的事件处理通常涉及用户界面和交互逻辑,这更适合放在主框架程序类中处理。

如果你尝试将控件的事件处理函数添加到文档类中,控件可能会变为灰色并且无法选中,这是因为文档类并不是 Ribbon 控件的消息接收者。只有将事件处理函数添加到主框架程序类中,Ribbon 控件才能正确连接到事件处理函数,并在用户交互时响应事件。

如果你希望在文档类中处理某些特定的事件逻辑,一种常见的做法是在主框架程序类中捕获相应的事件,然后将事件传递给当前活动的文档类进行处理。这样可以实现控件事件和文档逻辑的分离,并且保持主框架程序类作为整个应用程序的协调者。

总结起来,主框架程序类是处理 Ribbon 控件事件的主要位置,文档类负责管理文档数据。通过在主框架程序类中处理控件事件,并在需要时将事件传递给文档类,可以实现合理的分工和功能分配。

Technologyforgood | 园豆:5718 (大侠五级) | 2023-07-15 07:33
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册