如何:将列表控件 (mfc) 数据复制到剪贴板?
How to: Copy list control (mfc) data to clipboard?
我创建了一个弹出菜单。接下来我应该做什么以及如何检索元素编号以检索信息?
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(¤t_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 有报表样式,菜单只有一个选项 - "Copy"。我需要从某行复制 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);
}
我几乎已经解决了这个问题,但还有一件事 - 当我获得 hititest 信息时,第一行在数字 1 以下,最后一行在 -1 以下,并且 Listcontrol 标题为 0。为什么那件事发生了吗?我用过 ScreenToclient() 但这个问题仍然存在。看起来问题现在消失了,我不知道它是怎么发生的,但现在一切都很好。感谢大家关注我的问题!
您似乎在查找错误的 window 消息。菜单消息发送到 TrackPopupMenu
中的 HWND
参数。在这种情况下,它是对话框。
然后你 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);
我创建了一个弹出菜单。接下来我应该做什么以及如何检索元素编号以检索信息?
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(¤t_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 有报表样式,菜单只有一个选项 - "Copy"。我需要从某行复制 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);
}
我几乎已经解决了这个问题,但还有一件事 - 当我获得 hititest 信息时,第一行在数字 1 以下,最后一行在 -1 以下,并且 Listcontrol 标题为 0。为什么那件事发生了吗?我用过 ScreenToclient() 但这个问题仍然存在。看起来问题现在消失了,我不知道它是怎么发生的,但现在一切都很好。感谢大家关注我的问题!
您似乎在查找错误的 window 消息。菜单消息发送到 TrackPopupMenu
中的 HWND
参数。在这种情况下,它是对话框。
然后你 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);