www.gusucode.com > 三个VC++程序精灵编程源码实例源码程序 > 三个VC++程序精灵编程源码实例源码程序\code\WomanSrc\TransparentWnd.cpp

    //////////////////////////////////////////////////
//类名:CTransparentWnd
//功能:透明窗体实现
//作者:徐景周(jingzhou_xu@163.net)
//Download by http://www.NewXing.com
//作者:徐景周(jingzhou_xu@163.net)
//组织:未来工作室(Future Studio)
//日期:2001.12.1
//////////////////////////////////////////////////
#include "stdafx.h"
#include "TransparentWnd.h"
#include <assert.h>
#include "HelpTip.h"
#include "HelpTipDlg.h"
#include "DownloadAddress.h"
#include "About.h"
#include "SetRing.h"
#include "Advertise.h"
#include "Splash.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define TIMER_SET			1
#define TIMER_WALK			2
#define TIMER_IDLE			3
#define TIMER_RUN			4
#define TIMER_PLAYSOUND		5
#define TIMER_DRAGDROP		6
#define TIMER_TRANSFORM     7
#define TIMER_SETRING       8
#define TIMER_FALL          9

#define WM_TRAYNOTIFY WM_USER + 100  //自定义系统托盘消息函数

CAdvertise *m_pADdlg ;				 //广告窗体
//设置开机程序自启动键值位置和其下新建子键值(可设为程序名)
const TCHAR gcszAutoRunKey[]= _T( "Software\\Microsoft\\windows\\CurrentVersion\\Run" );
const TCHAR	gcszWindowClass[] = _T("Woman");
//********************************************************************************
//* 名称:CTransparentWnd()
//* 作者:徐景周(jingzhou_xu@163.net)
//* 功能:构造涵数,在此初始化变量
//********************************************************************************
CTransparentWnd::CTransparentWnd()
{
	m_iAniSeq=0;
	strPath="";	
	m_bSuccess=FALSE;
}

//********************************************************************************
//* 名称:~CTransparentWnd()
//* 作者:徐景周(jingzhou_xu@163.net)
//* 功能:析构涵数,可在此删除创建的变量
//********************************************************************************
CTransparentWnd::~CTransparentWnd()
{
	//消毁广告窗体
	if ( m_pADdlg != NULL )
	{
		delete m_pADdlg;
		m_pADdlg = NULL;
 	}
}

BEGIN_MESSAGE_MAP(CTransparentWnd, CWnd)
	//{{AFX_MSG_MAP(CTransparentWnd)
	ON_MESSAGE(WM_TRAYNOTIFY, OnTrayNotification)  //自定义系统托盘消息涵数 
	ON_WM_PAINT()
	ON_WM_ERASEBKGND()
	ON_WM_LBUTTONDOWN()
	ON_WM_CREATE()
	ON_WM_TIMER()
	ON_WM_DESTROY()
	ON_WM_RBUTTONDOWN()
	ON_COMMAND(IDR_EXIT, OnExit)
	ON_COMMAND(IDR_FULLSCREEN_WALK, OnFullscreenWalk)
	ON_UPDATE_COMMAND_UI(IDR_FULLSCREEN_WALK, OnUpdateFullscreenWalk)
	ON_COMMAND(IDR_SHOWHIDE, OnShowhide)
	ON_WM_INITMENUPOPUP()
	ON_COMMAND(IDR_DOWNLOAD, OnDownload)
	ON_COMMAND(IDR_ACTION_RUN, OnActionRun)
	ON_COMMAND(IDR_ACTION_WALK, OnActionWalk)
	ON_COMMAND(IDR_ACTION_IDLE, OnActionIdle)
	ON_WM_MEASUREITEM()
	ON_WM_MENUCHAR()
	ON_COMMAND(IDR_ABOUT, OnAbout)
	ON_WM_LBUTTONUP()
	ON_COMMAND(IDR_OPTION_MUTE, OnOptionMute)
	ON_COMMAND(IDR_OPTION_REST, OnOptionRest)
	ON_COMMAND(IDR_OPTION_TOPSHOW, OnOptionTopshow)
	ON_COMMAND(IDR_ACTION_SPECIAL, OnActionSpecial)
	ON_WM_LBUTTONDBLCLK()
	ON_COMMAND(IDR_ACTION_FORECAST, OnActionForecast)
	ON_COMMAND(IDR_AUTORUN, OnAutorun)
	ON_COMMAND(IDR_SHOWNEWS, OnShownews)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

//********************************************************************************
//* 名称:CreateTransparent()
//* 作者:徐景周(jingzhou_xu@163.net)
//* 功能:建立透明窗体
//********************************************************************************
void CTransparentWnd::CreateTransparent(LPCTSTR pTitle, RECT &rect)
{
	CreateEx(	0,
		AfxRegisterWndClass(0,AfxGetApp()->LoadStandardCursor(IDC_ARROW)),
						pTitle,
						WS_POPUP ,
						rect,
						NULL,
						NULL,
						NULL );

}

//********************************************************************************
//* 名称:GetSourceHtml()
//* 作者:徐景周(jingzhou_xu@163.net)
//* 功能:下载网页涵数
//********************************************************************************
BOOL CTransparentWnd::GetSourceHtml(CString theUrl,CString Filename) 
{
 CInternetSession session;
 CInternetFile* file = NULL;
 try
 {
    // 试着连接到指定URL
    file = (CInternetFile*) session.OpenURL(theUrl); 
 }
 catch (CInternetException* m_pException)
 {
    // 如果有错误的话,置文件为空
    file = NULL; 
    m_pException->Delete();
    return FALSE;
 }

 // 用dataStore来保存读取的网页文件
 CStdioFile dataStore;

 if (file)
 {
    CString  somecode;							//也可采用LPTSTR类型,将不会删除文本中的\n回车符

	BOOL bIsOk = dataStore.Open(strPath+"\\"+Filename,
		CFile::modeCreate 
		| CFile::modeWrite 
		| CFile::shareDenyWrite 
		| CFile::typeText);
	
	if (!bIsOk)
		return FALSE;
	
	// 读写网页文件,直到为空
	while (file->ReadString(somecode) != NULL) //如果采用LPTSTR类型,读取最大个数nMax置0,使它遇空字符时结束
	{
		dataStore.WriteString(somecode);
		dataStore.WriteString("\n");		   //如果somecode采用LPTSTR类型,可不用此句
	}
	
	file->Close();
	delete file;
 }
 else
 {
    dataStore.WriteString(_T("到指定服务器的连接建立失败..."));	
    return FALSE;
 }

 return TRUE;
}

//********************************************************************************
//* 名称:SoundPlay()
//* 作者:徐景周(jingzhou_xu@163.net)
//* 功能:播放内镶WAV声音文件
//********************************************************************************
void CTransparentWnd::SoundPlay(void)
{
    //先关闭原声音播放
	PlaySound("IDR_WAVE",AfxGetResourceHandle(),SND_RESOURCE|SND_PURGE|SND_NODEFAULT  ); 
    //设置播放声音时间0.84秒
	SetTimer(TIMER_PLAYSOUND,840,NULL); 
	//资源WAV文件的ID须加双引号,用下API函数播放
    PlaySound("IDR_WAVE",AfxGetResourceHandle(),SND_RESOURCE|SND_ASYNC|SND_NODEFAULT  ); 
}

