📄 transparentwnd.cpp
字号:
IDR_POPUP,
_T("精灵信使 V1.0"),
m_hIcon,
1, //一幅图像
1000, //延时1秒变化
WM_TRAYNOTIFY))
{
AfxMessageBox(_T("错误:创建系统图标失败!"), MB_OK | MB_ICONSTOP);
return -1;
}
// 建立信息提示窗
m_Tip.Create(GetDesktopWindow());
m_bShowNews = TRUE; //新闻显示初始为真
m_bFullScreenWalk = TRUE; //全屏运动标志初始置真
m_bMute = FALSE; //静音标志
m_bTopShow = TRUE; //最顶层显示标志
m_bRest = 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 ();
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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -