如何:将列表控件(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(¤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);
}
我几乎解决了这个问题,但还有一件事——当我获得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);