//********************************************************************************
//* 名称:SetupRegion()
//* 作者:徐景周(jingzhou_xu@163.net)
//* 功能:将窗体背景透明化
//********************************************************************************
void CTransparentWnd::SetupRegion(CDC *pDC)
{
	HRGN hRgn = NULL;

	CBitmap			&cBitmap=m_bmpDraw;
	CRect			cRect;

	GetWindowRect(&cRect);
	CPoint ptOrg=cRect.TopLeft();

	// 获取位图大小
	BITMAP bm;
	cBitmap.GetObject(sizeof(bm),&bm);
	CRect rcNewWnd=CRect(ptOrg,CSize(bm.bmWidth,bm.bmHeight));

		// 创建兼容DC,只便扫描它的元素
		HDC hMemDC = CreateCompatibleDC(NULL);
		if (hMemDC)
		{
			// 创建一32位位图,并放到兼容DC中 
			BITMAPINFOHEADER RGB32BITSBITMAPINFO = {	
					sizeof(BITMAPINFOHEADER),	// biSize 
					bm.bmWidth,					// biWidth; 
					bm.bmHeight,				// biHeight; 
					1,							// biPlanes; 
					32,							// biBitCount 
					BI_RGB,						// biCompression; 
					0,							// biSizeImage; 
					0,							// biXPelsPerMeter; 
					0,							// biYPelsPerMeter; 
					0,							// biClrUsed; 
					0							// biClrImportant; 
			};
			VOID * pbits32; 
			HBITMAP hbm32 = CreateDIBSection(hMemDC, (BITMAPINFO *)&RGB32BITSBITMAPINFO, DIB_RGB_COLORS, &pbits32, NULL, 0);
			if (hbm32)
			{
				HBITMAP holdBmp = (HBITMAP)SelectObject(hMemDC, hbm32);

				// 创建DC,放位图到它里面
				HDC hDC = CreateCompatibleDC(hMemDC);
				if (hDC)
				{
					// 获取每行多少位
					BITMAP bm32;
					GetObject(hbm32, sizeof(bm32), &bm32);
					while (bm32.bmWidthBytes % 4)
						bm32.bmWidthBytes++;

					// 复制位图到兼容DC中
					HBITMAP holdBmp = (HBITMAP)SelectObject(hDC, (HBITMAP)cBitmap );
					BitBlt(hMemDC, 0, 0, bm.bmWidth, bm.bmHeight, hDC, 0, 0, SRCCOPY);

					COLORREF cTolerance = 0x101010;
					COLORREF cTransparentColor=::GetPixel(hDC,0,0);

					// 为了更好的实现,将使用 ExtCreateRegion() 涵数来创建一区域,这个涵数要用来
					// RGNDATA 结构. 我们将用ALLOC_UNI来添加矩形框。
					#define ALLOC_UNIT	100
					DWORD maxRects = ALLOC_UNIT;
					HANDLE hData = GlobalAlloc(GMEM_MOVEABLE, sizeof(RGNDATAHEADER) + (sizeof(RECT) * maxRects));
					RGNDATA *pData = (RGNDATA *)GlobalLock(hData);
					pData->rdh.dwSize = sizeof(RGNDATAHEADER);
					pData->rdh.iType = RDH_RECTANGLES;
					pData->rdh.nCount = pData->rdh.nRgnSize = 0;
					SetRect(&pData->rdh.rcBound, MAXLONG, MAXLONG, 0, 0);

					// 为了获得透明像素,要分别保留其要透明背景色的最高、最低值
					BYTE lr = GetRValue(cTransparentColor);
					BYTE lg = GetGValue(cTransparentColor);
					BYTE lb = GetBValue(cTransparentColor);
					BYTE hr = min(0xff, lr + GetRValue(cTolerance));
					BYTE hg = min(0xff, lg + GetGValue(cTolerance));
					BYTE hb = min(0xff, lb + GetBValue(cTolerance));

					// 从下往上扫描每一个位图(位图是竖直反方向的)
					BYTE *p32 = (BYTE *)bm32.bmBits + (bm32.bmHeight - 1) * bm32.bmWidthBytes;
					for (int y = 0; y < bm.bmHeight; y++)
					{
						// 从左往右扫描每一个像素
						for (int x = 0; x < bm.bmWidth; x++)
						{
							// 连续搜索非透明元素
							int x0 = x;
							LONG *p = (LONG *)p32 + x;
							while (x < bm.bmWidth)
							{
								BYTE b = GetRValue(*p);
								if (b >= lr && b <= hr)
								{
									b = GetGValue(*p);
									if (b >= lg && b <= hg)
									{
										b = GetBValue(*p);
										if (b >= lb && b <= hb)
											// 如果是透明元素的话
											break;
									}
								}
								p++;
								x++;
							}

							if (x > x0)
							{
								// 添加像素(x0, y) 到 (x, y+1) ,作为区域中的新矩形
								if (pData->rdh.nCount >= maxRects)
								{
									GlobalUnlock(hData);
									maxRects += ALLOC_UNIT;
									hData = GlobalReAlloc(hData, sizeof(RGNDATAHEADER) + (sizeof(RECT) * maxRects), GMEM_MOVEABLE);
									pData = (RGNDATA *)GlobalLock(hData);
								}
								RECT *pr = (RECT *)&pData->Buffer;
								SetRect(&pr[pData->rdh.nCount], x0, y, x, y+1);
								if (x0 < pData->rdh.rcBound.left)
									pData->rdh.rcBound.left = x0;
								if (y < pData->rdh.rcBound.top)
									pData->rdh.rcBound.top = y;
								if (x > pData->rdh.rcBound.right)
									pData->rdh.rcBound.right = x;
								if (y+1 > pData->rdh.rcBound.bottom)
									pData->rdh.rcBound.bottom = y+1;
								pData->rdh.nCount++;

								// 在Windows98中, 如果矩形数太多的话(ie: > 4000),ExtCreateRegion()涵数可能失败. 
								// 因此,我们必须通过多步来创建矩形。
								if (pData->rdh.nCount == 2000)
								{
									HRGN h = ExtCreateRegion(NULL, sizeof(RGNDATAHEADER) + (sizeof(RECT) * maxRects), pData);
									if (hRgn)
									{
										CombineRgn(hRgn, hRgn, h, RGN_OR);
										DeleteObject(h);
									}
									else
										hRgn = h;
									pData->rdh.nCount = 0;
									SetRect(&pData->rdh.rcBound, MAXLONG, MAXLONG, 0, 0);
								}
							}
						}

						// 到下一行(注意: 位图是竖直反方向的)
						p32 -= bm32.bmWidthBytes;
					}

					// 根据保留的矩形来创建或廷伸区域
					HRGN h = ExtCreateRegion(NULL, sizeof(RGNDATAHEADER) + (sizeof(RECT) * maxRects), pData);
					if (hRgn)
					{
						CombineRgn(hRgn, hRgn, h, RGN_OR);
						DeleteObject(h);
					}
					else
						hRgn = h;

					// 释放
					GlobalFree(hData);
					SelectObject(hDC, holdBmp);
					DeleteDC(hDC);
				}

				DeleteObject(SelectObject(hMemDC, holdBmp));
			}

			DeleteDC(hMemDC);
		}	

	SetWindowRgn(hRgn, TRUE);
	MoveWindow(rcNewWnd);
}

