case WM_NCHITTEST:
if (DefWindowProc(hWnd,uMsg,wParam,lParam) == HTCLIENT)
{
l_OMouse.x=LOWORD(lParam);
l_OMouse.y=HIWORD(lParam);
if(l_OMouse.x>l_OClose.x&&l_OMouse.y<l_OClose.y) 
{
return HTCLOSE;
}
else return HTCAPTION;
} return 0;想让鼠标到达某个区域时候,可以进行关闭,可是不成功。但是如果里面的 HTCLOSE换成HTTOPRIGHT 会成功变成斜箭头。
我尝试过其它的HT消息,某些能成功,某些不成功,是为什么?然后我在前面的语句后加了
case WM_NCLBUTTONDOWN:
switch(wParam)
{
case HTCLOSE:
PostQuitMessage(0); //when the cursor in over the close button
return 0;
}
return 0;窗口能在所设定区域点击关闭,可是拖动功能又没有了。
该如何保证拖动的同时,能执行其它功能?

解决方案 »

  1.   

    我把窗口风格从popup改回 WS_OVERLAPPEDWINDOW,在制定区域内单击鼠标,看到了关闭按钮有按下的反应,可是就是没有执行关闭窗口。
      

  2.   

    case WM_NCLBUTTONDOWN: 
    switch(wParam) 

    case HTCLOSE: 
    PostQuitMessage(0); //when the cursor in over the close button 
    return 0; 

    return 0; 
    ====================================
    鼠标一按下去就程序就退出了,还怎么能拖动啊,还有你的WM_NCHITTEST处理好像有点不当
    case WM_NCHITTEST: 
    if (DefWindowProc(hWnd,uMsg,wParam,lParam) == HTCLIENT) 
    ............
    如果条件不成立就返回0了,0表示的是HTNOWHERE
    把你的要求说清楚了
      

  3.   

    我的意思是,关闭功能正常后,在关闭区域外的拖动功能就不正常了。我的代码的意思是在关闭区域外,就返回 HTCAPTION,告诉窗口光标处于标题栏,可以对窗口拖动。
      

  4.   

    case WM_NCLBUTTONDOWN:  
    switch(wParam)  
    {  
    case HTCLOSE:  
    PostQuitMessage(0); //when the cursor in over the close button  
    return 0;  
    }  
    return DefWindowProc(hWnd,uMsg,wParam,lParam); //如果你这里返回了0就不处理WM_NCLBUTTONDOWN
      

  5.   

    对WM_NCLBUTTONDOWN消息处理不当。
    如果鼠标点在不感兴趣的位置不是返回,而是应该交给窗口默认处理过程。
      

  6.   

    问题又一次解决了,改成 case WM_NCHITTEST:
    if (DefWindowProc(hWnd,uMsg,wParam,lParam) == HTCLIENT)
    {
    //return HTCAPTION;
    l_OMouse.x=LOWORD(lParam);
    l_OMouse.y=HIWORD(lParam);
    if(l_OMouse.x>l_OClose.x&&l_OMouse.y<l_OClose.y) 
    {
    return HTCLOSE;
    }
    else return HTCAPTION;
    }
    return 0; case WM_NCLBUTTONDOWN:
    switch(wParam)
    {
    case HTCLOSE:
    PostQuitMessage(0);
    return 0;
    }
    break;就行了