int NineSelByPoint(int PointX, int PointY)
{
if ((PointX>42)&&(PointX<108)&&(PointY<66))
return 0;
if ((PointX>108)&&(PointX<174)&&(PointY<66))
return 1;
if ((PointX>174)&&(PointY<66))
return 2;
if ((PointX>42)&&(PointX<108)&&(PointY>66)&&(PointY<132))
return 3;
if ((PointX>108)&&(PointX<174)&&(PointY>66)&&(PointY<132))
return 4;
if ((PointX>174)&&(PointY>66)&&(PointY<132))
return 5;
if ((PointX>42)&&(PointX<108)&&(PointY>132)&&(PointY<198))
return 6;
if ((PointX>108)&&(PointX<174)&&(PointY>132)&&(PointY<198))
return 7;
if ((PointX>174)&&(PointY>132)&&(PointY<198))
return 8;
return -1;
}上面是我写的鼠标单击判断九宫格点击位置的函数,传入的是鼠标的坐标。每个宫格长宽都是66像素,九宫格距离左边边框是42像素。
由于还要movemouse,因此每次move都得调用此函数。
我总感觉这段代码效率不是很高,也说不上哪里的问题,求高手帮忙优化一下,学习学习。

解决方案 »

  1.   

    楼主问的什么问题呢?没看明白。
    不过如果只是判断单击那就把此函数的调用放在onlbuttondown函数中吧(WM_LBUTTONDOWN事件)。
      

  2.   

    你自己写一个新事件,从网上能搜到(OnDropDown)就是鼠标拖动的事件,会在鼠标按下并且拖动最后放开的时候触发,MFC没有这个事件,有了这个事件,就不用在MouseMove里边写了,另外你的算法效率确实不高,都是按if else顺序执行,如果是在最后一个就多跑好多指令,
    你可以把这个关系做成一个数组,就是一个表,
    传入x,y,查表得到点击的格子,
    思路是这样
      

  3.   

    我就是想看看有没有代替这种N多个IF的算法谢谢LS的,数组还真没考虑过
      

  4.   

    这样不知道效率会不会高些,至少代码行少些,参数如果调整也更灵活,出错的机会也少些,楼主试试吧int nCol = (PointX - 42) / 66;
    int nRow = PointY / 66;
    if(nCol > 0 && nCol < 3 && nRow > 0 && nRow < 3)
        return nRow * 3 + nCol;
    else
        return -1;
      

  5.   

    哦,if(nCol >= 0 && nCol < 3 && nRow >= 0 && nRow < 3)
      

  6.   

    谢谢LS的,我还刚写了个打算贴出来,不过显然没有你的效率高if ((PointX<=42)||(PointY>=198))//首先判断是否点击进九宫格区域
    return -1;
    int x = -1, y = 0;
    if (PointY<66)//Y坐标在九宫格第一行
    y = 0;
    else
    PointY>132?y=6:y=3;//Y坐标在九宫格第二,三行
    if (PointX>174)//X坐标在九宫格第三列
    x = 2;
    else
    PointX<108?x = 0:x = 1;//X坐标在九宫格第一列
    return x+y;