C++ MFC SDI Copy/Paste 不工作
C++ MFC SDI Copy/Paste did not work
我已经用功能区创建了一个简单的 MFC SDI 应用程序。文档的视图是带有编辑控件的 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。但是我无法将编辑控件的文本复制到剪贴板。
如果 select 编辑了不同的控件并按下了 CTRL+C(例如,如果编辑控件中的 select 文本应该被复制,我如何在从编辑文本复制文本和执行其他操作之间做出选择到剪贴板。如果我 select 例如,树视图中的项目只应显示一个弹出窗口)?
使用ON_UPDATE_COMMAND_UI
到enable/disable命令。使用 ON_COMMAND
响应相同的命令。
然后您必须将消息转发到编辑控件 (m_edit.Copy()
)。您可以直接在 CMyView
class 中执行此操作(从 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
中执行此操作,您必须找到视图的句柄 class 并编辑控件。
还要确保添加了快捷键。
我已经用功能区创建了一个简单的 MFC SDI 应用程序。文档的视图是带有编辑控件的 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。但是我无法将编辑控件的文本复制到剪贴板。 如果 select 编辑了不同的控件并按下了 CTRL+C(例如,如果编辑控件中的 select 文本应该被复制,我如何在从编辑文本复制文本和执行其他操作之间做出选择到剪贴板。如果我 select 例如,树视图中的项目只应显示一个弹出窗口)?
使用ON_UPDATE_COMMAND_UI
到enable/disable命令。使用 ON_COMMAND
响应相同的命令。
然后您必须将消息转发到编辑控件 (m_edit.Copy()
)。您可以直接在 CMyView
class 中执行此操作(从 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
中执行此操作,您必须找到视图的句柄 class 并编辑控件。
还要确保添加了快捷键。