怎么作出象winamp那样的停靠窗口?

解决方案 »

  1.   

    就是在WM_MOVING  中判断窗口的边框是否到达了屏幕的边界,如果他们的距离还差比如15,那么就直接移到屏幕的边界。
      

  2.   

    BOOL AdjustPos(CRect* lpRect)
    {
        //自动靠边
        int iSX=GetSystemMetrics(SM_CXFULLSCREEN);
        int iSY=GetSystemMetrics(SM_CYFULLSCREEN);    RECT rWorkArea;
        BOOL bResult = SystemParametersInfo(SPI_GETWORKAREA, sizeof(RECT), &rWorkArea, 0);     CRect rcWA;
        if(!bResult)
        {
            //如果调用不成功就利用GetSystemMetrics获取屏幕面积
    rcWA=CRect(0,0,iSX,iSY);
        }
        else
    rcWA=rWorkArea;    int iX=lpRect->left;
        int iY=lpRect->top;
        if(iX < rcWA.left + DETASTEP && iX!=rcWA.left)
        {
            //调整左
    //pWnd->SetWindowPos(NULL,rcWA.left,iY,0,0,SWP_NOSIZE);
    lpRect->OffsetRect(rcWA.left-iX,0);
    AdjustPos(lpRect);
    return TRUE;
        }
        if(iY < rcWA.top + DETASTEP && iY!=rcWA.top)
        {
    //调整上
    //pWnd->SetWindowPos(NULL ,iX,rcWA.top,0,0,SWP_NOSIZE);
    lpRect->OffsetRect(0,rcWA.top-iY);
    AdjustPos(lpRect);
    return TRUE;
        }
        if(iX + lpRect->Width() > rcWA.right - DETASTEP && iX !=rcWA.right-lpRect->Width())
        { 
    //调整右
    //pWnd->SetWindowPos(NULL ,rcWA.right-rcW.Width(),iY,0,0,SWP_NOSIZE);
    lpRect->OffsetRect(rcWA.right-lpRect->right,0);
    AdjustPos(lpRect);
    return TRUE;
        }
        if(iY + lpRect->Height() > rcWA.bottom - DETASTEP && iY !=rcWA.bottom-lpRect->Height())
        {
    //调整下
         //pWnd->SetWindowPos(NULL ,iX,rcWA.bottom-rcW.Height(),0,0,SWP_NOSIZE);
    lpRect->OffsetRect(0,rcWA.bottom-lpRect->bottom);
    return TRUE;
        }
        return FALSE;
    }
    //然后在ONMOVEING事件中使用所下过程调用
    CRect r=*pRect;
    AdjustPos(&r);
    *pRect=(RECT)r;
      

  3.   

    WM_MOVING中判断一把,如果两个窗口的距离小于或者等于你规定的一个值,就直接把窗口MoveWindow()过去,靠上去即可