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

Posted

技术标签:

【中文标题】C++ MFC SDI 复制/粘贴不起作用【英文标题】:C++ MFC SDI Copy/Paste did not work 【发布时间】:2018-08-01 09:47:13 【问题描述】:

我创建了一个带有功能区的简单 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,我怎么能在从编辑文本中复制文本和执行其他操作之间进行选择(例如,如果我在编辑控件中选择文本,它应该被复制到剪贴板。如果我选​​择例如树视图中的项目仅应显示一个弹出窗口)?

【问题讨论】:

当你使用谷歌时,你会找到答案。不到 10 秒 bytecrunchers.wordpress.com/2012/05/31/… 信不信由你,我做了谷歌的事情来找到解决方案,也点击了那个帖子,但这对我没有帮助。如果我有多个编辑控件如何确定当前选中的那个呢?如何将该文本框的文本获取到剪贴板? 获取活动控件并从中获取文本。 可以向活动控件发布WM_COPY 消息吗?否则从加速器中删除 Ctrl+C 也可以(你的加速器不会捕获消息,但编辑框会处理它,所以如果这对你来说足够......)。 【参考方案1】:

使用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 中执行此操作,您必须找到视图类的句柄并编辑控件。

还要确保添加了加速键。

【讨论】:

以上是关于C++ MFC SDI 复制/粘贴不起作用的主要内容,如果未能解决你的问题,请参考以下文章

由工作表更改事件触发的复制粘贴值不起作用

禁用复制,在 UITextfield 中粘贴在 iOS 9.x 中不起作用

ionic - 在 iOS 10 中的输入字段中复制/粘贴不起作用

Java Swing - 在Java Web Start中,复制/粘贴不起作用

运行此示例,输出始终为 1。似乎 C++ 多态性不起作用? [复制]

vb中使用“Clipboard.SetText Text1.Text”复制的内容,怎么粘贴在记事本不起作用????