⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chaosui.cpp

📁 mysee网络直播源代码Mysee Lite是Mysee独立研发的网络视频流媒体播放系统。在应有了P2P技术和一系列先进流媒体技术之后
💻 CPP
字号:
/*
 *  Openmysee
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 */
#include "stdafx.h"
#include "ChaosUI.h"
#include "LocalServer.h"

extern volatile HINSTANCE g_hInstance;
extern volatile HWND g_hMainWnd;
extern	TCHAR	g_sAppPath[MAX_PATH];
extern CLocalServer *g_pLocalServer;
CChaosUI* CChaosUI::m_pChaosUI = NULL;
//UINT CChaosUI::m_uMMTimer = 0;
//CCritSec CChaosUI::m_MMTimerCritSec;

// { Implementation of CChaosUI
CChaosUI::CChaosUI()
: m_bTrayIconExist(FALSE), m_bBalloonShowing(FALSE), m_pblHelp(NULL), m_bthreadstop(FALSE), m_hmsgthread(NULL)
{
	oldptIcon.x = 0;
	oldptIcon.y = 0;
	m_pblHelp = new CBalloonHelp();
}

CChaosUI::~CChaosUI()
{
	delete m_pblHelp;
}

BOOL CChaosUI::GetMessage(CMsgMgr* pMsgMgr, CString& str, BOOL& bForceShow, BOOL& bForceHide, BOOL& bAnimeIcon)
{
	if(pMsgMgr->GetMsgNum() == 0)
	{
		return FALSE;
	}


	MSGID *pChlMsgIDArray = new MSGID[pMsgMgr->GetMsgNum()];
	pMsgMgr->GetMsgIDArray(pChlMsgIDArray);

	BOOL msgOK = FALSE;
	for(UINT i=0; i<pMsgMgr->GetMsgNum(); i++)
	{
		CString tempstr;
		UINT	flags;
		MSGID MsgID = *(pChlMsgIDArray+i);
		if(pMsgMgr->DispatchMessage(MsgID, tempstr, CMsgMgr::GMF_NOPP, &flags))
		{
			msgOK = TRUE;
			str += _T("  ");
			str += tempstr;
			str += _T("\n");
			bForceShow = ((flags & CMsgMgr::FORCESHOW) == CMsgMgr::FORCESHOW);
			bForceHide = ((flags & CMsgMgr::FORCEHIDE) == CMsgMgr::FORCEHIDE);
			bAnimeIcon = ((flags & CMsgMgr::WAIT) == CMsgMgr::WAIT);
		}
	}
	delete[] pChlMsgIDArray;

	return msgOK;
}

#define UPDATETIMEINTERVAL 300
//DWORD WINAPI CChaosUI::_MsgProc(LPVOID param)
unsigned int __stdcall CChaosUI::_MsgProc(void* param)
{
	CChaosUI *pChaosUI = (CChaosUI *) param;
	assert(pChaosUI);

	if(pChaosUI)
	{
		while(!pChaosUI->m_bthreadstop)
		{
			CString strMessage = _TEXT("");
			BOOL bForceShow = FALSE;
			BOOL bForceHide = FALSE;
			BOOL bdoAnime = FALSE;
			BOOL bGetAnyMsg = FALSE;

			CString tmpMsg;
            BOOL tmpfcs = FALSE;
            BOOL tmpfch = FALSE;
            BOOL tmpdan = FALSE;
			if(pChaosUI->GetMessage(g_pLocalServer->GetMsgMgr(), tmpMsg, tmpfcs, tmpfch, tmpdan))
			{
                bForceShow |= tmpfcs;
                bForceHide |= tmpfch;
                bdoAnime |= tmpdan;
				bGetAnyMsg = TRUE;
				strMessage += tmpMsg;
			}

			UINT uChannelNum = g_pLocalServer->GetChannelNum();
			if(uChannelNum > 0)
			{
				bGetAnyMsg = TRUE;

				CChannelMgr** pChannelMgrArray = new CChannelMgr*[uChannelNum];
				g_pLocalServer->GetChannelMgrArray(pChannelMgrArray);

				for(UINT i=0; i<uChannelNum; i++)
				{
					tmpMsg.Empty();
					pChannelMgrArray[i]->GetChannelName(tmpMsg);
					strMessage += tmpMsg;
					strMessage += _T("\n");
					tmpMsg.Empty();
					if(pChaosUI->GetMessage(pChannelMgrArray[i]->GetMsgMgr(), tmpMsg, tmpfcs, tmpfch, tmpdan))
                    {
						strMessage += tmpMsg;
                        bForceShow |= tmpfcs;
                        bForceHide |= tmpfch;
                        bdoAnime |= tmpdan;
                    }
				}
				delete[] pChannelMgrArray;
			}

			bForceHide = (!bGetAnyMsg) | bForceHide;

			pChaosUI->ShowMessage(strMessage, bForceShow, bForceHide, bdoAnime);
			Sleep(UPDATETIMEINTERVAL);
		}
	}

    PostMessage(g_hMainWnd, WM_SENDTOLOCALSERVER, CASE_THREAD_EXIT, 0);
	return 0;
}

