当前位置:编程学习 > VC++ >>

VC++ 视图\\文档编程的问题

我的参考书有这么一个程序:但是有些问题想不明白,请教一下各位!(问题在图片上)

实现视图窗口中数据拖动
*****************************************
头文件声明变量:
int
m_ItmIndex;
CImageList* m_pDrgImg;
BOOL m_Drag;

以下对应声明:
void CDragViewView::OnInitialUpdate()
{
CListView::OnInitialUpdate();

CListCtrl* pListCtl=&GetListCtrl();
pListCtl->ModifyStyle(0L,LVS_REPORT);
pListCtl->SetExtendedStyle(LVS_EX_FLATSB
|LVS_EX_FULLROWSELECT
|LVS_EX_HEADERDRAGDROP
|LVS_EX_ONECLICKACTIVATE
|LVS_EX_GRIDLINES);
pListCtl->InsertColumn(0,"员工编号",LVCFMT_LEFT,100);
pListCtl->InsertColumn(1,"员工姓名",LVCFMT_LEFT,100);
pListCtl->InsertColumn(2,"文化程度",LVCFMT_LEFT,100);
pListCtl->InsertItem(0,"0001");
pListCtl->SetItemText(0,1,"赵一");
pListCtl->SetItemText(0,2,"专科");
pListCtl->InsertItem(1,"0002");
pListCtl->SetItemText(1,1,"钱二");
pListCtl->SetItemText(1,2,"本科");
pListCtl->InsertItem(2,"0003");
pListCtl->SetItemText(2,1,"孙三");
pListCtl->SetItemText(2,2,"研究生");
}
void CDragViewView::OnBegindrag(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
POINT pt;
m_ItmIndex = ((NM_LISTVIEW *)pNMHDR)->iItem;
int pos
= GetListCtrl().GetSelectionMark();
m_pDrgImg = GetListCtrl().CreateDragImage(m_ItmIndex,&pt);
m_pDrgImg->BeginDrag(0,pt);
m_pDrgImg->DragEnter(this,pt);
m_Drag = TRUE;
*pResult = 0;
}

void CDragViewView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(m_Drag)
{
CPoint pt;
pt.x = point.x;
pt.y = point.y + (m_ItmIndex + 1) * 15;
m_pDrgImg->DragMove(pt);
}
CListView::OnMouseMove(nFlags, point);
}

void CDragViewView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(m_Drag)
{
m_pDrgImg->EndDrag();
m_Drag = FALSE;
char name[256];
LV_ITEM lvi;
CString subitem[3];
for(int i=2;i>=0;i--)
{
ZeroMemory(&lvi,sizeof(LV_ITEM));
lvi.iItem = m_ItmIndex;
lvi.iSubItem = i;
lvi.mask = LVIF_IMAGE | LVIF_TEXT;
lvi.pszText = name;
lvi.cchTextMax = 255;
GetListCtrl().GetItem(&lvi);
subitem[i].Format("%s",name);
}
GetListCtrl().InsertItem(&lvi);
GetListCtrl().SetItemText(m_ItmIndex,1,subitem[1]);
GetListCtrl().SetItemText(m_ItmIndex,2,subitem[2]);
}
CListView::OnLButtonUp(nFlags, point);
}
****************************************************************************
以下有几个问题请高手解答........请看图片(放大看)
问题写在图片上,先谢谢高手!!
答案:问题一:
pt.y = point.y + (m_ItmIndex + 1) * 15;是因为
OnBegindrag(NMHDR* pNMHDR, LRESULT* pResult) 函数里的
m_pDrgImg = GetListCtrl().CreateDragImage(m_ItmIndex,&pt);
//pt.x=0;pt.y=0;//
//如果你把这个点变成零,
//就可以把+ (m_ItmIndex + 1) * 15去掉了
m_pDrgImg->BeginDrag(0,pt);
m_pDrgImg->DragEnter(this,pt);
这里的pt点并不是原点,所以起点移动了,要矫正回来。

问题二:
确实int pos
= GetListCtrl().GetSelectionMark();没起作用,可以注释掉。
m_pDrgImg->BeginDrag(0,pt);这个图形列表只存入一项,移动的也只有第一项,ID号就是0,改成其他数你可以看到是黑框效果;

问题三:
for(int i=2;i>=0;i--)
{
ZeroMemory(&lvi,sizeof(LV_ITEM));
lvi.iItem = m_ItmIndex;
lvi.iSubItem = i;
lvi.mask = LVIF_IMAGE | LVIF_TEXT;
lvi.pszText = name;
//给lvi.pszText 传的是name,所以后面的GetListCtrl().GetItem(&lvi)时
//只要lvi.pszText一变,name也会变的。
lvi.cchTextMax = 255;
GetListCtrl().GetItem(&lvi);
//前面的是设lvi的一些参数,再用lvi得到字符串,
//传给name,二者功能并不重复
subitem[i].Format("%s",name);
}
GetListCtrl().InsertItem(&lvi);
//设置行和列?你去看OnInitialUpdate()不也没设置吗?这个函数每插入
//一项,其相应值都在增加,不用人去手动改变。
GetListCtrl().SetItemText(m_ItmIndex,1,subitem[1]);
GetListCtrl().SetItemText(m_ItmIndex,2,subitem[2]);

有什么问题欢迎Hi上讨论

上一个:为什么我的vc++不能运行?
下一个:vc++运行库是干吗的哦

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,