TrayIconMenu.cpp
资源名称:p2p_vod.rar [点击查看]
上传用户:liguizhu
上传日期:2015-11-01
资源大小:2422k
文件大小:6k
源码类别:
P2P编程
开发平台:
Visual C++
- /*
- * 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 ".trayiconmenu.h"
- #include <string.h>
- #include <TCHAR.h>
- #include <shellapi.h>
- #include "MultiLanguageMgr.h"
- CTrayIconMenu::CTrayIconMenu()
- {
- MultiLanguage langDll; //生成多语言数据
- m_curLanguage = langDll.GetCurLanguage();
- hWnd = NULL;
- }
- CTrayIconMenu::~CTrayIconMenu(void)
- {
- }
- BOOL CTrayIconMenu::ShowMenu(HWND hparent, const UINT_PTR* p_cmdID, const TCHAR* p_cmdstr)
- {
- hWnd = hparent;
- if(p_cmdID == NULL || p_cmdstr == NULL)
- return FALSE;
- return ShowMenu(p_cmdID, p_cmdstr);
- }
- #define MAX_MENUSTR 256
- HMENU CTrayIconMenu::MakeMenu(const UINT*& p_cmdID, const TCHAR*& p_cmdstr)
- {
- HMENU hmenu = CreatePopupMenu();
- if(hmenu == NULL)
- return hmenu;
- TCHAR m_strbuf[MAX_MENUSTR]; //存放菜单文字的缓冲区
- const TCHAR *p_oldstrh;
- MultiLanguage LangDll;
- for(p_oldstrh = p_cmdstr, p_cmdstr = _tcschr(p_cmdstr, _T('*')) + 1;
- *p_cmdID != ID_END;
- p_cmdID++, p_oldstrh = p_cmdstr, p_cmdstr = _tcschr(p_cmdstr, _T('*')) + 1)
- {
- memset(m_strbuf, 0, sizeof(TCHAR)*MAX_MENUSTR);
- _tcsncpy(m_strbuf, p_oldstrh,
- (p_cmdstr - p_oldstrh - 1) >= MAX_MENUSTR ? (MAX_MENUSTR - 1) : (p_cmdstr - p_oldstrh - 1));
- if(*p_cmdID == ID_POPUP) //生成子菜单
- {
- p_cmdstr = _tcschr(p_cmdstr, _T('*')) + 1;
- p_cmdID++;
- HMENU hpopmenu = MakeMenu(p_cmdID, p_cmdstr); //递归地生成子菜单
- if(hpopmenu == NULL)
- {
- DestroyMenu(hmenu);
- return NULL;
- }
- AppendMenu(hmenu, MF_STRING | MF_POPUP, (UINT_PTR) hpopmenu, LangDll.GetStringByStr(m_strbuf));
- }
- else if(*p_cmdID == ID_EXTERNAL)
- {
- p_cmdID++;
- if(*p_cmdID != 0)
- AppendMenu(hmenu, MF_STRING | MF_POPUP, *p_cmdID, LangDll.GetStringByStr(m_strbuf));
- }
- else if(*p_cmdID == ID_SEPERATOR) //生成分隔线
- {
- AppendMenu(hmenu, MF_SEPARATOR, 0, NULL);
- }
- else if(*p_cmdID == ID_LANGUAGE)
- {
- AppendMenu(hmenu, MF_STRING | MF_POPUP, (UINT_PTR) MakeLanguageMenu(), LangDll.GetStringByStr(m_strbuf));
- }
- else //生成一般的命令项
- {
- UINT m_addUI = MenuUI(*p_cmdID);
- AppendMenu(hmenu, MF_STRING | m_addUI, *p_cmdID, LangDll.GetStringByStr(m_strbuf));
- }
- }
- return hmenu;
- }
- void CTrayIconMenu::ReleaseMenu(HMENU hmenu, const UINT_PTR*& p_cmdID)
- {
- for(int i = 0; *p_cmdID != ID_END; p_cmdID++, i++)
- {
- if(*p_cmdID == ID_POPUP)
- {
- HMENU hsub = GetSubMenu(hmenu, i);
- assert(hsub != NULL);
- p_cmdID++;
- ReleaseMenu(hsub, p_cmdID);
- }
- else if(*p_cmdID == ID_EXTERNAL)
- {
- p_cmdID++;
- RemoveMenu(hmenu, i, MF_BYPOSITION);
- i--;
- }
- }
- DestroyMenu(hmenu);
- }
- BOOL CTrayIconMenu::ShowMenu(const UINT_PTR* p_traycmd, const TCHAR* p_traystr)
- {
- POINT curpoint;
- if(GetCursorPos(&curpoint) == FALSE) //获得鼠标位置
- return FALSE;
- if (!p_traycmd || !p_traystr) //数据还没有准备好
- return FALSE;
- do
- {
- const UINT_PTR* p_tmptraycmd = p_traycmd;
- const TCHAR* p_tmptraystr = p_traystr;
- h_popup = MakeMenu(p_tmptraycmd, p_tmptraystr);
- if(h_popup == NULL)
- return FALSE;
- UINT returncmd = TrackPopupMenuEx(h_popup, TPM_BOTTOMALIGN | TPM_RIGHTALIGN /*| TPM_NONOTIFY*/ | TPM_RETURNCMD | TPM_LEFTBUTTON,
- curpoint.x, curpoint.y, hWnd, NULL); //鼠标位置在生成的菜单右下角
- DWORD ret = GetLastError();
- p_tmptraycmd = p_traycmd;
- ReleaseMenu(h_popup, p_tmptraycmd);
- if(returncmd == 0)
- return FALSE;
- if(MenuCommand(returncmd))
- break;
- }while(1);
- return TRUE;
- }
- BOOL CTrayIconMenu::OnMenuPopup(HMENU hmenu, int pos)
- {
- return FALSE;
- }
- BOOL CTrayIconMenu::MenuCommand(UINT m_cmdID)
- {
- if(m_cmdID >= TRAYWM_LANGUAGESTART && m_cmdID <= TRAYWM_LANGUAGEEND)//用户选择了语言切换,这是一个"EX"型命令处理函数
- {
- SendMessage(hWnd, WM_COMMAND, TRAYWM_LANGUAGECHANGE, 0);
- return OnSwitchLanguageEx(m_cmdID);
- }
- else
- {
- //这里处理普通的命令处理函数
- PostMessage(hWnd, WM_COMMAND, m_cmdID, 0);
- //普通命令处理函数将返回TRUE
- return TRUE;
- }
- }
- UINT CTrayIconMenu::MenuUI(UINT m_cmdID)
- {
- if(m_cmdID == m_curLanguage)
- return MF_CHECKED;
- return 0;
- }
- BOOL CTrayIconMenu::OnSwitchLanguageEx(UINT m_language)
- {
- LANGID langid;
- switch(m_language - TRAYWM_LANGUAGESTART )
- {
- case 0: //gb
- langid = MAINLAND_LANG_ID;
- break;
- case 1: //big5
- langid = TAIWAN_LANG_ID;
- break;
- case 2: //english
- langid = DEFAULT_LANG_ID;
- break;
- default:
- langid = DEFAULT_LANG_ID;
- }
- m_curLanguage = langid;
- MultiLanguage LanguageDll;
- LanguageDll.SwitchLanguage(langid);
- return FALSE; //表示重新显示菜单并处理命令
- }
- HMENU CTrayIconMenu::MakeLanguageMenu()
- {
- MultiLanguage langDll; //生成多语言数据
- LANGID id = m_curLanguage;
- UINT flags[3] = {MF_STRING, MF_STRING, MF_STRING};
- int index = 0;
- switch(id)
- {
- case MAINLAND_LANG_ID: //gb
- index = 0;
- break;
- case TAIWAN_LANG_ID: //big5
- index = 1;
- break;
- case DEFAULT_LANG_ID: //english
- index = 2;
- break;
- default:
- index = 0;
- }
- flags[index] |= MF_CHECKED;
- HMENU h_langsubmenu = CreatePopupMenu();
- AppendMenu(h_langsubmenu, flags[0] , TRAYWM_LANGUAGESTART, langDll.GetStringByStr(_T("简体中文(&S)")));
- AppendMenu(h_langsubmenu, flags[1] , TRAYWM_LANGUAGESTART + 1, langDll.GetStringByStr(_T("繁体中文(&T)")));
- AppendMenu(h_langsubmenu, flags[2] , TRAYWM_LANGUAGESTART + 2, langDll.GetStringByStr(_T("英文(&E)")));
- return h_langsubmenu;
- }