//********************************************************************************
//* 名称:DoSet()
//* 作者:徐景周(jingzhou_xu@163.net)
//* 功能:判断该进行何种运行方式
//********************************************************************************
void CTransparentWnd::DoSet(void)
{
	int iSW=GetSystemMetrics(SM_CXFULLSCREEN);
	int	iSH=GetSystemMetrics(SM_CYFULLSCREEN);

	KillTimer(TIMER_SET);
	switch(rand()%5)
	{
		case(0):  //散步
		case(1):
		case(2): 
		m_ptDest.x=rand()%(iSW - 10);
		m_ptDest.y=rand()%(iSH - 10);
		SetTimer(TIMER_WALK,150,NULL);
		break;

		case(3):  //奔跑
		SetTimer(TIMER_TRANSFORM,300,NULL); //改原奔跑为变形状态 
//		m_ptDest.x=rand()%(iSW - 10);
//		m_ptDest.y=rand()%(iSH - 10);		
//		SetTimer(TIMER_RUN,500,NULL);
		break;

	    case(4):  //休息
		SetTimer(TIMER_IDLE,300,NULL);     
//		SetTimer(TIMER_IDLE,600,NULL); 
		break;
	}
}

//********************************************************************************
//* 名称:DoWalk()
//* 作者:徐景周(jingzhou_xu@163.net)
//* 功能:散步
//********************************************************************************
void CTransparentWnd::DoWalk(void)
{
	if(!m_bRest)							  //如果不是静止的话
	{
		char szBmp[20];
		CRect rcW;
		GetWindowRect(rcW);
		
		//决定全屏或局部运动的范围,暂只考虑任务条在下方时情况
		if(m_bFullScreenWalk)
		{
			if((m_ptDest.x> rcW.left && m_ptDest.x < rcW.right)||(m_ptDest.y> rcW.top && m_ptDest.y < rcW.bottom ))
			{
				KillTimer(TIMER_WALK);		
				SetTimer(TIMER_SET,10,NULL);
				return;
			}
			
			//设置精灵行走步长
			CPoint ptOffset((m_ptDest.x > rcW.left)?5:-5,(m_ptDest.y > rcW.top)?5:-5);
			
			rcW+=ptOffset;
			MoveWindow(rcW);
			
			if(m_ptDest.x<rcW.left)		//向左运动
			{
				sprintf(szBmp,"WALK%d",m_iAniSeq%12+1);
				m_iLastDirection=1;
			}
			else						//向右运动
			{
				sprintf(szBmp,"WALK%d",m_iAniSeq%12+13);
				m_iLastDirection=2;
			}
			
		}
		else
		{
			int xcounter=5,ycounter=5;	//设置精灵行走步长
			
			m_Rect=GetTopWndTitleRect();
			if(rcW.left < m_Rect.left +30 || m_iLastDirection==2) 
			{
				xcounter=5;
				m_iLastDirection=2;
			}
			if(rcW.left > m_Rect.right -30 || m_iLastDirection==1)
			{
				xcounter=-5;
				m_iLastDirection=1;
			}
			ycounter=0;                       //上、下位置不变
			
			rcW.top =m_Rect.top-rcW.Height();
			rcW.bottom =m_Rect.top;
			
			CPoint ptOffset(xcounter,ycounter);
			rcW+=ptOffset;
			
			MoveWindow(rcW);
			
			if((m_iAniSeq%80)==0)           //局部运动时,往右为奔跑
			{
				KillTimer(GetCurAction());
				SetTimer(TIMER_IDLE,300,NULL);	
			}
			else if((m_iAniSeq%30)==0)
			{
				KillTimer(GetCurAction());
				SetTimer(TIMER_TRANSFORM,500,NULL);	
			}
			
			if(m_iLastDirection==1)			  //向左运动
			{
				sprintf(szBmp,"WALK%d",m_iAniSeq%12+1);
			}
			else							  //向右运动
			{
				sprintf(szBmp,"WALK%d",m_iAniSeq%12+13);
			}
		}
		
		int CurAction;
		if((CurAction=GetCurAction())!=TIMER_WALK)
			KillTimer(CurAction);

		m_bmpDraw.DeleteObject();
		m_bmpDraw.LoadBitmap(szBmp);
		CWindowDC dc(this);
		SetupRegion(&dc);
		Invalidate();
	}
}

//********************************************************************************
//* 名称:DoRun()
//* 作者:徐景周(jingzhou_xu@163.net)
//* 功能:奔跑
//********************************************************************************
void CTransparentWnd::DoRun(void)
{
	if(!m_bRest)				//如果不是静止的话
	{
		char szBmp[20];
		CRect rcW;
		GetWindowRect(rcW);
		
		//决定全屏或局部运动的范围,暂只考虑任务条在下方时情况
		if(m_bFullScreenWalk)
		{
			if((m_ptDest.x> rcW.left && m_ptDest.x < rcW.right)||(m_ptDest.y> rcW.top && m_ptDest.y < rcW.bottom ))
			{
				KillTimer(TIMER_RUN);
				SetTimer(TIMER_SET,10,NULL);
				return;
			}
			CPoint ptOffset((m_ptDest.x > rcW.left)?10:-10,(m_ptDest.y > rcW.top)?5:-5);
			rcW+=ptOffset;
			MoveWindow(rcW);
			
			if(m_ptDest.x<rcW.left)  //向左运动
			{
				sprintf(szBmp,"RUN%d",m_iAniSeq%5+1);
				m_iLastDirection=1;
			}
			else                     //向右运动
			{
				sprintf(szBmp,"RUN%d",m_iAniSeq%5+6);
				m_iLastDirection=2;
			}
		}
		else
		{
			int xcounter=10,ycounter=10;
			
			m_Rect=GetTopWndTitleRect();
			if(rcW.left < m_Rect.left +30 || m_iLastDirection==2) 
			{
				xcounter=10;
				m_iLastDirection=2;
			}
			if(rcW.left > m_Rect.right -30 || m_iLastDirection==1)
			{
				xcounter=-10;
				m_iLastDirection=1;
			}
			ycounter=0;                        //上、下位置不变
			
			rcW.top =m_Rect.top-rcW.Height();
			rcW.bottom =m_Rect.top;
			
			CPoint ptOffset(xcounter,ycounter);
			rcW+=ptOffset;
			
			MoveWindow(rcW);
			
			if(m_iLastDirection==1)				//局部运动时,往左为散步
			{
				KillTimer(GetCurAction());
				SetTimer(TIMER_WALK,150,NULL);	
			}
			else if((m_iAniSeq%30)==0)
			{
				KillTimer(GetCurAction());
				SetTimer(TIMER_IDLE,300,NULL);	
			}
			
			if(m_iLastDirection==1)				//向左运动
			{
				sprintf(szBmp,"RUN%d",m_iAniSeq%5+1);
			}
			else							    //向右运动
			{
				sprintf(szBmp,"RUN%d",m_iAniSeq%5+6);
			}
		}
		
		m_bmpDraw.DeleteObject();
		m_bmpDraw.LoadBitmap(szBmp);
		CWindowDC dc(this);
		SetupRegion(&dc);
		Invalidate();
	}
}

