| 窗口对桌面磁性功能添加与取消--上位机VC   窗口对桌面磁性功能添加与取消--上位机VC
 功能展示
 窗口具有磁性可以使程序更个性化,当前例程让窗口在桌面上可以激活磁性及取消磁性功能,效果如图,程序启动时全自动吸附到桌面底部,用鼠标拖动时会感觉到有磁力吸食桌面边框,点击两个按钮可激磁性及取消磁性
 要点提示
 
 在对话框程序中,窗口移动过程中会触发一函数OnMoving()可函数中们可以通过修改第二个参数LPRECT来改变窗口的大小及位置,当前例程就是在此函数内调用一个自定义的函数AdjustPos()更改窗口的位置,进而让窗口在靠近窗口桌面边缘时通过计算设置窗口的边缘在桌面的边缘上; 实现功能 1.新建基于对话框的应用程序 
 2.添加自定义函数AdjustPos()及窗口移动中函数OnMoving()在此函数中调用我们自定义的函数 复制代码BOOL AdjustPos(CRect* lpRect)
{
        if(!g_bActive)return false;
        //自动靠边
        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;
}
void CGkbc8Dlg::OnMoving(UINT fwSide, LPRECT pRect) 
{
//        CDialog::OnMoving(fwSide, pRect);
        CRect r=*pRect;
        AdjustPos(&r);
        *pRect=(RECT)r;        
}
3.添加代码段#define DETASTEP  20  bool    g_bActive = TRUE;及两按钮点击函数 复制代码void CGkbc8Dlg::OnButton1() 
{
        g_bActive = true;
        SetTimer(1,10,NULL);
}
void CGkbc8Dlg::OnButton2() 
{
        g_bActive=false;
}
4.添加定时器处理函数,也可以初始化程序时启动一个ID为1的定时器 复制代码void CGkbc8Dlg::OnTimer(UINT nIDEvent) 
{
        if(nIDEvent ==1)
        {
                int iSY=GetSystemMetrics(SM_CYFULLSCREEN);
                WINDOWPLACEMENT PLACE;
                GetWindowPlacement(&PLACE);
                if(PLACE.rcNormalPosition.bottom>=iSY)
                {
                        KillTimer(1);
                        return;
                }
                PLACE.rcNormalPosition.top +=50;
                PLACE.rcNormalPosition.bottom+=50;
                SetWindowPlacement(&PLACE);
        }
        CDialog::OnTimer(nIDEvent);
}
我们来演示下功能实现的整个过程 
   如果您认可,可联系功能定制! 如果您着急,充值会员可直接联系发您资料!    
 |