Я создал простое приложение MFC SDI с лентой. Представление для документа — это FormView с элементом управления Edit.
Если я сейчас использую CTRL + V для вставки текста в элемент управления редактирования, ничего не происходит. То же самое касается CTRL + C, чтобы скопировать текст внутри элемента управления редактирования.
Я мог бы использовать контекстное меню, если бы я щелкнул правой кнопкой мыши внутри Edit Control.
Но как я могу включить ярлыки?
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 (например, если я выбираю текст внутри элемента управления редактированием, его следует скопировать в буфер обмена. Если я выбираю, например, Элемент из дерева должен отображаться только во всплывающем окне)?
использование 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
Вы должны найти дескриптор класса представления и изменить элемент управления.
Также убедитесь, что добавлена кнопка ускорения.
Других решений пока нет …