模拟QQ自动隐藏窗体

//---------------------------------------------------------------------------
// 代码名称:模拟QQ自动隐藏窗体
// 代码来源:中文剑客网(CFT Group) http://www.swordman.cn/
// 代码作者:CFT Group - Solitary (QQ:80848088)
// 适用平台:Windows 2K/XP 或更高版本
// 发布时间:2005-05-21
// 代码说明:
//  仅供交流学习之用,转贴注明出处。
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "MainForm.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

//隐藏窗体用到的
INT alignType; //停靠位置 1上,2左,3右, 0不停靠
RECT m_rect; //窗体RECT
POINT m_mouse; //mouse pos
INT CurrentPos; //当前停靠位置
enum
{
ALIGN_NONE, //不停靠
ALIGN_TOP, //停靠上边
ALIGN_LEFT, //停靠左边
ALIGN_RIGHT //停靠右边
};

#define NEAR_SIZE -2 //定义自动停靠有效距离
#define NEAR_SIDE 3 //窗体隐藏后在屏幕上保留的像素,以使鼠标可以触及
#define MSLEEP 100 //定义判断延时

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
 : TForm(Owner)
{
}
//---------------------------------------------------------------------------
//判断当窗体隐藏鼠标移动到窗体时是否还需要再次隐藏窗体
//---------------------------------------------------------------------------
BOOL MouseNeedHide()
{
 if (m_rect.top <0 || m_rect.left <0 || Screen->Width - m_rect.right <2)return TRUE;
 CurrentPos=ALIGN_NONE;
 return FALSE;
}
//---------------------------------------------------------------------------
//判断是否满足隐藏条件
//---------------------------------------------------------------------------
BOOL NeedHide()
{
 return (
 ((m_rect.top < NEAR_SIZE)    //满足向上隐藏
 || (m_rect.left < NEAR_SIZE && m_mouse.x == 0)  //满足左边隐藏
 || (m_rect.right > Screen->Width+NEAR_SIZE && Screen->Width - m_mouse.x < 2))    //满足右边隐藏
 ) ;
}
//---------------------------------------------------------------------------
//判断鼠标是否在窗体rect内
//---------------------------------------------------------------------------
BOOL InForm()
{
 return (m_mouse.x > m_rect.left-2 && m_mouse.x < m_rect.right+2
 && m_mouse.y < m_rect.bottom+2 && m_mouse.y > m_rect.top-2) ;
}
//---------------------------------------------------------------------------
//隐藏窗体的函数,可以在这里添加一些特效,例如滚动隐藏 ^_^
//---------------------------------------------------------------------------
HideToAlign(INT HideType)
{
 alignType=HideType;
 if (alignType==0)return 0;
 if (alignType==1)
 {
  Form1->Top=-Form1->Height+NEAR_SIDE;
  CurrentPos=ALIGN_TOP;
  return 0;
 }
 else if (alignType==2)
 {
  Form1->Left=-Form1->Width+NEAR_SIDE;
  CurrentPos=ALIGN_LEFT;
  return 0;
 }
 else if (alignType==3)
 {
  Form1->Left=Screen->Width+NEAR_SIZE;
  CurrentPos=ALIGN_RIGHT;
  return 0;
 }
        return 0;
}
//---------------------------------------------------------------------------
//主函数
//---------------------------------------------------------------------------
DWORD __stdcall AutoHideWinThread(LPVOID)
{
    while(1)
 {
  //判断是否该显示窗体
  if(InForm()==TRUE) //如果鼠标在窗体RECT内
  {
   if (CurrentPos==ALIGN_TOP) //如果当前隐藏方向是 上
   {
    Form1->Top=-2; //显示出窗体
    while(InForm()==TRUE)
    {
     if (MouseNeedHide()==FALSE) //判断鼠标是否拖动了窗体,是否符合隐藏条件
     {
      alignType=0;
      break;
     }
     Sleep(MSLEEP);
    }
    HideToAlign(alignType); //再次隐藏窗体
   }
   else if (CurrentPos==ALIGN_LEFT)
   {
    Form1->Left=-2;
    while(InForm()==TRUE)
    {
     if (MouseNeedHide()==FALSE)
     {
      alignType=0;
      break;
     }
     Sleep(MSLEEP);
    }
    HideToAlign(alignType);
   }
   else if (CurrentPos==ALIGN_RIGHT)
   {
    Form1->Left=Screen->Width - Form1->Width +2;
    while(InForm()==TRUE)
    {
     if (MouseNeedHide()==FALSE)
     {
      alignType=0;
      break;
     }
     Sleep(MSLEEP);
    }
    HideToAlign(alignType);
   }
  }

  //判断停靠上边
  if (m_rect.top < NEAR_SIZE && m_mouse.y ==0) //如果满足向上隐藏
  {
                        alignType=1; //设置隐藏方向
   while(InForm()==TRUE) //检测鼠标是否还在窗体上
   {
    Form1->Top = NEAR_SIZE; //调整窗口位置
    if (MouseNeedHide()==FALSE) //判断鼠标是否拖动了窗体,是否符合隐藏条件
    {
     alignType=0;
     break;
    }
    Sleep(MSLEEP);
   }
   HideToAlign(alignType);
  }
  else if (m_rect.left < NEAR_SIZE && m_mouse.x == 0)
  {
                        alignType=2;
   while(InForm()==TRUE)
   {
    Form1->Left=NEAR_SIZE;
    if (MouseNeedHide()==FALSE)
    {
     alignType=0;
     break;
    }
    Sleep(MSLEEP);
   }
   HideToAlign(alignType);
  }
  else if (m_rect.right > Screen->Width+NEAR_SIZE && Screen->Width - m_mouse.x < 2)
  {
                        alignType=3;
   while(InForm()==TRUE)
   {
    Form1->Left=Screen->Width - Form1->Width - NEAR_SIZE;
    if (MouseNeedHide()==FALSE)
    {
     alignType=0;
     break;
    }
    Sleep(MSLEEP);
   }
   HideToAlign(alignType);
  }
  Sleep(MSLEEP);
 }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
 CreateThread(NULL,0,AutoHideWinThread,NULL,0,NULL); 
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormResize(TObject *Sender)
{
 if (Form1->Width > 323)Form1->Width =323;
 if (Form1->Width < 323)Form1->Width =323;
 if (Form1->Height > 164)Form1->Height =164;
 if (Form1->Height < 164)Form1->Height =164;

}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
 GetWindowRect(Form1->Handle,&m_rect);
 GetCursorPos(&m_mouse);       
}
//---------------------------------------------------------------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值