【问题标题】:I want to copy, paste and cut content in my CEdit from my Clipboard我想从剪贴板复制、粘贴和剪切 CREdit 中的内容
【发布时间】: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


【解决方案1】:

你需要GlobalLock你的hGlob内存,然后再复制你的字符串到它(这个操作将它转换为你的进程的可用指针-see here),然后在你完成后调用GlobalUnlock那(以便剪贴板可以访问hGlob):

HGLOBAL hGlob = GlobalAlloc(GMEM_FIXED, 64); // Maybe also need GMEM_MOVEABLE here instead?
char* cCopy = (char*)GlobalLock(hGlob);
strcpy_s(cGlob, 64, "Current selection\r\n");
GlobalUnlock(hGlob); 
if (::SetClipboardData(CF_TEXT, hGlob) == NULL)
{
    //...

您需要对粘贴操作进行类似的安排。

【讨论】:

  • @NajatIsmail 你能在你的复制/粘贴/剪切处理程序中加入一个Beep()(或其他东西),以确保它们确实被调用了吗?
  • 我添加了MessageBox,他们正在被调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-13
  • 2010-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多