我用功能区创建了一个简单的MFC SDI应用程序。文档的视图是一个具有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,则会弹出消息框。但是我无法将“编辑控件”的文本复制到剪贴板。 如果选择了其他控件并按了CTRL + C,如何在从“编辑文本”复制文本和执行其他操作之间进行选择(例如,如果我在“编辑控件”中选择文本,则应将其复制到剪贴板。如果我选择例如树状视图中的项目仅应显示一个弹出窗口)?
答案 0 :(得分:2)
使用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
中执行此操作,您必须找到视图类的句柄并编辑控件。
还要确保添加了加速键。