MFC单文档怎么获取列表控件的行数
我的单文档应用程序如下我想实现对每一列数据进行删除等操作。如何实现只在在列表框中右键弹出菜单。并且能获取按下右键时指针所在列表的行数。怎么改啊!谢谢啦!voidCNSRV...
我的单文档应用程序如下
我想实现对每一列数据进行删除等操作。
如何实现只在在列表框中右键弹出菜单。并且能获取按下右键时指针所在列表的行数。
怎么改啊!谢谢啦!
void CNSRView::OnRButtonDown(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 CMenu PopMenu; //实例化一个菜单对象 CMenu *pMenu; //指针 PopMenu.LoadMenu(IDR_M_MENU);//装载自定义的右键菜单 pMenu = PopMenu.GetSubMenu (0); //获取第一个弹出菜单,所以第一个菜单必须有子菜单 CPoint pt; //定义一个用于确定光标位置的位置 GetCursorPos(&pt);//获取当前光标的位置,以便使得菜单可以跟随光标 CBitmap Bitmap_CHANGEFILE,Bitmap_DELFILE,Bitmap_MOVEFILE,Bitmap_OPENDIR; Bitmap_CHANGEFILE.LoadBitmap(IDB_CHANGEFILE); Bitmap_DELFILE.LoadBitmap(IDB_DELFILE); Bitmap_MOVEFILE.LoadBitmap(IDB_MOVEFILE); Bitmap_OPENDIR.LoadBitmap(IDB_OPENDIR); pMenu->SetMenuItemBitmaps(IDR_CHANGEFILE,MF_BYCOMMAND,&Bitmap_CHANGEFILE,&Bitmap_CHANGEFILE); pMenu->SetMenuItemBitmaps(IDR_DELFILE,MF_BYCOMMAND,&Bitmap_DELFILE,&Bitmap_DELFILE pMenu->SetMenuItemBitmaps(IDR_MOVEFILE,MF_BYCOMMAND,&Bitmap_MOVEFILE,&Bitmap_MOVEFILE); pMenu->SetMenuItemBitmaps(IDR_OPENDIR,MF_BYCOMMAND,&Bitmap_OPENDIR,&Bitmap_OPENDIR); pMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, pt.x,pt.y,this); //使用TrackPopupMenu函数来弹出菜单 CView::OnRButtonDown(nFlags, point);//处理鼠标右键消息} 展开
我想实现对每一列数据进行删除等操作。
如何实现只在在列表框中右键弹出菜单。并且能获取按下右键时指针所在列表的行数。
怎么改啊!谢谢啦!
void CNSRView::OnRButtonDown(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 CMenu PopMenu; //实例化一个菜单对象 CMenu *pMenu; //指针 PopMenu.LoadMenu(IDR_M_MENU);//装载自定义的右键菜单 pMenu = PopMenu.GetSubMenu (0); //获取第一个弹出菜单,所以第一个菜单必须有子菜单 CPoint pt; //定义一个用于确定光标位置的位置 GetCursorPos(&pt);//获取当前光标的位置,以便使得菜单可以跟随光标 CBitmap Bitmap_CHANGEFILE,Bitmap_DELFILE,Bitmap_MOVEFILE,Bitmap_OPENDIR; Bitmap_CHANGEFILE.LoadBitmap(IDB_CHANGEFILE); Bitmap_DELFILE.LoadBitmap(IDB_DELFILE); Bitmap_MOVEFILE.LoadBitmap(IDB_MOVEFILE); Bitmap_OPENDIR.LoadBitmap(IDB_OPENDIR); pMenu->SetMenuItemBitmaps(IDR_CHANGEFILE,MF_BYCOMMAND,&Bitmap_CHANGEFILE,&Bitmap_CHANGEFILE); pMenu->SetMenuItemBitmaps(IDR_DELFILE,MF_BYCOMMAND,&Bitmap_DELFILE,&Bitmap_DELFILE pMenu->SetMenuItemBitmaps(IDR_MOVEFILE,MF_BYCOMMAND,&Bitmap_MOVEFILE,&Bitmap_MOVEFILE); pMenu->SetMenuItemBitmaps(IDR_OPENDIR,MF_BYCOMMAND,&Bitmap_OPENDIR,&Bitmap_OPENDIR); pMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, pt.x,pt.y,this); //使用TrackPopupMenu函数来弹出菜单 CView::OnRButtonDown(nFlags, point);//处理鼠标右键消息} 展开
1个回答
展开全部
这是我的程序代码片段,有关获取鼠标点到列表框行列的代码,发给你参考下:
typedef pair<int,int> CellIndex; // Row, Column
// 当鼠标右键点击时有一个CPoint传给你,然后根据CPoint来获取列表框的行和列。
// 用HitTest函数即可获取。
CListCtrlEx::CellIndex CListCtrlEx::PointToIndex(const CPoint&point)
{
LVHITTESTINFO lvHitTestInfo;
CRect rect;
lvHitTestInfo.pt=point;
if(HitTest(&lvHitTestInfo)>=0||(SubItemHitTest(&lvHitTestInfo)>=0)&&lvHitTestInfo.iItem>=0)
{
intnRow =lvHitTestInfo.iItem;
intnColumnCount =GetColumnCount();
for(intnColumn=0;nColumn<nColumnCount;++nColumn)
{
if(GetCellRect(nRow,nColumn,rect))
{
if(rect.PtInRect(point))
{
return make_pair(nRow,nColumn);
}
}
}
}
return make_pair(-1,-1);
}
typedef pair<int,int> CellIndex; // Row, Column
// 当鼠标右键点击时有一个CPoint传给你,然后根据CPoint来获取列表框的行和列。
// 用HitTest函数即可获取。
CListCtrlEx::CellIndex CListCtrlEx::PointToIndex(const CPoint&point)
{
LVHITTESTINFO lvHitTestInfo;
CRect rect;
lvHitTestInfo.pt=point;
if(HitTest(&lvHitTestInfo)>=0||(SubItemHitTest(&lvHitTestInfo)>=0)&&lvHitTestInfo.iItem>=0)
{
intnRow =lvHitTestInfo.iItem;
intnColumnCount =GetColumnCount();
for(intnColumn=0;nColumn<nColumnCount;++nColumn)
{
if(GetCellRect(nRow,nColumn,rect))
{
if(rect.PtInRect(point))
{
return make_pair(nRow,nColumn);
}
}
}
}
return make_pair(-1,-1);
}
更多追问追答
追问
这是基于单文档的么?
追答
这个是列表框重载了鼠标右键消息,从右键消息获取到CPoint的值,即鼠标点击的坐标,然后将坐标转换为列表框的行和列。
这个功能和单文档没太大关系,在多文档、对话框也能工作的。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询