视图中修改数据以及滚动条

wanghaitao19881025 2011-12-06 05:02:19
在视图里面想修改数据,没有拖动滚动掉的时候,可以准确选中数据,并修改数据,但是当拖动滚动条时,然后修改数据,就会产生这样的情况:选不中这个方框,方框移到下面去了,导致修改数据出现异常。
下面是我的程序:
void CdatabaseView::OnLButtonDown(UINT nFlags, CPoint point)
{
//下面是标记鼠标点击的位置
CClientDC dc(this);
OnPrepareDC(&dc);//这句话必须要,不然设备坐标系与逻辑坐标系难以转换
dc.DPtoLP(&point);//在绘图之前把鼠标位置坐标转换为逻辑坐标,当滚动条拖动时,鼠标坐标会发生变化,窗口的同一地方,坐标值不一样
dc.DPtoLP(&m_ptSave);
CString strout1,strout2;
//显示坐标
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);
}
...全文
49 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
wanghaitao1988 2011-12-06
  • 打赏
  • 举报
回复
只需要在m_Edit.MoveWindow(m_ptSave.x,m_ptSave.y,80,30);之前加一句话dc.LPtoDP(&m_ptSave);将坐标系还原就可以了
wanghaitao19881025 2011-12-06
  • 打赏
  • 举报
回复
只需要在m_Edit.MoveWindow(m_ptSave.x,m_ptSave.y,80,30);之前加一句话dc.LPtoDP(&m_ptSave);将坐标系还原就可以了

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