C ++ MFC SDI Copy / Paste не работает

Я создал простое приложение 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 (например, если я выбираю текст внутри элемента управления редактированием, его следует скопировать в буфер обмена. Если я выбираю, например, Элемент из дерева должен отображаться только во всплывающем окне)?

0

Решение

использование 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Вы должны найти дескриптор класса представления и изменить элемент управления.

Также убедитесь, что добавлена ​​кнопка ускорения.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]