我的问题是:在视图里面想要修改数据,当我没有拖动滚动掉的时候,可以准确选中数据,并修改数据,但是当拖动滚动条时,然后修改数据,就会产生这样的情况:选不中这个方框,方框移到下面去了,导致修改数据出现异常。下面是我的程序:
void CdatabaseView::OnLButtonDown(UINT nFlags, CPoint point)

//下面是标记鼠标点击的位置
CClientDC dc(this); 
                OnPrepareDC(&dc);//这句话必须要,不然设备坐标系与逻辑坐标系难以转换
dc.DPtoLP(&point);//在绘图之前把鼠标位置坐标转换为逻辑坐标,当滚动条拖动时,鼠标坐标会发生变化,窗口的同一地方,坐标值不一样
               dc.DPtoLP(&m_ptSave);
CString strout1,strout2;
//显示坐标
strout1.Format("x=%d",point.x);
                strout2.Format("y=%d",point.y);
CFont *oldfont1=(CFont*)dc.SelectObject(m_pFont);
dc.SetTextColor(m_fontcolor);
dc.TextOut(0,20,strout1);
               dc.TextOut(0,40,strout2);
dc.SelectObject(oldfont1); BOOL flag=FALSE;//标志变量用于退出循环
   
int row = m_nRow;//记录数据行号和列号
int column = m_nColumn;
   
if (m_nRow >= 0 && m_nColumn >= 0)//先判断一下是否已经进行了编辑,若是编辑了那么执行复制功能
//第一次点击的时候,由于均为-1,故进不来,但是第二次点击的时候,由于行和列均有非负值,故通过条件,并执行复制语句
{
    CString str;
m_Edit.GetWindowText(str); //保存上一次编辑框中的数据,然后再赋值给相应的值
switch(m_nColumn)
{
case 0:datavec[m_nRow].school=str;break;
case 1:datavec[m_nRow].dept=str;break;
case 2:datavec[m_nRow].major=str;break;
case 3:datavec[m_nRow].dormy=str;break;
case 4:datavec[m_nRow].pay=str;break;
case 5:datavec[m_nRow].name=str;break;
case 6:datavec[m_nRow].sex=str;break;
case 7:datavec[m_nRow].no=str;break;
case 8:datavec[m_nRow].age=str;break;
case 9:datavec[m_nRow].home=str;break;
}
}
//重新初始化行号列号
m_nRow = 0;
m_nColumn = 0; if (point.y>170&&point.y<170+(datavec.size())*30&&point.x>130&&point.x<930)//判断鼠标点击的位置是否在编辑范围内
{
for (int i=0;i<datavec.size();i++)//按行查询
{
for (int j=0;j<10;j++)//按列查询
{
if (point.x>=130+j*80&&point.x<210+j*80&&point.y>=170+30*i&&point.y<200+30*i)
{
m_ptSave.x=130+j*80;
m_ptSave.y=170+30*i;
m_nRow = i;
m_nColumn=j;
flag=TRUE;//标志变量flag用于退出循环,true表示退出循环
break;
}
}
if (flag==TRUE)
{
break;
}
}
m_Edit.MoveWindow(m_ptSave.x,m_ptSave.y,80,30);//将刚开始创建的编辑框移到鼠标点击的位置方框
m_Edit.ShowWindow(SW_SHOW);
//OnPrepareDC(&dc);//这句话必须要,不然设备坐标系与逻辑坐标系难以转换
//dc.DPtoLP(&point);//在绘图之前把鼠标位置坐标转换为逻辑坐标,当滚动条拖动时,鼠标坐标会发生变化,窗口的同一个地方,
////坐标值不一样
//dc.DPtoLP(&m_ptSave);
//Invalidate();
}
else
{
m_nRow = -1;
m_nColumn = -1;
//MessageBox("对不起,你点击的地方越界了!!!");
m_Edit.ShowWindow(SW_HIDE);
}
CScrollView::OnLButtonDown(nFlags, point);
}