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

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 ".trayiconmenu.h"
  21. #include <string.h>
  22. #include <TCHAR.h>
  23. #include <shellapi.h>
  24. #include "MultiLanguageMgr.h"
  25. CTrayIconMenu::CTrayIconMenu()
  26. {
  27.     MultiLanguage langDll; //生成多语言数据
  28. m_curLanguage = langDll.GetCurLanguage();
  29. hWnd = NULL;
  30. }
  31. CTrayIconMenu::~CTrayIconMenu(void)
  32. {
  33. }
  34. BOOL CTrayIconMenu::ShowMenu(HWND hparent, const UINT_PTR* p_cmdID, const TCHAR* p_cmdstr)
  35. {
  36. hWnd = hparent;
  37. if(p_cmdID == NULL || p_cmdstr == NULL)
  38. return FALSE;
  39. return ShowMenu(p_cmdID, p_cmdstr);
  40. }
  41. #define MAX_MENUSTR  256
  42. HMENU CTrayIconMenu::MakeMenu(const UINT*& p_cmdID, const TCHAR*& p_cmdstr)
  43. {
  44. HMENU hmenu = CreatePopupMenu();
  45. if(hmenu == NULL)
  46. return hmenu;
  47. TCHAR m_strbuf[MAX_MENUSTR]; //存放菜单文字的缓冲区
  48. const TCHAR *p_oldstrh;
  49. MultiLanguage LangDll;
  50. for(p_oldstrh = p_cmdstr, p_cmdstr = _tcschr(p_cmdstr, _T('*')) + 1; 
  51. *p_cmdID != ID_END; 
  52. p_cmdID++, p_oldstrh = p_cmdstr, p_cmdstr = _tcschr(p_cmdstr, _T('*')) + 1)
  53. {
  54. memset(m_strbuf, 0, sizeof(TCHAR)*MAX_MENUSTR);
  55. _tcsncpy(m_strbuf, p_oldstrh, 
  56. (p_cmdstr - p_oldstrh - 1) >= MAX_MENUSTR ? (MAX_MENUSTR - 1) : (p_cmdstr - p_oldstrh - 1));
  57. if(*p_cmdID == ID_POPUP) //生成子菜单
  58. {
  59. p_cmdstr = _tcschr(p_cmdstr, _T('*')) + 1;
  60. p_cmdID++;
  61. HMENU hpopmenu = MakeMenu(p_cmdID, p_cmdstr); //递归地生成子菜单
  62. if(hpopmenu == NULL)
  63. {
  64. DestroyMenu(hmenu);
  65. return NULL;
  66. }
  67. AppendMenu(hmenu, MF_STRING | MF_POPUP, (UINT_PTR) hpopmenu, LangDll.GetStringByStr(m_strbuf));
  68. }
  69. else if(*p_cmdID == ID_EXTERNAL)
  70. {
  71. p_cmdID++;
  72. if(*p_cmdID != 0)
  73. AppendMenu(hmenu, MF_STRING | MF_POPUP, *p_cmdID, LangDll.GetStringByStr(m_strbuf));
  74. }
  75. else if(*p_cmdID == ID_SEPERATOR) //生成分隔线
  76. {
  77. AppendMenu(hmenu, MF_SEPARATOR, 0, NULL);
  78. }
  79. else if(*p_cmdID == ID_LANGUAGE)
  80. {
  81. AppendMenu(hmenu, MF_STRING | MF_POPUP, (UINT_PTR) MakeLanguageMenu(), LangDll.GetStringByStr(m_strbuf));
  82. }
  83. else //生成一般的命令项
  84. {
  85. UINT m_addUI = MenuUI(*p_cmdID);
  86. AppendMenu(hmenu, MF_STRING | m_addUI, *p_cmdID, LangDll.GetStringByStr(m_strbuf));
  87. }
  88. }
  89. return hmenu;
  90. }
  91. void CTrayIconMenu::ReleaseMenu(HMENU hmenu, const UINT_PTR*& p_cmdID)
  92. {
  93. for(int i = 0; *p_cmdID != ID_END; p_cmdID++, i++)
  94. {
  95. if(*p_cmdID == ID_POPUP)
  96. {
  97. HMENU hsub = GetSubMenu(hmenu, i);
  98. assert(hsub != NULL);
  99. p_cmdID++;
  100. ReleaseMenu(hsub, p_cmdID);
  101. }
  102. else if(*p_cmdID == ID_EXTERNAL)
  103. {
  104. p_cmdID++;
  105. RemoveMenu(hmenu, i, MF_BYPOSITION);
  106. i--;
  107. }
  108. }
  109. DestroyMenu(hmenu);
  110. }
  111. BOOL CTrayIconMenu::ShowMenu(const UINT_PTR* p_traycmd, const TCHAR* p_traystr)
  112. {
  113. POINT curpoint;
  114. if(GetCursorPos(&curpoint) == FALSE) //获得鼠标位置
  115. return FALSE;
  116. if (!p_traycmd || !p_traystr) //数据还没有准备好
  117. return FALSE;
  118. do
  119. {
  120. const UINT_PTR* p_tmptraycmd = p_traycmd;
  121. const TCHAR* p_tmptraystr = p_traystr;
  122. h_popup = MakeMenu(p_tmptraycmd, p_tmptraystr);
  123. if(h_popup == NULL)
  124. return FALSE;
  125. UINT returncmd = TrackPopupMenuEx(h_popup, TPM_BOTTOMALIGN | TPM_RIGHTALIGN /*| TPM_NONOTIFY*/ | TPM_RETURNCMD | TPM_LEFTBUTTON,
  126.  curpoint.x, curpoint.y, hWnd, NULL); //鼠标位置在生成的菜单右下角
  127. DWORD ret = GetLastError();
  128. p_tmptraycmd = p_traycmd;
  129. ReleaseMenu(h_popup, p_tmptraycmd);
  130. if(returncmd == 0)
  131. return FALSE;
  132. if(MenuCommand(returncmd))
  133. break;
  134. }while(1);
  135. return TRUE;
  136. }
  137. BOOL CTrayIconMenu::OnMenuPopup(HMENU hmenu, int pos)
  138. {
  139. return FALSE;
  140. }
  141. BOOL CTrayIconMenu::MenuCommand(UINT m_cmdID)
  142. {
  143. if(m_cmdID >= TRAYWM_LANGUAGESTART && m_cmdID <= TRAYWM_LANGUAGEEND)//用户选择了语言切换,这是一个"EX"型命令处理函数
  144. {
  145.         SendMessage(hWnd, WM_COMMAND, TRAYWM_LANGUAGECHANGE, 0);
  146. return OnSwitchLanguageEx(m_cmdID);
  147. }
  148. else
  149. {
  150. //这里处理普通的命令处理函数
  151. PostMessage(hWnd, WM_COMMAND, m_cmdID, 0);
  152. //普通命令处理函数将返回TRUE
  153. return TRUE;
  154. }
  155. }
  156. UINT CTrayIconMenu::MenuUI(UINT m_cmdID)
  157. {
  158. if(m_cmdID == m_curLanguage)
  159. return MF_CHECKED;
  160. return 0;
  161. }
  162. BOOL CTrayIconMenu::OnSwitchLanguageEx(UINT m_language)
  163. {
  164. LANGID langid;
  165. switch(m_language - TRAYWM_LANGUAGESTART )
  166. {
  167. case 0: //gb
  168. langid = MAINLAND_LANG_ID;
  169. break;
  170. case 1: //big5
  171. langid = TAIWAN_LANG_ID;
  172. break;
  173. case 2: //english
  174. langid = DEFAULT_LANG_ID;
  175. break;
  176. default:
  177. langid = DEFAULT_LANG_ID;
  178. }
  179. m_curLanguage = langid;
  180. MultiLanguage LanguageDll;
  181. LanguageDll.SwitchLanguage(langid);
  182. return FALSE; //表示重新显示菜单并处理命令
  183. }
  184. HMENU CTrayIconMenu::MakeLanguageMenu()
  185. {
  186. MultiLanguage langDll; //生成多语言数据
  187. LANGID id = m_curLanguage;
  188. UINT flags[3] = {MF_STRING, MF_STRING, MF_STRING};
  189. int index = 0;
  190. switch(id)
  191. {
  192. case MAINLAND_LANG_ID: //gb
  193. index = 0;
  194. break;
  195. case TAIWAN_LANG_ID: //big5
  196. index = 1;
  197. break;
  198. case DEFAULT_LANG_ID: //english
  199. index = 2;
  200. break;
  201. default:
  202. index = 0;
  203. }
  204. flags[index] |= MF_CHECKED;
  205. HMENU h_langsubmenu = CreatePopupMenu();
  206. AppendMenu(h_langsubmenu, flags[0] , TRAYWM_LANGUAGESTART, langDll.GetStringByStr(_T("简体中文(&S)")));
  207. AppendMenu(h_langsubmenu, flags[1] , TRAYWM_LANGUAGESTART + 1, langDll.GetStringByStr(_T("繁体中文(&T)")));
  208. AppendMenu(h_langsubmenu, flags[2] , TRAYWM_LANGUAGESTART + 2, langDll.GetStringByStr(_T("英文(&E)")));
  209. return h_langsubmenu;
  210. }