C++ C++;MFC SDI复制/粘贴不起作用

C++ C++;MFC SDI复制/粘贴不起作用,c++,mfc,sdi,C++,Mfc,Sdi,我创建了一个带有功能区的简单MFCSDI应用程序。文档的视图是带有on编辑控件的FormView 如果现在使用CTRL+V在编辑控件中粘贴一些文本,则不会发生任何事情。使用CTRL+C复制编辑控件内的文本也是如此。 如果在编辑控件内单击鼠标右键,则可以使用关联菜单。 但是如何启用快捷方式呢? CTRL+C等位于加速器列表中。 如果我在主窗体中添加以下内容 BEGIN_MESSAGE_MAP(CMainFrame, CFrameWndEx) ON_COMMAND(ID_EDIT_COPY,

我创建了一个带有功能区的简单MFCSDI应用程序。文档的视图是带有on编辑控件的FormView

如果现在使用CTRL+V在编辑控件中粘贴一些文本,则不会发生任何事情。使用CTRL+C复制编辑控件内的文本也是如此。 如果在编辑控件内单击鼠标右键,则可以使用关联菜单。 但是如何启用快捷方式呢? CTRL+C等位于加速器列表中。 如果我在主窗体中添加以下内容

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWndEx)
    ON_COMMAND(ID_EDIT_COPY, &CMainFrame::onCopy)
END_MESSAGE_MAP()
以及函数本身

void CMainFrame::onCopy() {
    AfxMessageBox(L"Copy");
}
如果我现在按CTRL+C,消息框会弹出。但我无法将编辑控件的文本复制到剪贴板。
如果选择了另一个控件并按下CTRL+C(例如,如果我在编辑控件中选择了文本,则应将其复制到剪贴板。如果我从树视图中选择了一个项目,则仅应显示一个弹出窗口),我如何在从编辑文本复制文本和执行其他操作之间进行选择?

使用更新命令界面上的
来启用/禁用命令。在命令上使用
响应同一命令

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWndEx)
    //ON_COMMAND(ID_EDIT_COPY, &CMainFrame::onCopy)
END_MESSAGE_MAP()

BEGIN_MESSAGE_MAP(CMyView, CView)
    ON_COMMAND(ID_EDIT_COPY, &CMyView::OnEditCopy)
    ON_UPDATE_COMMAND_UI(ID_EDIT_COPY, &CMyView::OnUpdateEditCopy)
    ...
END_MESSAGE_MAP()

class CMyView : public CView
{
    CEdit m_edit1, m_edit2;
    ...
};

void CMyView::OnEditCopy()
{
    CWnd *wnd = GetFocus();
    if(wnd == &m_edit1)
        m_edit1.Copy();
    else if(wnd == &m_edit2)
        m_edit2.Copy();
}

void CMyView::OnUpdateEditCopy(CCmdUI *pCmdUI)
{
    CWnd *wnd = GetFocus();
    int start, end;
    if(wnd == &m_edit1)
    {
        m_edit1.GetSel(start, end);
        pCmdUI->Enable(end > start);
    }
    else if(wnd == &m_edit2)
    {
        m_edit2.GetSel(start, end);
        pCmdUI->Enable(end > start);
    }
}
然后必须将消息转发到编辑控件(
m_edit.Copy()
)。您可以在
CMyView
类中直接执行此操作(从
CMainFrame
中删除处理程序)

如果有多个编辑控件,
GetFocus
将报告哪个编辑控件具有焦点

CEdit::GetSel
将报告选择是否可用

用浆糊也一样。使用
m_edit.CanPaste()
查看粘贴是否可用。对粘贴命令使用
m_edit.Paste()

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWndEx)
    //ON_COMMAND(ID_EDIT_COPY, &CMainFrame::onCopy)
END_MESSAGE_MAP()

BEGIN_MESSAGE_MAP(CMyView, CView)
    ON_COMMAND(ID_EDIT_COPY, &CMyView::OnEditCopy)
    ON_UPDATE_COMMAND_UI(ID_EDIT_COPY, &CMyView::OnUpdateEditCopy)
    ...
END_MESSAGE_MAP()

class CMyView : public CView
{
    CEdit m_edit1, m_edit2;
    ...
};

void CMyView::OnEditCopy()
{
    CWnd *wnd = GetFocus();
    if(wnd == &m_edit1)
        m_edit1.Copy();
    else if(wnd == &m_edit2)
        m_edit2.Copy();
}

void CMyView::OnUpdateEditCopy(CCmdUI *pCmdUI)
{
    CWnd *wnd = GetFocus();
    int start, end;
    if(wnd == &m_edit1)
    {
        m_edit1.GetSel(start, end);
        pCmdUI->Enable(end > start);
    }
    else if(wnd == &m_edit2)
    {
        m_edit2.GetSel(start, end);
        pCmdUI->Enable(end > start);
    }
}
或者您可以在
CMainFrame
中执行此操作,您必须找到视图类和编辑控件的句柄


还要确保添加了加速器键

当你使用谷歌时,你会找到答案。不到10秒钟,信不信由你,我就用谷歌的方法找到了一个解决方案,也点击了那篇帖子,但这对我没有帮助。如果我有多个编辑控件,该怎么办?如何确定当前选中的编辑控件?如何将该文本框的文本放入剪贴板?获取活动控件并从中获取文本。可能会向活动控件发布
WM\u COPY
消息?否则,从加速器中删除Ctrl+C也会起作用(加速器将不会捕获消息,但编辑框会处理它,因此,如果这对您来说足够的话…)。