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

如何:将列表控件(mfc)数据复制到剪贴板?,mfc,clistctrl,Mfc,Clistctrl,我已经创建了一个弹出菜单。接下来应该做什么?如何检索元素编号以检索信息 void Cmfc_test123Dlg::OnNMRClickList1(NMHDR *pNMHDR, LRESULT *pResult) { LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR); // TODO: Add your control notification handler c

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

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);
}

我几乎解决了这个问题,但还有一件事——当我获得hititest信息时,第一行在数字1下,最后一行在-1下,Listcontrol标题为0。为什么会这样?我使用了ScreenToclient(),但这个问题仍然存在。看起来问题已经解决了,我不知道是怎么发生的,但现在一切都很好。谢谢大家关注我的问题

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

然后您有
ON_命令(ID\u EDIT\u COPY,&CListCtrl\u ownttooltipctrl::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的样式是什么?使用
CListCtrl::HitTest
函数从
当前\u点
查找项目索引。别忘了把
当前点
从屏幕转换到控制坐标。我明白了,问题更严重。我的意思是,当用户按下弹出菜单中的“复制”标签时,如何处理事件?我是否应该在messagemap中添加一些功能,关于Ctrl+C也是一样?使用鼠标还是键盘输入都没有关系。在调用copy命令时,您只需将当前选定的项目复制到剪贴板。有关详细信息,请参阅。我不太明白如何以及在何处处理复制命令。我已经将OnEditCopy()函数添加到我的类中,并将这一行添加到消息映射ON_命令(ID_EDIT_COPY,&CListCtrl_ownToolIPCTRL::OnEditCopy)中,但似乎没有任何效果!感谢您的回复,我几乎已经完成了&CListCtrl\u owntToolIPCTRL::OnEditCopy函数的编写,但是命中测试有一个问题,它将Clist头返回为0行,将最后一行返回为-1。找不到有关此问题的任何信息。原因可能只有一个
HitTest
位于
CMyDialog
中,它正在使用
ScreenToClient
而不是使用
List.ScreenToClient
。这会使Y位置偏移约25像素,因此最后一行不可见。
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);