如何:将列表控件 (mfc) 数据复制到剪贴板?

Posted

技术标签:

【中文标题】如何:将列表控件 (mfc) 数据复制到剪贴板?【英文标题】:How to: Copy list control (mfc) data to clipboard? 【发布时间】:2015-05-27 11:09:55 【问题描述】:

我创建了一个弹出菜单。接下来我应该做什么以及如何检索元素编号来检索信息?

void Cmfc_test123Dlg::OnNMRClickList1(NMHDR *pNMHDR, LRESULT *pResult)

    LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
    // TODO: Add your control notification handler code here
    *pResult = 0;
    //m_Menu.CreatePopupMenu();
    POINT pt;

    POINT current_point;
    GetCursorPos(&current_point);

    HMENU hPopupMenu = CreatePopupMenu();
    AppendMenu(hPopupMenu, MF_STRING, ID_EDIT_COPY, "&Copy\tCtrl+C");       // Copy    Ctrl+C

    // Загружаем меню из ресурсов
    //HMENU hMenu, hPopupMenu;
    //hMenu = LoadMenu(hInstance, MAKEINTRESOURCE(IDR_MENU1));
    //hPopupMenu = GetSubMenu(hMenu, 0);

    // Отображаем меню
    TrackPopupMenu(hPopupMenu, TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, 0, GetSafeHwnd(), NULL);

    // Уничтожаем меню
    DestroyMenu(hPopupMenu);

Clist 具有报告样式,菜单只有一个选项 - “复制”。我需要从某行复制 itemdata。谢谢。

我已添加此代码,单击复制时出现消息框,但按 ctrl+c 时没有任何效果。

BOOL Cmfc_test123Dlg::OnCommand(WPARAM wParam, LPARAM lParam)


    int nItem = LOWORD(wParam);
    //int nItem = (int)lParam;
    if(nItem == 57634)
    

        CString csMsg;
        csMsg.Format("%d", nItem);
        MessageBox(csMsg, NULL, MB_OK);

    

    CWnd::OnCommand(wParam, lParam);


我几乎解决了这个问题,但还有一件事 - 当我得到最重要的信息时,第一行低于 1,最后一行低于 -1,Listcontrol 标题为 0。为什么会这样?我使用过 ScreenToclient() 但这个问题仍然存在。看起来问题现在消失了,我不知道它是怎么发生的,但现在一切都很好。感谢大家关注我的问题!

【问题讨论】:

菜单的用途是什么?你能进一步解释一下吗? CListCtrl 的样式是什么? 使用CListCtrl::HitTest 函数从current_point 中查找项目索引。不要忘记将屏幕上的current_point 转换为控制坐标。 我明白了,问题更深了。我的意思是当用户按下弹出菜单中的“复制”标签时如何处理事件?我应该在messagemap中添加一些功能吗,Ctrl+C也一样? 您使用鼠标还是键盘输入无关紧要。在调用 copy 命令时,您只需将 当前选定的项目 复制到剪贴板。详情请见Copying Information to the Clipboard。 我不太明白如何以及在何处处理复制命令。我已经在我的类中添加了 OnEditCopy() 函数并将这一行添加到消息映射 ON_COMMAND(ID_EDIT_COPY, &CListCtrl_OwnToolTipCtrl::OnEditCopy) 但似乎没有任何效果! 【参考方案1】:

您似乎在错误的窗口中查找消息。菜单消息发送到TrackPopupMenu 中的HWND 参数。在这种情况下,它是对话框。

那么你有 ON_COMMAND(ID_EDIT_COPY, &amp;CListCtrl_OwnToolTipCtrl::OnEditCopy) 正在 ListView 中寻找消息...

void CMyDialog::OnContextMenu(CWnd* wnd, CPoint p) 

    //... 
    HWND hwnd = GetSafeHwnd(); //menu message is sent to CMyDialog 
    //HWND hwnd = List.GetSafeHwnd(); //menu message is sent to CMyListCtrl

    TrackPopupMenu(hmenu, TPM_LEFTALIGN | TPM_RIGHTBUTTON,
        pt.x, pt.y, 0, hwnd, NULL);

或者你可以使用 Alex Farber 的建议:

int result = TrackPopupMenu(hmenu, TPM_RETURNCMD | TPM_LEFTALIGN | TPM_RIGHTBUTTON,
pt.x, pt.y, 0, hwnd, NULL);
DestroyMenu(hmenu);
if (result)
    TRACE("result: %d\n", result);

【讨论】:

感谢回复,&CListCtrl_OwnToolTipCtrl::OnEditCopy函数写的差不多了,但是hit test有问题,返回Clist header为0行,最后一行为-1。找不到有关此问题的任何信息。 只有一个原因。 HitTestCMyDialog 中,它使用ScreenToClient 而不是使用List.ScreenToClient。这会使 Y 位置偏离大约 25 个像素,因此最后一行不在视野范围内。

以上是关于如何:将列表控件 (mfc) 数据复制到剪贴板?的主要内容,如果未能解决你的问题,请参考以下文章

如何将复选框控件添加到 mfc 中的列表控件子项

mfc如何用txt保存下拉框控件的内容?下拉框如何读入TXT中的内容到属性-数据中?

MFC如何从MFCEditBrowseControl获取路径并将其复制到编辑控件?

mfc中,怎么把一个窗口的编辑框内容调用到另一个窗口的控件里

将 ListBox 复制到剪贴板,返回载体未保存

如何将剪贴板中的数据粘贴到网页中的焦点文本控件?