小弟在弄一个五子棋程序,
其中程序如下:
         GetClientRect(r);
pDC->SetMapMode (MM_ISOTROPIC);
//设置窗口的大小
pDC->SetWindowExt (1000,1000);
//设置视口的大小
pDC->SetViewportExt (r.right ,-r.bottom ); //设置坐标原点
pDC->SetViewportOrg (r.right/2,r.bottom /2); int x1=-420,y1=-420,x2=420,y2=420;
         pDC->Rectangle (x1,y1,x2,y2);
         
现在我要判断鼠标点击是否在棋盘上怎样判断?
         我加入view头文件中加入CRect m_rect数据成员
然后在构造函数中,初始化m_rect(xx1,yy1,xx2,yy2)   //我想请问这里的初始值是?
          //是不是指定设备坐标下的矩形而且要与逻辑坐标矩形位置一致?再LBUTTONDOWN函数中有一段
              CRect rect;  rect=m_rect      
           //这里是不是起到设备坐标矩形内与返回至POINT值得判断?
请指教一下,谢谢!!
              
                  

解决方案 »

  1.   

    除了"设备坐标和逻辑坐标"以外, 还有一个"屏幕坐标"与鼠标消息的点都是指"屏幕坐标".ClientToScreen(...)
    ScreenToClient(...)这个函数转换
      

  2.   

    GetClientRect(r);这个也是屏幕坐标
      

  3.   

    我还问弄清楚:
    那么rect.lptodp()等函数跟ClientToScreen()的用法怎样?
    还有view类里的Rect成员的m_rect(xx1,yy1,xx2,yy2)中四个坐标怎样确定?
    它与逻辑坐标画出来的矩形怎样联系起来?
    请指点一下,谢谢!
      

  4.   

    freelybird(阿愚)GetClientRect(r);
    这个也是屏幕坐标不要误导人,请看MSDN的解释:
    BOOL GetClientRect(
      HWND hWnd,      // handle to window
      LPRECT lpRect   // client coordinates
    );
    Parameters
    hWnd 
    [in] Handle to the window whose client coordinates are to be retrieved. 
    lpRect 
    [out] Pointer to a RECT structure that receives the client coordinates. The left and top members are zero. The right and bottom members contain the width and height of the window
      
     
      

  5.   

    自己写一个坐标转换函数吧!MFC 的那些函数都不好用!m_dWldToScrn是逻辑坐标转换成客户区坐标的比例因子
    m_dOrgX m_dOrgY 为视图原点void CYouVw::WldToScrn(double dx,double dy,int &nx,int &ny)
    {
        double tmpX=(dx-m_dOrgX)*m_dWldToScrn;
        double tmpY=(dy-m_dOrgY)*m_dWldToScrn;
        DbToInt(tmpX,nx);
        DbToInt(tmpY,ny);
    }
    void CYouVw::DbToInt(double dx ,int &nx)
    {
          if(dx>0){
             nx=(int)(dx+0.5);
          }else{
             nx=(int)(dx-0.5);
          }
    }
    void CYouVw::ScrnToWld(int nx,int ny,double &dx,double &dy)
    {
    dx=nx/m_dWldToScrn+m_dOrgX;
    dy=ny/m_dWldToScrn+m_dOrgY;
    }
    直接把鼠标点和棋盘的最小外接矩形(先逻辑坐标转换成客户去坐标)比较,就能知道是否点在棋盘上
      

  6.   

    CRect r;
    GetClientRect(&r);MSDN中的确写的是客户区坐标,但是我在框架编程时,在OnSize中发现它好像不是客户区坐标,只有ScreenToClient(&r)才可以。我是跟踪进去发现的。
      

  7.   

    OnSize的两个参数(cx, cy)就是窗口的大小,对View来说因为没有边框就是客户区尺寸,对Frame就是窗口带边框的大小了。你在OnSize中得到的不是客户区坐标,殊不可解,建议再研究。