QQ登录

只需一步,快速开始

窗口对桌面磁性功能添加与取消--上位机VC

[ 复制链接 ]

窗口对桌面磁性功能添加与取消--上位机VC

窗口对桌面磁性功能添加与取消--上位机VC

窗口对桌面磁性功能添加与取消--上位机VC
功能展示
窗口具有磁性可以使程序更个性化,当前例程让窗口在桌面上可以激活磁性及取消磁性功能,效果如图,程序启动时全自动吸附到桌面底部,用鼠标拖动时会感觉到有磁力吸食桌面边框,点击两个按钮可激磁性及取消磁性
要点提示
在对话框程序中,窗口移动过程中会触发一函数OnMoving()可函数中们可以通过修改第二个参数LPRECT来改变窗口的大小及位置,当前例程就是在此函数内调用一个自定义的函数AdjustPos()更改窗口的位置,进而让窗口在靠近窗口桌面边缘时通过计算设置窗口的边缘在桌面的边缘上;
实现功能
1.新建基于对话框的应用程序

2.添加自定义函数AdjustPos()及窗口移动中函数OnMoving()在此函数中调用我们自定义的函数
  1. BOOL AdjustPos(CRect* lpRect)
  2. {
  3.         if(!g_bActive)return false;
  4.         //自动靠边
  5.         int iSX=GetSystemMetrics(SM_CXFULLSCREEN);
  6.         int iSY=GetSystemMetrics(SM_CYFULLSCREEN);
  7.         RECT rWorkArea;
  8.         BOOL bResult = SystemParametersInfo(SPI_GETWORKAREA, sizeof(RECT), &rWorkArea,0);   
  9.         CRect rcWA;
  10.         if(!bResult)
  11.         {//如果调用不成功就利用GetSystemMetrics获取屏幕面积
  12.                 rcWA=CRect(0,0,iSX,iSY);
  13.         }
  14.         else
  15.                 rcWA=rWorkArea;

  16.         int iX=lpRect->left;
  17.         int iY=lpRect->top;

  18.         if(iX < rcWA.left + DETASTEP && iX!=rcWA.left)
  19.         {//调整左
  20.                 //pWnd->SetWindowPos(NULL,rcWA.left,iY,0,0,SWP_NOSIZE);
  21.                 lpRect->OffsetRect(rcWA.left-iX,0);
  22.                 AdjustPos(lpRect);
  23.                 return TRUE;
  24.         }
  25.         if(iY < rcWA.top + DETASTEP && iY!=rcWA.top)
  26.         {//调整上
  27.                 //pWnd->SetWindowPos(NULL ,iX,rcWA.top,0,0,SWP_NOSIZE);
  28.                 lpRect->OffsetRect(0,rcWA.top-iY);
  29.                 AdjustPos(lpRect);
  30.                 return TRUE;
  31.         }
  32.        
复制代码
  1. if(iX + lpRect->Width() > rcWA.right - DETASTEP && iX !=rcWA.right-lpRect->Width())
  2.         {//调整右
  3.                 //pWnd->SetWindowPos(NULL ,rcWA.right-rcW.Width(),iY,0,0,SWP_NOSIZE);
  4.                 lpRect->OffsetRect(rcWA.right-lpRect->right,0);
  5.                 AdjustPos(lpRect);
  6.                 return TRUE;
  7.         }
  8.         if(iY + lpRect->Height() > rcWA.bottom - DETASTEP && iY !=rcWA.bottom-lpRect->Height())
  9.         {//调整下
  10.                 //pWnd->SetWindowPos(NULL ,iX,rcWA.bottom-rcW.Height(),0,0,SWP_NOSIZE);
  11.                 lpRect->OffsetRect(0,rcWA.bottom-lpRect->bottom);
  12.                 return TRUE;
  13.         }
  14.         return FALSE;
  15. }
  16. void CGkbc8Dlg::OnMoving(UINT fwSide, LPRECT pRect)
  17. {
  18. //        CDialog::OnMoving(fwSide, pRect);
  19.         CRect r=*pRect;
  20.         AdjustPos(&r);
  21.         *pRect=(RECT)r;       
  22. }
复制代码
3.添加代码段#define DETASTEP  20  bool    g_bActive = TRUE;及两按钮点击函数
  1. void CGkbc8Dlg::OnButton1()
  2. {
  3.         g_bActive = true;
  4.         SetTimer(1,10,NULL);
  5. }

  6. void CGkbc8Dlg::OnButton2()
  7. {
  8.         g_bActive=false;
  9. }
复制代码
4.添加定时器处理函数,也可以初始化程序时启动一个ID为1的定时器
  1. void CGkbc8Dlg::OnTimer(UINT nIDEvent)
  2. {
  3.         if(nIDEvent ==1)
  4.         {
  5.                 int iSY=GetSystemMetrics(SM_CYFULLSCREEN);
  6.                 WINDOWPLACEMENT PLACE;
  7.                 GetWindowPlacement(&PLACE);
  8.                 if(PLACE.rcNormalPosition.bottom>=iSY)
  9.                 {
  10.                         KillTimer(1);
  11.                         return;
  12.                 }
  13.                 PLACE.rcNormalPosition.top +=50;
  14.                 PLACE.rcNormalPosition.bottom+=50;
  15.                 SetWindowPlacement(&PLACE);

  16.         }
  17.         CDialog::OnTimer(nIDEvent);
  18. }
复制代码
我们来演示下功能实现的整个过程

请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:窗口对桌面磁性功能添加与取消--上位机VC.rar 
文件大小:202.75 KB  售价:10金币
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我

  

如果您认可,可联系功能定制!

  

如果您着急,充值会员可直接联系发您资料!

  

QQ联系我

微信扫扫联系我

  

回复

使用道具 举报

点击查看
快速回复 返回列表 客服中心 搜索