【发布时间】:2020-03-30 12:10:45
【问题描述】:
这是我为MFCRibbonBar 中的复制、粘贴和剪切按钮实现的事件处理程序:
在MyRibbonView.cpp:
void CMyRibbonView::OnEditCopy()
{
CWnd *wnd = GetFocus();
if (wnd == pEdit)
pEdit->Copy();
if (!OpenClipboard())
{
AfxMessageBox(_T("Cannot open the Clipboard"));
return;
}
if (!EmptyClipboard())
{
AfxMessageBox(_T("Cannot empty the Clipboard"));
return;
}
HGLOBAL hGlob = GlobalAlloc(GMEM_FIXED, 64);
strcpy_s((char*)hGlob, 64, "Current selection\r\n");
if (::SetClipboardData(CF_TEXT, hGlob) == NULL)
{
CString msg;
msg.Format(_T("Unable to set Clipboard data, error: %d"), GetLastError());
AfxMessageBox(msg);
CloseClipboard();
GlobalFree(hGlob);
return;
}
CloseClipboard();
}
void CMyRibbonView::OnEditPaste()
{
if (OpenClipboard())
{
HANDLE hClipboardData = GetClipboardData(CF_TEXT);
char *pchData = (char*)GlobalLock(hClipboardData);
CString strFromClipboard;
strFromClipboard = pchData;
pEdit->SetWindowText(strFromClipboard);
GlobalUnlock(hClipboardData);
CloseClipboard();
}
}
void CMyRibbonView::OnEditCut()
{
OnEditCopy();
pEdit->SetWindowText(L" ");
}
没有错误,只是不工作。我通过添加消息来测试它是否真的是数据,但它们没有弹出。
【问题讨论】:
-
不太明白。我认为所有编辑框都支持剪切、复制、粘贴、选择所有等操作。向导生成的代码已经包含链接到
CEditView派生类操作的菜单项和工具栏按钮,在选择或取消选择文本时正确启用/禁用。为什么需要这个? -
我希望能够从我的功能区栏中复制、粘贴和剪切。但也不能使用 CEdit 的快捷方式。
-
即便如此,为什么不直接告诉
CEdit(或者是什么)将其内容复制到剪贴板呢?你打电话给pEdit->Copy(),但前提是它专注。然后您尝试(再次)自己将其内容复制到剪贴板。很奇怪。除了pEdit->Copy(),您的代码还试图做什么?它不做同样的事情吗?这更像是一个 UI 设计问题,您需要决定操作将做什么,应该能够从哪些 UI 项以及在哪些条件下调用。 -
同样,
CEditView派生的视图会自行执行此操作。例如,在选择“编辑”视图中的某些文本时,将启用工具栏中的“副本”按钮(以及在功能区栏中猜测)。并在单击时将所选文本复制到剪贴板。 -
你设置断点来确认你的热键被拦截了吗?
标签: user-interface visual-c++ mfc