小弟在弄一个五子棋程序,
其中程序如下:
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值得判断?
请指教一下,谢谢!!
其中程序如下:
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值得判断?
请指教一下,谢谢!!
ScreenToClient(...)这个函数转换
那么rect.lptodp()等函数跟ClientToScreen()的用法怎样?
还有view类里的Rect成员的m_rect(xx1,yy1,xx2,yy2)中四个坐标怎样确定?
它与逻辑坐标画出来的矩形怎样联系起来?
请指点一下,谢谢!
这个也是屏幕坐标不要误导人,请看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
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;
}
直接把鼠标点和棋盘的最小外接矩形(先逻辑坐标转换成客户去坐标)比较,就能知道是否点在棋盘上
GetClientRect(&r);MSDN中的确写的是客户区坐标,但是我在框架编程时,在OnSize中发现它好像不是客户区坐标,只有ScreenToClient(&r)才可以。我是跟踪进去发现的。