//********************************************************************************
//* 名称:DoIdle()
//* 作者:徐景周(jingzhou_xu@163.net)
//* 功能:休息
//********************************************************************************
void CTransparentWnd::DoIdle(void)
{
	if(!m_bRest)						        //如果不是静止的话
	{
		CWnd * pFrame;					        //得到当前窗体指针
		
		//是否局部运动范围,暂只考虑任务条在下方时情况
		if(!m_bFullScreenWalk)
		{
			CRect rcW;
			GetWindowRect(rcW);
			m_Rect=GetTopWndTitleRect();
			
			rcW.top =m_Rect.top-rcW.Height();
			rcW.bottom =m_Rect.top;
			MoveWindow(rcW);
		}
		
		pFrame=AfxGetApp()->GetMainWnd();
		if(m_iAniSeq%12==0 && pFrame->IsWindowVisible())
		{
			
			//显示提示窗信息
			CRect rc;
			GetWindowRect(&rc);
			CPoint pt;
			pt.x=rc.left +rc.Width ()/2;
			pt.y=rc.top;
		
			CString str;
			if(m_bForecast)                       //显示天气预报
			{
				//如果天气预报读取完毕的话,则关闭提示窗
				if(m_sdForecastFile.ReadString(str) == NULL)
				{
					m_Tip.SetHideDelay(100);
					m_Tip.Hide();
					KillTimer(TIMER_IDLE);
					SetTimer(TIMER_SET,100,NULL);
					m_bForecast = FALSE;
					m_sdForecastFile.Close();
				}
				else
				{
					str.Replace("&&",_T("\n"));    //处理字符串换行标志"&&",多行显示
					m_Tip.SetHideDelay(5000);      //显示5秒
					m_Tip.Show(str,&pt);		   //作者注:同一行中显示的字数不能过大
					
					if(!m_bMute)
						SoundPlay();			    //播放声音   
				}

			}									
			else if(m_bDownloadFailed )				//显示新闻
			{	
				if(m_bShowNews)                     //显示新闻标志为真
				{
					if(m_sdFile.ReadString(str) == NULL)
					{
						m_sdFile.SeekToBegin();
						m_sdFile.ReadString(str);
					}
					str.Replace("&&",_T("\n"));     //处理字符串换行标志"&&",多行显示
					m_Tip.SetHideDelay(10000);      //显示10秒
					m_Tip.Show(str,&pt);		    //作者注:同一行中显示的字数不能过大
					
					if(!m_bMute)
						SoundPlay();			    //播放声音   
				}
				else
				{
					m_Tip.SetHideDelay(100);
					m_Tip.Hide();
				}
			}
//			else							        //断线时提示窗
//				m_Tip.Show(_T("欢迎您,来到未来工作室!"),&pt);
			
			m_Tip.Hide();

			m_iSecondNum++;
		}

		if(m_bForecast)								//在线显示天气预报时
		{
		}
		else if( m_bDownloadFailed && m_bShowNews)	//在线显示新闻时
		{
			if(m_iSecondNum >= 10 )					//(>=10)秒时关闭它,不再显示提示窗
			{
				m_Tip.SetHideDelay(100);
				m_Tip.Hide();
				KillTimer(TIMER_IDLE);
				SetTimer(TIMER_SET,100,NULL);
				m_iSecondNum = 0;
				
				return;
			}
		}
		else
		{
			if(m_iSecondNum >= 1 )					//(>=1)秒时关闭它,不再显示提示窗
			{
				m_Tip.SetHideDelay(100);
				m_Tip.Hide();
				KillTimer(TIMER_IDLE);
				SetTimer(TIMER_SET,100,NULL);
				m_iSecondNum = 0;
				
				return;
			}
		}
		
		int CurAction;
		if((CurAction=GetCurAction())!=TIMER_IDLE)
			KillTimer(CurAction);

		char szBmp[20];	
		sprintf(szBmp,"IDLE%d",m_iAniSeq%4+1);
		
		m_bmpDraw.DeleteObject();
		m_bmpDraw.LoadBitmap(szBmp);
		CWindowDC dc(this);
		SetupRegion(&dc);
		Invalidate();
	}
}

//********************************************************************************
//* 名称:DoTransform()
//* 作者:徐景周(jingzhou_xu@163.net)
//* 功能:变形行为表现
//********************************************************************************
void CTransparentWnd::DoTransform(void)                
{
	if(!m_bRest)          //如果不是静止的话
	{
		char szBmp[20];	
		sprintf(szBmp,"TRANSFORM%d",m_iAniSeq%6+1);
		
		if(strcmp(szBmp,"TRANSFORM6")==0)
		{
			KillTimer(TIMER_TRANSFORM);
			SetTimer(TIMER_SET,10,NULL);
			return;
		}

		//是否局部运动的范围,暂只考虑任务条在下方时情况
		if(!m_bFullScreenWalk)
		{
			CRect rcW;
			GetWindowRect(rcW);
			m_Rect=GetTopWndTitleRect();
			
			rcW.top =m_Rect.top-rcW.Height();
			rcW.bottom =m_Rect.top;
			MoveWindow(rcW);
		}
		
		int CurAction;
		if((CurAction=GetCurAction())!=TIMER_TRANSFORM)
			KillTimer(CurAction);

		m_bmpDraw.DeleteObject();
		m_bmpDraw.LoadBitmap(szBmp);
		CWindowDC dc(this);
		SetupRegion(&dc);
		Invalidate();
	}
}

//********************************************************************************
//* 名称:DoDrag()
//* 作者:徐景周(jingzhou_xu@163.net)
//* 功能:拖动窗体时行为表现
//********************************************************************************
void CTransparentWnd::DoDrag(void)
{

	CRect rcW;
	POINT point;
	GetWindowRect(rcW);

	//实现拖动时窗体跟着移动
    ::GetCursorPos(&point);			
	MoveWindow(point.x-m_ptCurPoint.x ,point.y-m_ptCurPoint.y ,rcW.Width(),rcW.Height() ,true); 

	char szBmp[20];

	sprintf(szBmp,"SLING%d",m_iAniSeq%8+1);

	m_bmpDraw.DeleteObject();
	m_bmpDraw.LoadBitmap(szBmp);
	CWindowDC dc(this);
	SetupRegion(&dc);
	Invalidate();

}

//********************************************************************************
//* 名称:DoFall()
//* 作者:徐景周(jingzhou_xu@163.net)
//* 功能:拖动后的下落表现
//********************************************************************************
void CTransparentWnd::DoFall(void)
{
	CRect rcW,m_Rect;
	GetWindowRect(&rcW);
	
	m_Rect=GetTopWndTitleRect();
	if( rcW.bottom >= m_Rect.top )
	{
		KillTimer(TIMER_FALL);
		SetTimer(TIMER_SET,10,NULL);
		return;
	}

	MoveWindow(rcW.left,rcW.top+10,rcW.Width(),rcW.Height(),true); 
}

//********************************************************************************
//* 名称:OnLButtonDown()
//* 作者:徐景周(jingzhou_xu@163.net)
//* 功能:实现窗体无标题拖动
//********************************************************************************
void CTransparentWnd::OnLButtonDown(UINT nFlags, CPoint point) 
{
	CWnd::OnLButtonDown(nFlags, point);

	KillTimer(GetCurAction());		   //关闭当前行为表现

	SetTimer(TIMER_DRAGDROP,60,NULL);  //打开拖动时计数器

	//鼠标移动到窗体时改变鼠标指针
	::SetCursor(AfxGetApp()->LoadCursor(IDC_DROP));

	m_bDragDrop=true;					//精灵助手拖动标志为真
	SetCapture();						//设置鼠标全屏捕捉
    m_ptCurPoint=point;					//记下按下时的鼠标坐标

//	PostMessage(WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point.x,point.y));

}

