作业帮 > 综合 > 作业

if (point.x == -1 && point.y ==

来源:学生作业帮 编辑:百度作业网作业帮 分类:综合作业 时间:2024/07/20 16:44:48
if (point.x == -1 && point.y ==
void CMenuView::OnContextMenu(CWnd*,CPoint point)
{
// CG:This block was added by the Pop-up Menu component
{
if (point.x == -1 && point.y == -1){
//keystroke invocation
CRect rect;
GetClientRect(rect);
ClientToScreen(rect);
point = rect.TopLeft();
point.Offset(5,5);
}
mfc里右键菜单设置,这个好像是把界面坐标转化为屏幕坐标,但是if (point.x == -1 && point.y == -1)这个干吗呢?
if (point.x == -1 && point.y ==
point.x == -1 && point.y == -1是用来判断你鼠标右键单击时,鼠标的位置是否在客户区,即视类窗口,如果在视类窗口,则point.x和point.y都会是-1
再问: point.x和point.y指的不是鼠标在客户区的坐标吗,这种(50,100)这样的吗?
再答: 是指客户区的坐标,即视类的坐标,所以才要转化成屏幕坐标
再问: 所谓客户区坐标,不就是以窗口左上角为坐标原点,那么如果按你说的,如果鼠标点击在客户区后,显示的point.x和point.y不是以窗口左上角为原点的坐标吗,不是应该是(50,100)这样的吗,为什么这时的point.x和point.y不是50,100,而要判断是-1,还出来负数了,一旦负数就开始转换为屏幕坐标,这是什么逻辑
再答: 我看错代码了,point.x == -1 && point.y == -1是用来判断你鼠标右键单击时,鼠标的位置是否在客户区,即视类窗口,如果(不)在视类窗口,则point.x和point.y都会是-1,然后会取当前客户区左上角坐标赋给point,而point.Offset(5, 5);是把菜单显示在鼠标右边,即point.Offset(5, 5);是把point.x和point.y各自加上5,如果不在客户区,那么菜单将显示在左上角。
再问: 非常感谢您的回答,您的意思是说,函数的形参CPoint point,会接受两次赋值,第一次point.x ,point.y会被赋予-1或者其他值,并判断是否在客户区,如果在客户区第二次“然后会取当前客户区左上角坐标赋给point”,这时point.x ,point.y又会被赋值客户区的坐标,是这个过程吗?
再答: CPoint类的构造函数在初始化(使用之前)的时候会给point.x point.y这个对象赋予-1,客户区其实就是空白那个部分,例如笔记本那里可以写文字的那部分就是客户区,如果当前鼠标右击时不在客户区,那么那个弹出菜单就会在客户区的最左上角显示出来。如果在客户区,那么point.x point.y的值就不会是-1了,而是相对于客户区的坐标。