我用SDK实现了一个无标题栏的窗口,将其中一部分作为标题栏,为了能鼠标拖动窗口我拦截了WM_NCHITTEST消息,代码如下:
x = LOWORD(lParam);
y = HIWORD(lParam);
Point.x = x;
Point.y = y;
ScreenToClient(hWnd, &Point);
if (PointInRegion(Point.x, Point.y, CLOSE_BUTTON_LEFT, CLOSE_BUTTON_RIGHT, CLOSE_BUTTON_TOP, CLOSE_BUTTON_BOTTOM))
{
return HTCLOSE;
}
if (NONGLI_PointInRegion(Point.x, Point.y, MIN_BUTTON_LEFT, MIN_BUTTON_RIGHT, MIN_BUTTON_TOP, MIN_BUTTON_BOTTOM))
{
return HTMINBUTTON;
}
if (NONGLI_PointInRegion(Point.x, Point.y, 0, WINDOW_TITLE_WIDTH, 0, WINDOW_TITLE_HEIGHT))
{
return HTCAPTION;
}
return DefWindowProc(hWnd, Message, wParam, lParam);
问题是
如果不拦截WM_NCLBUTTONDOWN消息,必须双击“标题栏”区域才能得到消息WM_NCLBUTTONUP,这时要双击自定义的关闭和最小化按钮(在自定义的标题栏区域上)才能进行相应的操作。
如果拦截了M_NCLBUTTONDOWN消息,则不能鼠标拖动,但却能单击收到消息WM_NCLBUTTONUP(也就能单击自定义的关闭和最小化按钮才能进行相应的操作)
这是什么原因,我想要的是按下鼠标左键不放能拖动窗口,而且能单击自定义的关闭和最小化按钮进行关闭和最小化操作!

解决方案 »

  1.   

    可以通过鼠标移动结合movewindow,我刚实现可以的...有问题可以发E-mail交流啊/cy
    [email protected]
      

  2.   

    如果是想当用户拖动窗口时不让窗口移动,这倒是有个简单的方法,ClipCursor,把鼠标框在一个点上,这样鼠标动不了了,就不会移动,而不会影响到事件的处理。不过用完之后一定要用ClipCursor重新把鼠标放开,不然鼠标就一直都动不了了。
      

  3.   

    楼上的误解了,我不是不让窗口移动,而是不想双击才能得到WM_NCLBUTTONUP
      

  4.   

    这个我想可能是WM_LBUTTONDOWN之后,WM_NCHITTEST,之后才是WM_NCLBUTTONDOWN所以得双击。解决办法……我觉得没办法解决,换个方法做。
    SendMessage(NCLBUTTONDOWN, HTCAPTION)这个函数可以使窗口移动。
    可以在鼠标在合理区域按下时调用此函数,然后窗口就会随鼠标移动。不用NCHITTEST也可以。至于最小化嘛,放个按钮就好。
      

  5.   

    楼上的方法的确可以,但收不到左键双击消息WM_LBUTTONDBLCLK
      

  6.   

    收不到应该很正常把。不在客户区域。可以监视鼠标当前位置,然后再得到程序的窗口位置,然后判断。不过这个事件也应该是非有效区域的鼠标事件把只是个人意见。对MFC不是很熟悉。
      

  7.   

    在发送消息之后,函数挂起直到返回,所以在用户拖动窗口的过程中,什么消息也收不到,不过这样才最好,在窗口移动时还想处理什么鼠标消息呢?如果想函数在发送完消息之后不等消息处理好便直接返回,用PostMessage。
    想收到双击消息也不难,并不是每次按下鼠标都是想要拖动,可以把这个消息发送动作放在MouseMove事件里,nFlags会指示鼠标在移动时按下了哪个键,具体常量见MSDN。这样可以在鼠标移动并且左键按下时再发送消息,双击消息也可以收到了。
    但这样有个缺点,就是不是鼠标一动窗口就会开始动,可以看到在鼠标刚开始拖动时窗口并没有移动。不过这也无所谓。
      

  8.   

    没有得到双击消息,可能是由于窗口没有属性CS_DBLCLKS