//********************************************************************************
//* 名称:OnLButtonUp()
//* 作者:徐景周(jingzhou_xu@163.net)
//* 功能:实现窗体实时拖动效果
//********************************************************************************
void CTransparentWnd::OnLButtonUp(UINT nFlags, CPoint point) 
{
	
	m_bDragDrop=false;				//精灵助手拖动标志为假
	ReleaseCapture();
	KillTimer(TIMER_DRAGDROP);		//关闭拖动时记数器 
	SetTimer(TIMER_FALL,100,NULL);  //启动下落表现
	
	CWnd::OnLButtonUp(nFlags, point);
}

//********************************************************************************
//* 名称:OnCreate()
//* 作者:徐景周(jingzhou_xu@163.net)
//* 功能:创建窗体
//********************************************************************************
int CTransparentWnd::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	//系统区显示的图标文件
	m_Icon[0]=AfxGetApp()->LoadIcon(IDI_TRAYICON);
    
	//创建系统区图标
	if (!m_TrayIcon.Create(this, 
				IDR_POPUP, 
				_T("精灵信使 V1.0"), 
				m_Icon, 
				1,							//一幅图像
				1000,						//延时1秒变化
				WM_TRAYNOTIFY))
	{
		AfxMessageBox(_T("错误:创建系统图标失败!"), MB_OK | MB_ICONSTOP);
		return -1;
	}

	// 建立信息提示窗
	m_Tip.Create(GetDesktopWindow());

	m_bFullScreenWalk = TRUE;				   //全屏运动标志初始置真
	m_bMute = FALSE;                           //静音标志
	m_bTopShow = TRUE;                         //最顶层显示标志
	m_bRest = FALSE;                           //静止标志

	m_bShowNews = TRUE;                        //新闻显示初始为真
	m_bForecast = FALSE;                       //天气预报下载标志初始置假
	m_bRing = FALSE;                           //闹铃提示标志
	m_Time = NULL;                             //闹铃时间为空
	m_iAction = 1;							   //初始行为表现
	m_iSecondNum = 0;                          //初始秒数为0
	SetTimer(TIMER_SET,300,NULL);

	//窗体拖运时变量初始化
	m_bDragDrop=false;  
	m_ptCurPoint=CPoint(0,0);

	//判断程序是否已设置了开机自启动选项
	HKEY hKey;
	LONG lRet;
	DWORD dwLength, dwDataType;
	TCHAR szBuffer[MAX_PATH];

	// 打开注册表键
	lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE, gcszAutoRunKey,
			0, KEY_READ | KEY_WRITE, &hKey );
	if( lRet != ERROR_SUCCESS )
		return FALSE;

	// 查询自动运行项目是否存在
	dwLength = sizeof( szBuffer );
	lRet = RegQueryValueEx( hKey, gcszWindowClass, 
			NULL, &dwDataType, (LPBYTE)szBuffer, &dwLength );
		
	if( lRet == ERROR_SUCCESS )
		m_bAutorun = TRUE;                     //已设置自动运行标志
	else
		m_bAutorun = FALSE;					   //没有设置自动运行标志

	//置窗体初始显示位置
	CRect rcW;
	GetWindowRect(&rcW);
	m_Rect=GetTopWndTitleRect();	
	rcW.top =m_Rect.top-rcW.Height();
	rcW.bottom =m_Rect.top;
	rcW.left =10;
	//置窗体为最顶层显示及其位置
	SetWindowPos(&wndTopMost,rcW.left,rcW.top,rcW.Width(),rcW.Height(),SWP_NOSIZE|SWP_NOMOVE);


/*
	//获取主程序所在路径,存在全局变量strPath中
	GetModuleFileName(NULL,strPath.GetBufferSetLength (MAX_PATH+1),MAX_PATH);
	strPath.ReleaseBuffer ();
    int nPos;
	nPos=strPath.ReverseFind ('\\');
	strPath=strPath.Left (nPos);

	CFileFind  fFind;
	BOOL bFailed;
	bFailed=fFind.FindFile(strPath+"\\News.txt",0);

    //是否已下载提示文件,否则下载它并打开文件
	if(!bFailed)
		m_bDownloadFailed=GetSourceHtml("http://www.philips120dreams.com/member/pet_news/news.txt","News.txt");	//下载提示文件的默认网址
	else
		m_bDownloadFailed=TRUE;
    fFind.Close ();
*/

	//获取系统临时文件夹路径
    GetTempPath(MAX_PATH,strPath.GetBuffer(MAX_PATH));
    strPath.ReleaseBuffer();

	CFileFind  fFind;
	BOOL bFailed;
	bFailed=fFind.FindFile(strPath+"\\News.txt",0);

	//是否已下载提示文件,否则下载它并打开文件
	if(!bFailed)
		m_bDownloadFailed=GetSourceHtml("http://www.philips120dreams.com/member/pet_news/news.txt","News.txt");	 //下载提示文件的默认网址
	else
		m_bDownloadFailed=TRUE;
    fFind.Close ();

	if(m_bDownloadFailed)
		m_bSuccess=m_bDownloadFailed=m_sdFile.Open(strPath+"\\News.txt",
		CFile::modeRead | CFile::typeText);

	//同时在系统区上面显示广告窗体,只能是无模式对话框
    m_pADdlg = new CAdvertise(this);
    m_pADdlg->Create(IDD_DIALOG_ADVERTISE,this);
	m_pADdlg->ShowWindow(SW_SHOW);

	return 0;
}

//********************************************************************************
//* 名称:OnTrayNotification()
//* 作者:徐景周(jingzhou_xu@163.net)
//* 功能:系统区创建的图标映射涵数
//********************************************************************************
LRESULT CTransparentWnd::OnTrayNotification(WPARAM wParam, LPARAM lParam)
{
  
  return m_TrayIcon.OnTrayNotification(wParam, lParam);
}

//********************************************************************************
//* 名称:OnEraseBkgnd()
//* 作者:徐景周(jingzhou_xu@163.net)
//* 功能:擦除背景
//********************************************************************************
BOOL CTransparentWnd::OnEraseBkgnd(CDC* pDC) 
{
	CRect	rect;
	GetWindowRect(&rect);

	CDC memDC;
	CBitmap			&cBitmap=m_bmpDraw;;
	CBitmap*		pOldMemBmp = NULL;
	CFont* pOldMemFont=NULL;

	memDC.CreateCompatibleDC(pDC);
	pOldMemBmp = memDC.SelectObject(&cBitmap);
	pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);

	if (pOldMemBmp) memDC.SelectObject( pOldMemBmp );

	return TRUE;
}

//********************************************************************************
//* 名称:OnPaint()
//* 作者:徐景周(jingzhou_xu@163.net)
//* 功能:刷新背景
//********************************************************************************
void CTransparentWnd::OnPaint()
{
	CPaintDC dc(this);
	
}

