ChaosUI.cpp
上传用户:liguizhu
上传日期:2015-11-01
资源大小:2422k
文件大小:9k
源码类别:

P2P编程

开发平台:

Visual C++

  1. /*
  2.  *  Openmysee
  3.  *
  4.  *  This program is free software; you can redistribute it and/or modify
  5.  *  it under the terms of the GNU General Public License as published by
  6.  *  the Free Software Foundation; either version 2 of the License, or
  7.  *  (at your option) any later version.
  8.  *
  9.  *  This program is distributed in the hope that it will be useful,
  10.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.  *  GNU General Public License for more details.
  13.  *
  14.  *  You should have received a copy of the GNU General Public License
  15.  *  along with this program; if not, write to the Free Software
  16.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  17.  *
  18.  */
  19. #include "stdafx.h"
  20. #include "ChaosUI.h"
  21. #include "LocalServer.h"
  22. extern volatile HINSTANCE g_hInstance;
  23. extern volatile HWND g_hMainWnd;
  24. extern TCHAR g_sAppPath[MAX_PATH];
  25. extern CLocalServer *g_pLocalServer;
  26. CChaosUI* CChaosUI::m_pChaosUI = NULL;
  27. //UINT CChaosUI::m_uMMTimer = 0;
  28. //CCritSec CChaosUI::m_MMTimerCritSec;
  29. // { Implementation of CChaosUI
  30. CChaosUI::CChaosUI()
  31. : m_bTrayIconExist(FALSE), m_bBalloonShowing(FALSE), m_pblHelp(NULL), m_bthreadstop(FALSE), m_hmsgthread(NULL)
  32. {
  33. oldptIcon.x = 0;
  34. oldptIcon.y = 0;
  35. m_pblHelp = new CBalloonHelp();
  36. }
  37. CChaosUI::~CChaosUI()
  38. {
  39. delete m_pblHelp;
  40. }
  41. BOOL CChaosUI::GetMessage(CMsgMgr* pMsgMgr, CString& str, BOOL& bForceShow, BOOL& bForceHide, BOOL& bAnimeIcon)
  42. {
  43. if(pMsgMgr->GetMsgNum() == 0)
  44. {
  45. return FALSE;
  46. }
  47. MSGID *pChlMsgIDArray = new MSGID[pMsgMgr->GetMsgNum()];
  48. pMsgMgr->GetMsgIDArray(pChlMsgIDArray);
  49. BOOL msgOK = FALSE;
  50. for(UINT i=0; i<pMsgMgr->GetMsgNum(); i++)
  51. {
  52. CString tempstr;
  53. UINT flags;
  54. MSGID MsgID = *(pChlMsgIDArray+i);
  55. if(pMsgMgr->DispatchMessage(MsgID, tempstr, CMsgMgr::GMF_NOPP, &flags))
  56. {
  57. msgOK = TRUE;
  58. str += _T("  ");
  59. str += tempstr;
  60. str += _T("n");
  61. bForceShow = ((flags & CMsgMgr::FORCESHOW) == CMsgMgr::FORCESHOW);
  62. bForceHide = ((flags & CMsgMgr::FORCEHIDE) == CMsgMgr::FORCEHIDE);
  63. bAnimeIcon = ((flags & CMsgMgr::WAIT) == CMsgMgr::WAIT);
  64. }
  65. }
  66. delete[] pChlMsgIDArray;
  67. return msgOK;
  68. }
  69. #define UPDATETIMEINTERVAL 300
  70. //DWORD WINAPI CChaosUI::_MsgProc(LPVOID param)
  71. unsigned int __stdcall CChaosUI::_MsgProc(void* param)
  72. {
  73. CChaosUI *pChaosUI = (CChaosUI *) param;
  74. assert(pChaosUI);
  75. if(pChaosUI)
  76. {
  77. while(!pChaosUI->m_bthreadstop)
  78. {
  79. CString strMessage = _TEXT("");
  80. BOOL bForceShow = FALSE;
  81. BOOL bForceHide = FALSE;
  82. BOOL bdoAnime = FALSE;
  83. BOOL bGetAnyMsg = FALSE;
  84. CString tmpMsg;
  85.             BOOL tmpfcs = FALSE;
  86.             BOOL tmpfch = FALSE;
  87.             BOOL tmpdan = FALSE;
  88. if(pChaosUI->GetMessage(g_pLocalServer->GetMsgMgr(), tmpMsg, tmpfcs, tmpfch, tmpdan))
  89. {
  90.                 bForceShow |= tmpfcs;
  91.                 bForceHide |= tmpfch;
  92.                 bdoAnime |= tmpdan;
  93. bGetAnyMsg = TRUE;
  94. strMessage += tmpMsg;
  95. }
  96. UINT uChannelNum = g_pLocalServer->GetChannelNum();
  97. if(uChannelNum > 0)
  98. {
  99. bGetAnyMsg = TRUE;
  100. CChannelMgr** pChannelMgrArray = new CChannelMgr*[uChannelNum];
  101. g_pLocalServer->GetChannelMgrArray(pChannelMgrArray);
  102. for(UINT i=0; i<uChannelNum; i++)
  103. {
  104. tmpMsg.Empty();
  105. pChannelMgrArray[i]->GetChannelName(tmpMsg);
  106. strMessage += tmpMsg;
  107. strMessage += _T("n");
  108. tmpMsg.Empty();
  109. if(pChaosUI->GetMessage(pChannelMgrArray[i]->GetMsgMgr(), tmpMsg, tmpfcs, tmpfch, tmpdan))
  110.                     {
  111. strMessage += tmpMsg;
  112.                         bForceShow |= tmpfcs;
  113.                         bForceHide |= tmpfch;
  114.                         bdoAnime |= tmpdan;
  115.                     }
  116. }
  117. delete[] pChannelMgrArray;
  118. }
  119. bForceHide = (!bGetAnyMsg) | bForceHide;
  120. pChaosUI->ShowMessage(strMessage, bForceShow, bForceHide, bdoAnime);
  121. Sleep(UPDATETIMEINTERVAL);
  122. }
  123. }
  124.     PostMessage(g_hMainWnd, WM_SENDTOLOCALSERVER, CASE_THREAD_EXIT, 0);
  125. return 0;
  126. }
  127. CChaosUI* CChaosUI::CreateInstance(CLocalServer *pLocalServer)
  128. {
  129. if(m_pChaosUI == NULL)
  130. {
  131. m_pChaosUI = new CChaosUI();
  132. m_pChaosUI->Init(pLocalServer);
  133. if(m_pChaosUI->InitTrayIconData())
  134. {
  135. CString title;
  136. title.LoadString(g_hInstance, IDS_BALLOONTITLE);
  137. /* mystring filestr(g_sAppPath);
  138. filestr.append(_T("\config.ini"));
  139. ConfigFile config(filestr);
  140. mystring tmp = config.Value(_T("localserver"), _T("title"));
  141. CString title;
  142. if(config.fileNotFound || config.stringNotFound)
  143. title = _T("www.mysee.com");
  144. else
  145. title = tmp.c_str();*/
  146. m_pChaosUI->ShowTrayIcon(TRUE, TRUE);
  147. m_pChaosUI->m_pblHelp->Create(_T(""), _T(""), CPoint(0, 0), 
  148. CBalloonHelp::unSHOW_CLOSE_BUTTON|CBalloonHelp::unSHOW_TOPMOST|CBalloonHelp::unHIDE_AFTER_CREATED
  149. , g_hMainWnd);
  150. m_pChaosUI->m_pblHelp->SetIcon(m_pChaosUI->m_IconMysee);
  151. m_pChaosUI->m_pblHelp->SetTitle(title);
  152. UINT threadID;
  153.             uintptr_t ret = _beginthreadex(NULL, 0, &_MsgProc, m_pChaosUI, 0, &threadID);
  154.             if(ret != -1L)
  155.             {
  156.                 g_pLocalServer->AddWndThreadRef();
  157.             }
  158. }
  159. }
  160. return m_pChaosUI;
  161. }
  162. void CChaosUI::DeleteInstance()
  163. {
  164. m_pChaosUI->m_bthreadstop = TRUE;
  165. if(m_pChaosUI->m_pblHelp->IsWindow())
  166.     {
  167. m_pChaosUI->m_pblHelp->DestroyWindow();
  168.     }
  169. m_pChaosUI->ShowTrayIcon(FALSE, FALSE);
  170. delete m_pChaosUI;
  171. m_pChaosUI = NULL;
  172. }
  173. void CChaosUI::DeliverExit()
  174. {
  175.     m_pChaosUI->m_bthreadstop = TRUE;
  176. }
  177. void CChaosUI::ShowBalloon()
  178. {
  179. if(g_pLocalServer->GetChannelNum() == 0)
  180. g_pLocalServer->UpdateNoChannelMsg();
  181. m_pblHelp->ShowBalloon();
  182. }
  183. namespace {
  184. UINT m_counter = 0;
  185. }
  186. void CChaosUI::ShowMessage(const CString &strMessage, BOOL bForceShow, BOOL bForceHide, BOOL doAnime)
  187. {
  188. m_counter++;
  189. // CAutoLock AutoLock(&m_CritSec);
  190. if(m_counter%4 == 0) //大约1.2s才重测试一次图标位置,控制开销
  191. {
  192. POINT ptIcon;
  193. BOOL bIconFound = m_TrayIconPositon.GetTrayIconPosition(ptIcon, 
  194. CTrayIconPosition::UseBothTechniquesDirectPrefered);
  195. if(bIconFound == -1)
  196. ptIcon = oldptIcon; //取上一次得到的图标位置
  197. else
  198. oldptIcon = ptIcon;
  199. m_pblHelp->SetAnchorPoint(ptIcon);
  200. m_TrayIconPositon.RestoreTrayIcon(this->m_TrayIconData.hIcon);
  201. }
  202. ShowTrayIcon(TRUE, doAnime);
  203. m_pblHelp->SetContent(strMessage);
  204. if(bForceShow) {
  205. /* m_TrayIconData.uFlags = NIF_INFO;
  206. m_TrayIconData.dwInfoFlags = NIIF_INFO;;
  207. m_TrayIconData.uTimeout = 100000;
  208. _tcscpy(m_TrayIconData.szInfoTitle, _T("title"));
  209. _tcscpy(m_TrayIconData.szInfo, (LPCTSTR)strMessage);
  210. Shell_NotifyIcon(NIM_MODIFY, &m_TrayIconData);
  211. m_bBalloonShowing*/
  212. m_pblHelp->ShowBalloon();
  213. }
  214. else if(bForceHide)
  215. m_pblHelp->HideBalloonImmediately();
  216. }
  217. BOOL CChaosUI::InitTrayIconData()
  218. {
  219. m_IconAnime[0] = ::LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_TRAYANIME1));
  220. m_IconAnime[1] = ::LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_TRAYANIME2));
  221. m_IconAnime[2] = ::LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_TRAYANIME3));
  222. m_IconAnime[3] = ::LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_TRAYANIME4));
  223. m_IconAnime[4] = ::LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_TRAYANIME5));
  224. m_IconAnime[5] = ::LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_TRAYANIME6));
  225. // m_IconMysee = ::LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_TRAYICON));
  226. m_IconMysee = (HICON) ::LoadImage(g_hInstance, MAKEINTRESOURCE(IDI_TRAYICON), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR |LR_SHARED);
  227. if(NULL == m_IconMysee)
  228. {
  229. assert(0);
  230. return FALSE;
  231. }
  232. m_TrayIconData.cbSize   = sizeof(m_TrayIconData);
  233. m_TrayIconData.hWnd     = g_hMainWnd;
  234. m_TrayIconData.uCallbackMessage = WM_TASKBARMSG;
  235. m_TrayIconData.uID      = 1; 
  236. m_TrayIconData.uFlags   = NIF_MESSAGE | NIF_ICON ;
  237. _tcscpy(m_TrayIconData.szTip, _T("www.OPenmysee.com"));
  238. m_TrayIconData.hIcon    = m_IconMysee;
  239. return TRUE;
  240. }
  241. void CChaosUI::ShowTrayIcon(BOOL bShow, BOOL bDoAnime)
  242. {
  243. if(bShow)
  244. {
  245. if(m_bTrayIconExist)
  246. {
  247. if(bDoAnime) 
  248. {
  249. m_TrayIconData.hIcon = m_IconAnime[m_counter%6];
  250. Shell_NotifyIcon(NIM_MODIFY, &m_TrayIconData);
  251. }
  252. else
  253. {
  254. if(m_TrayIconData.hIcon != m_IconMysee)
  255. {
  256. m_TrayIconData.hIcon = m_IconMysee;
  257. Shell_NotifyIcon(NIM_MODIFY, &m_TrayIconData);
  258. }
  259. }
  260. }
  261. else 
  262. {
  263. Shell_NotifyIcon(NIM_ADD, &m_TrayIconData);
  264. m_TrayIconData.uFlags   = NIF_ICON ;
  265. m_bTrayIconExist = TRUE;
  266. m_TrayIconPositon.InitializePositionTracking(m_TrayIconData.hWnd, m_TrayIconData.uID);
  267. }
  268. }
  269. else 
  270. {
  271. Shell_NotifyIcon(NIM_DELETE, &m_TrayIconData);
  272. m_bTrayIconExist = FALSE;
  273. }
  274. }
  275. // Implementation of CChaosUI }