模拟QQ自动隐藏窗体

原创 2005年05月21日 00:57:00

//---------------------------------------------------------------------------
// 代码名称:模拟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);       
}
//---------------------------------------------------------------------------

Qt实现窗体在显示屏旁边自动隐藏(类似QQ)

Qt实现窗体在显示屏旁边自动隐藏(类似QQ)看群里有人问这个东西,本人先来无事编以自己的想法实现了下: 其实实现的点子很简单:void AutoHideWidget::leaveEvent(QEve...

仿QQ窗体自动隐藏.pas

  • 2012年09月11日 17:26
  • 5KB
  • 下载

Java实现窗体隐藏,功能类似于QQ窗口自动隐藏

自己写java程序从开始接触到现在有近两年的时间了,一直还没有怎么接触到j2ee方面的知识,比如说那些常用的框架(struts、spring、hibernate),自己都还没接触过。最近做项目又做到与...
  • ycb1689
  • ycb1689
  • 2012年04月16日 11:38
  • 894

C#WinForm仿qq窗体拖到windows窗体边上时,自动隐藏C#WinForm

C#WinForm仿qq窗体拖到windows窗体边上时,自动隐藏C#WinForm。代码:     public partial class Form1 : Form { ...

winform自动隐藏窗体

  • 2013年01月06日 20:45
  • 6KB
  • 下载

窗体自动隐藏停靠开源控件Dock控件的使用(WeiFenLuo.winFormsUI.Docking.dll的使用(停靠效果))

重置工具箱: 新建一个WinForm程序,项目名称为TestDockPanelControl。选中Form1窗体后选择工具箱--->>新建个添加选项卡命名为WeiFenLuo--->>右键---...
  • hxy870
  • hxy870
  • 2013年01月24日 15:16
  • 2585

Swing中窗体移到屏幕边缘自动隐藏

实现类似qq的屏幕边缘隐藏效果。 使用方法:new WindowAutoHide(window);  //window为java.awt.Window或其子类 根据实际需要,有以下参数可调: i...
  • ycb1689
  • ycb1689
  • 2014年01月03日 09:37
  • 1357
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:模拟QQ自动隐藏窗体
举报原因:
原因补充:

(最多只允许输入30个字)