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

时间:2015-05-27 11:09:55

标签: mfc clistctrl

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

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()但仍然存在这个问题。看起来问题现在已经消失,我不知道它是如何发生的,但是现在每个都很好。感谢大家关注我的问题!

1 个答案:

答案 0 :(得分:1)

看来你正在寻找错误的消息窗口。菜单消息将发送至HWND中的 TrackPopupMenu 参数。在这种情况下,它是对话框。

然后你有ON_COMMAND(ID_EDIT_COPY, &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);