//********************************************************************************
//* 名称:OnTimer()
//* 作者:徐景周(jingzhou_xu@163.net)
//* 功能:触发定时器
//********************************************************************************
void CTransparentWnd::OnTimer(UINT nIDEvent) 
{
	
	switch(nIDEvent)
	{
	case(1):				//判定何种运行方式
		DoSet();
		break;

	case(2):				//散步
		DoWalk();
		break;

	case(3):				//休息
		DoIdle();
		break;

	case(4):				//奔跑
		DoRun();
		break;

	case(5):				//播放声音
		KillTimer(TIMER_PLAYSOUND);
		break;

	case(6):
		DoDrag();			//实时拖动
		break;

	case(7):
		DoTransform();      //变形
		break;

	case(8):                //闹铃设置
		{
			int hour,min,sec;
			int yhour,ymin,ysec;
			
			CTime nowtime = CTime::GetCurrentTime();

			hour = nowtime.GetHour();
			min	 = nowtime.GetMinute();
			sec  = nowtime.GetSecond();
			
			yhour = m_Time.GetHour();
			ymin  = m_Time.GetMinute();
			ysec  = m_Time.GetSecond();
			
			//如果时间到,则进行闹铃
			if(hour == yhour && min == ymin && sec==ysec)
			{
				m_bRing = TRUE;
				OnActionIdle();            //用Idle行为来闹铃提示
			}
			else if(m_bRing==TRUE)         //关闭闹铃  	
			{		
				OnActionIdle();            //用Idle行为来闹铃提示
				
				if( m_iAniSeq%80 == 0)
				{
					KillTimer(TIMER_SETRING);
					m_bRing = FALSE;
				}
			}
		}
		break;

	case(9):
		DoFall();               //鼠标拖动释放后的下落表现
		break;

	default:
		break;
	}
	
	if(nIDEvent!=5 && nIDEvent!=6 && nIDEvent!=8)
		m_iAction= nIDEvent;    //当前行为表现方式标志

	m_iAniSeq++;				//下一幅图像       
	if(m_iAniSeq>156)           //13X12
		m_iAniSeq=0;    

	CWnd::OnTimer(nIDEvent);
}

//********************************************************************************
//* 名称:OnDestroy()
//* 作者:徐景周(jingzhou_xu@163.net)
//* 功能:销毁窗体
//********************************************************************************
void CTransparentWnd::OnDestroy() 
{
	CWnd::OnDestroy();
}

//********************************************************************************
//* 名称:OnRButtonDown()
//* 作者:徐景周(jingzhou_xu@163.net)
//* 功能:弹出相关菜单
//********************************************************************************
void CTransparentWnd::OnRButtonDown(UINT nFlags, CPoint point) 
{
	CWnd::OnRButtonDown(nFlags, point);

	m_popmenu.LoadMenu(IDR_POPUP);
	BCMenu::SetMenuDrawMode(BCMENU_DRAWMODE_XP);

	//设置选中时的复选框效果
	if(m_bFullScreenWalk) 
		m_popmenu.ModifyODMenu(NULL, IDR_FULLSCREEN_WALK,IDB_CHECK);
	if(m_bMute)
		m_popmenu.ModifyODMenu(NULL, IDR_OPTION_MUTE,IDB_CHECK);
	if(m_bTopShow)
		m_popmenu.ModifyODMenu(NULL, IDR_OPTION_TOPSHOW,IDB_CHECK);
	if(m_bRest)
		m_popmenu.ModifyODMenu(NULL, IDR_OPTION_REST,IDB_CHECK);
	if(m_bAutorun)
		m_popmenu.ModifyODMenu(NULL, IDR_AUTORUN,IDB_CHECK);
	if(m_bShowNews)
		m_popmenu.ModifyODMenu(NULL, IDR_SHOWNEWS,IDB_CHECK);

	ClientToScreen(&point);
	BCMenu *psub = (BCMenu *)m_popmenu.GetSubMenu(0); 
	psub->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,this);
	m_popmenu.DestroyMenu();
}

//********************************************************************************
//* 名称:PreTranslateMessage()
//* 作者:徐景周(jingzhou_xu@163.net)
//* 功能:传递提示窗消息
//********************************************************************************
BOOL CTransparentWnd::PreTranslateMessage(MSG* pMsg) 
{
	m_Tip.RelayEvent(pMsg);
	
	return CWnd::PreTranslateMessage(pMsg);
}

//********************************************************************************
//* 名称:PreTranslateMessage()
//* 作者:徐景周(jingzhou_xu@163.net)
//* 功能:在显示窗体动画效果前,先寻找系统区位置
//********************************************************************************
BOOL CALLBACK FindTrayWnd(HWND hwnd, LPARAM lParam)
{
    TCHAR szClassName[256];
    GetClassName(hwnd, szClassName, 255);

    // 比较窗口类名
    if (_tcscmp(szClassName, _T("TrayNotifyWnd")) == 0)
    {
        CRect *pRect = (CRect*) lParam;
        ::GetWindowRect(hwnd, pRect);
        return TRUE;
    }

    // 当找到时钟窗口时表示可以结束了
    if (_tcscmp(szClassName, _T("TrayClockWClass")) == 0)
    {
        CRect *pRect = (CRect*) lParam;
        CRect rectClock;
        ::GetWindowRect(hwnd, rectClock);
        pRect->right = rectClock.left;
        return FALSE;
    }
 
    return TRUE;
}

//********************************************************************************
//* 名称:PreTranslateMessage()
//* 作者:徐景周(jingzhou_xu@163.net)
//* 功能:显示窗口动画效果的涵数
//********************************************************************************
void CTransparentWnd::WinAnimation(BOOL ShowFlag) 
{
    CRect rect(0,0,0,0);

    // 查找托盘窗口 
    CWnd* pWnd = FindWindow("Shell_TrayWnd", NULL);
    if (pWnd)
    {
        pWnd->GetWindowRect(rect);
		EnumChildWindows(pWnd->m_hWnd, FindTrayWnd, (LPARAM)&rect);
		//rect 为托盘区矩形
		CRect rcWnd;
		GetWindowRect(rcWnd);
		if(ShowFlag)					//窗体滑向系统区
		  DrawAnimatedRects(GetSafeHwnd(),IDANI_CAPTION,rcWnd,rect);
		else							//窗体从系统区滑出
		  DrawAnimatedRects(GetSafeHwnd(),IDANI_CAPTION,rect,rcWnd);
    }
}

//********************************************************************************
//* 名称:OnExit()
//* 作者:徐景周(jingzhou_xu@163.net)
//* 功能:退出程序
//********************************************************************************
void CTransparentWnd::OnExit()  
{
/*
	CHelpTipDlg dlg;

	//保证此对话框一次只弹出一个
	if( !FindWindow(NULL,"退出"))
	{
		if(IDCANCEL==dlg.DoModal())
		{
			m_TrayIcon.RemoveIcon();          //删除系统区图标
			
			DestroyWindow();
		}
	}
*/
	CHelpTipDlg dlg;

	m_Tip.SetHideDelay(100);     //隐藏提示窗
	m_Tip.Hide();

	dlg.DoModal();
	m_TrayIcon.RemoveIcon();     //删除系统区图标	
	
	if(m_bAutorun)
	{
		//设置为开机自动运行 
		StartupAutorun(TRUE);
	}
	else
	{
		//取消开机自动运行 
		StartupAutorun(FALSE);
	}

	DestroyWindow();
}

//********************************************************************************
//* 名称:OnOptionMute()
//* 作者:徐景周(jingzhou_xu@163.net)
//* 功能:静音
//********************************************************************************
void CTransparentWnd::OnOptionMute() 
{
	m_bMute = !m_bMute;;   

}   

//********************************************************************************
//* 名称:OnOptionRest()
//* 作者:徐景周(jingzhou_xu@163.net)
//* 功能:静止
//********************************************************************************
void CTransparentWnd::OnOptionRest() 
{
	m_bRest = !m_bRest;
	
}

//********************************************************************************
//* 名称:OnOptionTopshow()
//* 作者:徐景周(jingzhou_xu@163.net)
//* 功能:顶层显示
//********************************************************************************
void CTransparentWnd::OnOptionTopshow() 
{
	m_bTopShow = !m_bTopShow;
	
}

