// 重载加载XML节点函数,判断是否有子菜单 BOOL CMenuItem::Load(DuiXmlNode pXmlElem, BOOL bLoadSubControl) { BOOL bRet = __super::Load(pXmlElem); // 判断是否有定义子菜单 if(pXmlElem && (pXmlElem.first_child() != NULL)) { m_bIsPopup = TRUE; } // 如果是嵌套菜单(有menu属性),则通过调用父菜单的Load函数将嵌套菜单作为平级菜单加载 CDuiMenu* pParentMenu = GetParentMenu(); if(pParentMenu && !m_strMenuXml.IsEmpty()) { pParentMenu->LoadXmlFile(m_strMenuXml); // 如果是嵌套菜单,则返回FALSE,这样就不会创建此菜单项,只会创建嵌套菜单中定义的菜单项 return FALSE; } return bRet; }
// 消息处理 LRESULT CControlBase::OnMessage(UINT uID, UINT uMsg, WPARAM wParam, LPARAM lParam) { if(m_bTaskMsg) { // 如果设置了任务方式发消息的属性,则添加一个任务消息 CString strControlName = GetName(); CString strAction = GetAction(); CDlgBase* pParentDlg = GetParentDialog(); DuiSystem::Instance()->AddDuiActionTask(uID, uMsg, wParam, lParam, strControlName, strAction, pParentDlg); return 0; } if(m_strAction.Find(_T("dlg:")) == 0) // 动作:打开一个对话框,有内存泄漏,改为通过DuiSystem创建和管理 { if(uMsg == BUTTOM_UP) // 鼠标放开事件才处理 { CString strXmlFile = m_strAction; strXmlFile.Delete(0, 4); DuiSystem::ShowDuiDialog(strXmlFile, GetParentDialog()); } }else if(m_strAction.Find(_T("popup:")) == 0) // 动作:打开一个Popup对话框 { if(uMsg == BUTTOM_UP) // 鼠标放开事件才处理 { /*UINT nIDTemplate = 0; CDlgBase* pParentDlg = GetParentDialog(); if(pParentDlg != NULL) { nIDTemplate = pParentDlg->GetIDTemplate(); } CDlgPopup* pPopup = new CDlgPopup; pPopup->SetParent(this); CString strXmlFile = m_strAction; strXmlFile.Delete(0, 6); pPopup->SetXmlFile(_T("xml:") +strXmlFile ); CRect rc = pControlBase->GetRect(); rc.OffsetRect(-95, rc.Height()); ClientToScreen(&rc); pPopup->Create(this, rc, WM_SKIN); pPopup->ShowWindow(SW_SHOW);*/ } }else if(m_strAction.Find(_T("menu:")) == 0) // 动作:打开一个菜单 { CDuiMenu *pDuiMenu = new CDuiMenu( DuiSystem::GetDefaultFont(), 12); // 可以考虑改为通过DuiSystem创建和管理 pDuiMenu->SetParent(this); CPoint point; CRect rc = GetRect(); point.SetPoint(rc.left + rc.Width() / 2, rc.bottom); CDlgBase* pParentDlg = GetParentDialog(); if(pParentDlg != NULL) { pParentDlg->ClientToScreen(&point); } CString strXmlFile = m_strAction; strXmlFile.Delete(0, 5); pDuiMenu->LoadXmlFile(strXmlFile, pParentDlg, point, WM_DUI_MENU); pDuiMenu->ShowWindow(SW_SHOW); }else if(m_strAction.Find(_T("link:")) == 0) // 动作:打开一个页面链接 { if(uMsg == BUTTOM_UP) // 鼠标放开事件才处理 { CString strLink = m_strAction; strLink.Delete(0, 5); if(!strLink.IsEmpty()) { ShellExecute(NULL, TEXT("open"), strLink, NULL,NULL,SW_NORMAL); } } }else if(m_strAction.Find(_T("run:")) == 0) // 动作:执行一个进程 { if(uMsg == BUTTOM_UP) // 鼠标放开事件才处理 { CString strProcess = m_strAction; strProcess.Delete(0, 4); strProcess.MakeLower(); if(!strProcess.IsEmpty()) { strProcess.MakeLower(); BOOL bForceAdmin = FALSE; if(strProcess.Find(_T("admin@")) == 0) { bForceAdmin = TRUE; strProcess.Delete(0, 6); } BOOL bWaitProcess = FALSE; if(strProcess.Find(_T("&")) == (strProcess.GetLength()-1)) { bWaitProcess = TRUE; strProcess.Delete(strProcess.GetLength()-1, 1); } if(strProcess.Find(_T(".exe")) == -1) { strProcess = DuiSystem::Instance()->GetString(CEncodingUtil::UnicodeToAnsi(strProcess)); } if(strProcess.Find(_T("{platpath}")) == 0) { strProcess.Delete(0, 10); strProcess = DuiSystem::GetExePath() + strProcess; } CString strCmdLine = _T(""); int nPos = strProcess.Find(_T("|")); if(nPos != -1) { strCmdLine = strProcess; strCmdLine.Delete(0, nPos+1); strProcess = strProcess.Left(nPos); } DuiSystem::PathCanonicalize(strProcess); // 路径标准化 DuiSystem::ExecuteProcess(strProcess, strCmdLine, bForceAdmin, bWaitProcess); } } }else if(m_strAction.Find(ACTION_CLOSE_WINDOW) == 0) // 动作:关闭指定的窗口 { if(uMsg == BUTTOM_UP) // 鼠标放开事件才处理 { CString strWndName = m_strAction; strWndName.Delete(0, 13); if(!strWndName.IsEmpty()) { CDlgBase* pDlg = DuiSystem::Instance()->GetDuiDialog(strWndName); if(pDlg != NULL) { //pDlg->DoClose(); pDlg->PostMessage(WM_QUIT, 0, 0); } } } }else { // 首先判断如果是几个默认按钮,则直接做相应的处理 CDlgBase* pParentDlg = GetParentDialog(); if(IsThisObject(BT_OK, NAME_BT_OK)) { if((BUTTOM_UP == uMsg) && (pParentDlg != NULL)) { pParentDlg->DoOK(); } }else if(IsThisObject(BT_CANCEL, NAME_BT_CANCEL)) { if((BUTTOM_UP == uMsg) && (pParentDlg != NULL)) { pParentDlg->DoCancel(); } }else if(IsThisObject(BT_YES, NAME_BT_YES)) { if((BUTTOM_UP == uMsg) && (pParentDlg != NULL)) { pParentDlg->DoYes(); } }else if(IsThisObject(BT_NO, NAME_BT_NO)) { if((BUTTOM_UP == uMsg) && (pParentDlg != NULL)) { pParentDlg->DoNo(); } }else { // 调用控件的DUI事件处理对象 CallDuiHandler(uMsg, wParam, lParam); } } return 0; }