1

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

如果我现在使用 CTRL+V 在编辑控件中粘贴一些文本,则不会发生任何事情。使用 CTRL+C 复制编辑控件内的文本也是如此。如果我在编辑控件内右键单击,我可以使用上下文菜单。但是我怎样才能启用快捷方式?CTRL + C 等在加速器列表中。如果我将以下内容添加到 MainForm

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

和函数本身

void CMainFrame::onCopy() {
    AfxMessageBox(L"Copy");
}

如果我现在按 CTRL+C,MessageBox 会弹出。但我无法将编辑控件的文本复制到剪贴板。如果选择了不同的控件并按下了 CTRL+C,我怎么能在从编辑文本中复制文本和执行其他操作之间进行选择(例如,如果我在编辑控件中选择文本,它应该被复制到剪贴板。如果我选​​择例如树视图中的项目仅应显示一个弹出窗口)?

4

1 回答 1

3

用于ON_UPDATE_COMMAND_UI启用/禁用命令。用于ON_COMMAND响应相同的命令。

然后,您必须将消息转发到编辑控件 ( 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,您必须找到视图类的句柄并编辑控件。

还要确保添加了加速键。

于 2018-08-01T17:08:32.893 回答