//********************************************************************************
//* 名称:OnFullscreenWalk()
//* 作者:徐景周(jingzhou_xu@163.net)
//* 功能:全屏运动还是局部运动
//********************************************************************************
void CTransparentWnd::OnFullscreenWalk() 
{
	m_bFullScreenWalk = !m_bFullScreenWalk;	

}

//********************************************************************************
//* 名称:OnUpdateFullscreenWalk()
//* 作者:徐景周(jingzhou_xu@163.net)
//* 功能:更新全屏运动还是局部运动
//********************************************************************************
void CTransparentWnd::OnUpdateFullscreenWalk(CCmdUI* pCmdUI) 
{
	if(m_bFullScreenWalk) 
		pCmdUI->SetCheck(TRUE);
	else
		pCmdUI->SetCheck(FALSE);	
}

//********************************************************************************
//* 名称:OnShowhide()
//* 作者:徐景周(jingzhou_xu@163.net)
//* 功能:显示或隐藏精灵助手
//********************************************************************************
void CTransparentWnd::OnShowhide() 
{
	CWnd * pFrame;					 //得到当前窗体指针

	pFrame=AfxGetApp()->GetMainWnd();
	if(!pFrame->IsWindowVisible())	 //是否进行窗体动画,窗体已显示则不进行
	{
		WinAnimation(false);		 //窗体动画从系统区滑出 
		pFrame->ShowWindow(SW_SHOW);
	}
    else							 //是否进行窗体动画,窗体已隐藏则不进行
	{
		m_Tip.SetHideDelay(100);     //隐藏提示窗
		m_Tip.Hide();
        pFrame->ShowWindow(SW_HIDE);
	    WinAnimation(true);			 //窗体动画滑入到系统区中 
	}	
}

//********************************************************************************
//* 名称:OnInitMenuPopup()
//* 作者:徐景周(jingzhou_xu@163.net)
//* 功能:加此涵数,使动态新增菜单条同步以XP风格显示
//********************************************************************************
void CTransparentWnd::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu) 
{
	CWnd::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu);
	
	if(!bSysMenu){
		if(BCMenu::IsMenu(pPopupMenu)) BCMenu::UpdateMenu(pPopupMenu);
	}
}

//********************************************************************************
//* 名称:OnMeasureItem()
//* 作者:徐景周(jingzhou_xu@163.net)
//* 功能:重新测量菜单条
//********************************************************************************
void CTransparentWnd::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct) 
{
	BOOL setflag=FALSE;
	if(lpMeasureItemStruct->CtlType==ODT_MENU){
		if(IsMenu((HMENU)lpMeasureItemStruct->itemID)&&BCMenu::IsMenu((HMENU)lpMeasureItemStruct->itemID)){
			m_popmenu.MeasureItem(lpMeasureItemStruct);
			setflag=TRUE;
		}
	}
	if(!setflag)CWnd::OnMeasureItem(nIDCtl, lpMeasureItemStruct);	
}

//********************************************************************************
//* 名称:OnMenuChar()
//* 作者:徐景周(jingzhou_xu@163.net)
//* 功能:重新绘制菜单条
//********************************************************************************
LRESULT CTransparentWnd::OnMenuChar(UINT nChar, UINT nFlags, CMenu* pMenu) 
{
	LRESULT lresult;
	if(BCMenu::IsMenu(pMenu))
		lresult=BCMenu::FindKeyboardShortcut(nChar, nFlags, pMenu);
	else
		lresult=CWnd::OnMenuChar(nChar, nFlags, pMenu);

	return(lresult);
	
}

//********************************************************************************
//* 名称:GetFullScreenWalk()
//* 作者:徐景周(jingzhou_xu@163.net)
//* 功能:获取是否全屏运动的标志位
//********************************************************************************
BOOL CTransparentWnd::GetFullScreenWalk()                
{
	return m_bFullScreenWalk;
}  

//********************************************************************************
//* 名称:GetOptionMute()
//* 作者:徐景周(jingzhou_xu@163.net)
//* 功能:获取静音标志位
//********************************************************************************
BOOL CTransparentWnd::GetOptionMute()                  
{
	return m_bMute;   
}
  
//********************************************************************************
//* 名称:GetOptionTopShow()
//* 作者:徐景周(jingzhou_xu@163.net)
//* 功能:获取顶层显示标志位
//********************************************************************************
BOOL CTransparentWnd::GetOptionTopShow()               
{
	return m_bTopShow;
}

//********************************************************************************
//* 名称:GetOptionRest()
//* 作者:徐景周(jingzhou_xu@163.net)
//* 功能:获取静止标志位
//********************************************************************************
BOOL CTransparentWnd::GetOptionRest()                 
{
	return m_bRest; 
}

//********************************************************************************
//* 名称:OnDownload()
//* 作者:徐景周(jingzhou_xu@163.net)
//* 功能:设置下载网页地址
//********************************************************************************
void CTransparentWnd::OnDownload() 
{
	CDownloadAddress dlg;  
	CString str;

	//保证此对话框一次只弹出一个
	if(!FindWindow(NULL,"设置下载网址"))
	{
		if(dlg.DoModal()==IDOK)
		{
			if((str=dlg.GetDownloadAddress())!="")
			{
				CWnd * pFrame;					        

				pFrame=AfxGetApp()->GetMainWnd();
				pFrame->ShowWindow(SW_HIDE);            //下载前先隐藏精灵助手
				
				if(m_bSuccess)
				{
					m_sdFile.Close();                   //先关闭原打开文件,以便新建文件
					m_bSuccess=FALSE;
				}
				m_bDownloadFailed= FALSE;               //选置假,避免显示提示窗信息
				//下载新设置的网页
				m_bDownloadFailed=GetSourceHtml(str,"News.txt");

				if(m_bDownloadFailed)
					m_bSuccess=m_bDownloadFailed=m_sdFile.Open(strPath+"\\News.txt",
					CFile::modeRead | CFile::typeText);

				pFrame->ShowWindow(SW_SHOW);   
			}
		}
	}
}

//********************************************************************************
//* 名称:OnActionForecast()
//* 作者:徐景周(jingzhou_xu@163.net)
//* 功能:下载并显示天气预报
//********************************************************************************
void CTransparentWnd::OnActionForecast() 
{
	CWnd * pFrame;					        

	pFrame=AfxGetApp()->GetMainWnd();
//	pFrame->ShowWindow(SW_HIDE);            //下载前先隐藏精灵助手

	m_bForecast= FALSE;						//选置假,避免显示提示窗信息
	//下载天气预报的网页
	m_bForecast=GetSourceHtml("http://www.philips120dreams.com/member/pet_news/news2.txt","Forecast.txt");

	if(m_bForecast)
		m_bForecast=m_sdForecastFile.Open(strPath+"\\Forecast.txt",
		CFile::modeRead | CFile::typeText);

//	pFrame->ShowWindow(SW_SHOW);   
	OnActionIdle();                         //显示天气信息
}

//********************************************************************************
//* 名称:OnActionRun()
//* 作者:徐景周(jingzhou_xu@163.net)
//* 功能:奔跑方式
//********************************************************************************
void CTransparentWnd::OnActionRun() 
{
	int CurAction;
	if((CurAction=GetCurAction())!=TIMER_TRANSFORM)
		KillTimer(CurAction);

	m_Tip.SetHideDelay(100);     //隐藏提示窗
	m_Tip.Hide();

	SetTimer(TIMER_TRANSFORM,500,NULL);  //改奔跑为变形方式
//	SetTimer(TIMER_RUN,500,NULL);	
}