CChaosUI* CChaosUI::CreateInstance(CLocalServer *pLocalServer)
{
	if(m_pChaosUI == NULL)
	{
		m_pChaosUI = new CChaosUI();
		m_pChaosUI->Init(pLocalServer);

		if(m_pChaosUI->InitTrayIconData())
		{
			CString title;
			title.LoadString(g_hInstance, IDS_BALLOONTITLE);

/*			mystring filestr(g_sAppPath);
			filestr.append(_T("\\config.ini"));
			ConfigFile config(filestr);
			mystring tmp = config.Value(_T("localserver"), _T("title"));

			CString title;
			if(config.fileNotFound || config.stringNotFound)
				title = _T("www.mysee.com");
			else
				title = tmp.c_str();*/

			m_pChaosUI->ShowTrayIcon(TRUE, TRUE);

			m_pChaosUI->m_pblHelp->Create(_T(""), _T(""), CPoint(0, 0), 
			CBalloonHelp::unSHOW_CLOSE_BUTTON|CBalloonHelp::unSHOW_TOPMOST|CBalloonHelp::unHIDE_AFTER_CREATED
			, g_hMainWnd);
			m_pChaosUI->m_pblHelp->SetIcon(m_pChaosUI->m_IconMysee);
			m_pChaosUI->m_pblHelp->SetTitle(title);

			UINT	threadID;
            uintptr_t ret = _beginthreadex(NULL, 0, &_MsgProc, m_pChaosUI, 0, &threadID);
            if(ret != -1L)
            {
                g_pLocalServer->AddWndThreadRef();
            }
		}
	}

	return m_pChaosUI;
}

void CChaosUI::DeleteInstance()
{
	m_pChaosUI->m_bthreadstop = TRUE;
	if(m_pChaosUI->m_pblHelp->IsWindow())
    {
		m_pChaosUI->m_pblHelp->DestroyWindow();
    }

	m_pChaosUI->ShowTrayIcon(FALSE, FALSE);
	delete m_pChaosUI;
	m_pChaosUI = NULL;
}

void CChaosUI::DeliverExit()
{
    m_pChaosUI->m_bthreadstop = TRUE;
}

void CChaosUI::ShowBalloon()
{
	if(g_pLocalServer->GetChannelNum() == 0)
		g_pLocalServer->UpdateNoChannelMsg();

	m_pblHelp->ShowBalloon();
}

namespace {
	UINT m_counter = 0;
}