//********************************************************************************
//* 名称:OnActionWalk()
//* 作者:徐景周(jingzhou_xu@163.net)
//* 功能:散步方式
//********************************************************************************
void CTransparentWnd::OnActionWalk() 
{
	int CurAction;
	if((CurAction=GetCurAction())!=TIMER_WALK)
		KillTimer(CurAction);

	m_Tip.SetHideDelay(100);     //隐藏提示窗
	m_Tip.Hide();

	SetTimer(TIMER_WALK,150,NULL);
}

//********************************************************************************
//* 名称:OnActionIdle()
//* 作者:徐景周(jingzhou_xu@163.net)
//* 功能:休息方式
//********************************************************************************
void CTransparentWnd::OnActionIdle() 
{		
	int CurAction;
	if((CurAction=GetCurAction())!=TIMER_IDLE)
		KillTimer(CurAction);

	SetTimer(TIMER_IDLE,300,NULL);	
}

//********************************************************************************
//* 名称:GetCurAction()
//* 作者:徐景周(jingzhou_xu@163.net)
//* 功能:获取当前行为表现方式
//********************************************************************************
int  CTransparentWnd::GetCurAction()
{
	return m_iAction;
}

//********************************************************************************
//* 名称:GetTopWndTitleRect()
//* 作者:徐景周(jingzhou_xu@163.net)
//* 功能:获取当前桌面最顶层窗口标题区大小
//********************************************************************************
CRect CTransparentWnd::GetTopWndTitleRect()             
{
/*
	HWND TopHwnd;
	CHelpTipDlg ExitDlg;
	CDownloadAddress AddressDlg; 
	CAbout aboutDlg;
	CSetRing RingDlg;

	TopHwnd=::GetForegroundWindow();

	//不能是本程序所具有的窗体,否则返回初窗口标题区大小
	if(TopHwnd==this->m_hWnd||TopHwnd==ExitDlg.m_hWnd||TopHwnd==AddressDlg.m_hWnd||TopHwnd==aboutDlg.m_hWnd||TopHwnd==RingDlg)
		return m_Rect;

	CRect rtWnd;
	::GetWindowRect(TopHwnd,&rtWnd);

	return rtWnd;
*/

	// 查找并返回任务栏窗口大小 
	CRect rect(0,0,0,0);
    CWnd* pWnd = FindWindow("Shell_TrayWnd", NULL);
    if (pWnd)
    {
        pWnd->GetWindowRect(&rect);
	}
	return rect;
}

//********************************************************************************
//* 名称:OnAbout()
//* 作者:徐景周(jingzhou_xu@163.net)
//* 功能:关于对话框
//********************************************************************************
void CTransparentWnd::OnAbout() 
{
	CAbout aboutDlg;

	//保证此对话框一次只弹出一个
	if(!FindWindow(NULL,"关于精灵助手 -- 未来工作室(Future Studio)"))
		aboutDlg.DoModal(); 
}

//********************************************************************************
//* 名称:OnActionSpecial()
//* 作者:徐景周(jingzhou_xu@163.net)
//* 功能:闹铃设置对话框
//********************************************************************************
void CTransparentWnd::OnActionSpecial() 
{
	CSetRing RingDlg;

	//保证此对话框一次只弹出一个
	HWND hWnd = ::FindWindow(NULL,"设置闹钟功能");
	if(!hWnd)
	{
		if(RingDlg.DoModal()==IDOK)
		{
			m_Time=RingDlg.GetCurRingTime();
			if(m_Time!=NULL)
				SetTimer(TIMER_SETRING,1000,NULL);	 //一秒钟更新一次
		}
	}
}

//********************************************************************************
//* 名称:OnLButtonDblClk()
//* 作者:徐景周(jingzhou_xu@163.net)
//* 功能:双击对话框
//********************************************************************************
void CTransparentWnd::OnLButtonDblClk(UINT nFlags, CPoint point) 
{
	OnActionSpecial();	

	CWnd::OnLButtonDblClk(nFlags, point);
}

//********************************************************************************
//* 名称:StartupAutorun()
//* 作者:徐景周(jingzhou_xu@163.net)
//* 功能:开机时程序自动运行
//********************************************************************************
BOOL CTransparentWnd::StartupAutorun(BOOL bIsAdd)
{
	HKEY hKey;
	LONG lRet, lRet2;
	DWORD dwLength, dwDataType;
	TCHAR szItemValue[MAX_PATH], szPrevValue[MAX_PATH];
	TCHAR szBuffer[MAX_PATH];

	// 得到程序全路径名
	GetModuleFileName( NULL, szItemValue, MAX_PATH );


	// 打开注册表键
		lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE, gcszAutoRunKey,
			0, KEY_READ | KEY_WRITE, &hKey );
		if( lRet != ERROR_SUCCESS )
			return FALSE;

	// 查询自动运行项目是否存在
		dwLength = sizeof( szBuffer );
		lRet = RegQueryValueEx( hKey, gcszWindowClass, 
			NULL, &dwDataType, (LPBYTE)szBuffer, &dwLength );

	// 添加
		if( bIsAdd == TRUE ) 
		{
	// 自动运行项目不存在
			if( lRet != ERROR_SUCCESS )
				lRet2 = RegSetValueEx( hKey, gcszWindowClass,
				0, REG_SZ, (LPBYTE)szItemValue, strlen( szItemValue ) );
			else 
			{
	// 存在, 比较二者是否相同
				dwLength = sizeof( szPrevValue );
				lRet2 = RegQueryValueEx( hKey, gcszWindowClass, 
					0, &dwDataType,(LPBYTE)szPrevValue, &dwLength );
	// 不相同则替换
				if( lstrcmp( szItemValue, szPrevValue ) ) 
				{
					lRet2 = RegDeleteValue( hKey, gcszWindowClass );
					lRet2 = RegSetValueEx( hKey, gcszWindowClass, 
						0, REG_SZ,(LPBYTE)szItemValue, strlen( szItemValue ) );
				}
			}
		}
	// 删除
		else 
	// 自动运行项目已存在则删除
			if( lRet == ERROR_SUCCESS )
				lRet2 = RegDeleteValue( hKey, gcszWindowClass );

	// 关闭注册表键
		RegCloseKey( hKey );

		if( lRet2 != ERROR_SUCCESS )
			return FALSE;


	return TRUE;
}

//********************************************************************************
//* 名称:OnAutorun()
//* 作者:徐景周(jingzhou_xu@163.net)
//* 功能:开机时程序自动运行
//********************************************************************************
void CTransparentWnd::OnAutorun() 
{
	m_bAutorun = !m_bAutorun;
	
}

//********************************************************************************
//* 名称:GetAutorunFlag()
//* 作者:徐景周(jingzhou_xu@163.net)
//* 功能:获取自动运行标志
//********************************************************************************
BOOL CTransparentWnd::GetAutorunFlag()		
{
	return m_bAutorun;
}

//********************************************************************************
//* 名称:OnShownews()
//* 作者:徐景周(jingzhou_xu@163.net)
//* 功能:是否显示新闻
//********************************************************************************
void CTransparentWnd::OnShownews() 
{
	m_bShowNews = !m_bShowNews;
	
}

//********************************************************************************
//* 名称:GetShowNews()
//* 作者:徐景周(jingzhou_xu@163.net)
//* 功能:获取显示新闻标志
//********************************************************************************
BOOL CTransparentWnd::GetShowNewsFlag()   
{
	return m_bShowNews;
}