void CChaosUI::ShowMessage(const CString &strMessage, BOOL bForceShow, BOOL bForceHide, BOOL doAnime)
{
	m_counter++;
//	CAutoLock AutoLock(&m_CritSec);

	if(m_counter%4 == 0)	//大约1.2s才重测试一次图标位置,控制开销
	{
		POINT ptIcon;
		BOOL bIconFound = m_TrayIconPositon.GetTrayIconPosition(ptIcon, \
			CTrayIconPosition::UseBothTechniquesDirectPrefered);
		if(bIconFound == -1)
			ptIcon = oldptIcon;	//取上一次得到的图标位置
		else
			oldptIcon = ptIcon;

		m_pblHelp->SetAnchorPoint(ptIcon);
		m_TrayIconPositon.RestoreTrayIcon(this->m_TrayIconData.hIcon);
	}

	ShowTrayIcon(TRUE, doAnime);

	m_pblHelp->SetContent(strMessage);

	if(bForceShow) {
/*		m_TrayIconData.uFlags = NIF_INFO;
		m_TrayIconData.dwInfoFlags = NIIF_INFO;;
		m_TrayIconData.uTimeout = 100000;
		_tcscpy(m_TrayIconData.szInfoTitle, _T("title"));
		_tcscpy(m_TrayIconData.szInfo, (LPCTSTR)strMessage);
		Shell_NotifyIcon(NIM_MODIFY, &m_TrayIconData);
		m_bBalloonShowing*/

		m_pblHelp->ShowBalloon();
	}
	else if(bForceHide)
		m_pblHelp->HideBalloonImmediately();
}

BOOL CChaosUI::InitTrayIconData()
{
	m_IconAnime[0] = ::LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_TRAYANIME1));
	m_IconAnime[1] = ::LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_TRAYANIME2));
	m_IconAnime[2] = ::LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_TRAYANIME3));
	m_IconAnime[3] = ::LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_TRAYANIME4));
	m_IconAnime[4] = ::LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_TRAYANIME5));
	m_IconAnime[5] = ::LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_TRAYANIME6));
//	m_IconMysee = ::LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_TRAYICON));
	m_IconMysee = (HICON) ::LoadImage(g_hInstance, MAKEINTRESOURCE(IDI_TRAYICON), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR |LR_SHARED);

	if(NULL == m_IconMysee)
	{
		assert(0);
		return FALSE;
	}

	m_TrayIconData.cbSize   = sizeof(m_TrayIconData);
	m_TrayIconData.hWnd     = g_hMainWnd;
	m_TrayIconData.uCallbackMessage = WM_TASKBARMSG;
	m_TrayIconData.uID      = 1; 
	m_TrayIconData.uFlags   = NIF_MESSAGE | NIF_ICON ;
	_tcscpy(m_TrayIconData.szTip, _T("www.OPenmysee.com"));
	m_TrayIconData.hIcon    = m_IconMysee;

	return TRUE;
}

void CChaosUI::ShowTrayIcon(BOOL bShow, BOOL bDoAnime)
{
	if(bShow)
	{
		if(m_bTrayIconExist)
		{
			if(bDoAnime) 
			{
				m_TrayIconData.hIcon = m_IconAnime[m_counter%6];
				Shell_NotifyIcon(NIM_MODIFY, &m_TrayIconData);
			}
			else
			{
				if(m_TrayIconData.hIcon != m_IconMysee)
				{
					m_TrayIconData.hIcon = m_IconMysee;
					Shell_NotifyIcon(NIM_MODIFY, &m_TrayIconData);
				}
			}
			
		}
		else 
		{
			Shell_NotifyIcon(NIM_ADD, &m_TrayIconData);
			m_TrayIconData.uFlags   = NIF_ICON ;
			m_bTrayIconExist = TRUE;
			m_TrayIconPositon.InitializePositionTracking(m_TrayIconData.hWnd, m_TrayIconData.uID);
		}
	}
	else 
	{
		Shell_NotifyIcon(NIM_DELETE, &m_TrayIconData);
		m_bTrayIconExist = FALSE;
	}
}


// Implementation of CChaosUI }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -