一、xml写法如下
<?xml version="1.0" encoding="utf-8"?> <Window size="92,72"> <VerticalLayout bkcolor="#FF2E2E2E"> <List header="hidden" inset="1,3,1,3" itemtextcolor="#FFC8C6CB" itemselectedtextcolor="#FFC8C6CB" itemhottextcolor="#FFC8C6CB" itembkcolor="#FF2E2E2E" itemselectedbkcolor="#FF191919" itemhotbkcolor="#FF191919"> <ListContainerElement name="menuSequence" height="22" inset="15,0,25,0"> <Label text="顺序播放" textcolor="#FFC8C6CB" /> </ListContainerElement> <ListContainerElement name="menuRandom" height="22" inset="15,0,25,0"> <Label text="随机播放" textcolor="#FFC8C6CB" /> </ListContainerElement> <ListContainerElement name="menuSingleCircle" height="22" inset="15,0,25,0" > <Label text="单曲循环" textcolor="#FFC8C6CB" align="center"/> </ListContainerElement> </List> </VerticalLayout> </Window>
二、Menu.h
#pragma once #include "duilib.h" class CMenuWnd: public CXMLWnd { public: explicit CMenuWnd(LPCTSTR pszXMLName); protected: virtual ~CMenuWnd(); // 私有化析构函数,这样此对象只能通过new来生成,而不能直接定义变量。就保证了delete this不会出错 public: void Init(CPaintManagerUI *pOwnerPM, POINT ptPos); virtual void OnFinalMessage(HWND hWnd); virtual LRESULT HandleMessage (UINT uMsg, WPARAM wParam, LPARAM lParam); virtual LRESULT OnKillFocus (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); virtual void Notify(TNotifyUI& msg); private: CPaintManagerUI *m_pOwnerPM; };
#include "MenuWnd.h" CMenuWnd::CMenuWnd( LPCTSTR pszXMLName ) : CXMLWnd(pszXMLName), m_pOwnerPM(NULL) { } CMenuWnd::~CMenuWnd() { } void CMenuWnd::Init(CPaintManagerUI *pOwnerPM, POINT ptPos) { if( pOwnerPM == NULL ) { return; } m_pOwnerPM = pOwnerPM; Create(pOwnerPM->GetPaintWindow(), _T("MenuWnd"), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE); ::ClientToScreen(pOwnerPM->GetPaintWindow(), &ptPos); ::SetWindowPos(*this, NULL, ptPos.x, ptPos.y, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE); } void CMenuWnd::OnFinalMessage( HWND /*hWnd*/ ) { delete this; } LRESULT CMenuWnd::HandleMessage( UINT uMsg, WPARAM wParam, LPARAM lParam ) { LRESULT lRes = 0; BOOL bHandled = TRUE; switch( uMsg ) { case WM_KILLFOCUS: lRes = OnKillFocus(uMsg, wParam, lParam, bHandled); break; default: bHandled = FALSE; } if(bHandled || m_PaintManager.MessageHandler(uMsg, wParam, lParam, lRes)) { return lRes; } return __super::HandleMessage(uMsg, wParam, lParam); } LRESULT CMenuWnd::OnKillFocus( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled ) { Close(); bHandled = FALSE; return __super::OnKillFocus(uMsg, wParam, lParam, bHandled); } void CMenuWnd::Notify( TNotifyUI& msg ) { if(msg.sType == DUI_MSGTYPE_ITEMCLICK) { if(m_pOwnerPM) { m_pOwnerPM->SendNotify(msg); } Close(); } __super::Notify(msg); }
CMenuWnd *pMenu = new CMenuWnd(_T("menu.xml")); POINT pt = {msg.ptMouse.x, msg.ptMouse.y}; CDuiRect rc = msg.pSender->GetPos(); pt.x = rc.left; pt.y = rc.bottom; pMenu->Init(&m_PaintManager, pt); pMenu->ShowWindow(TRUE);
if(msg.sType == DUI_MSGTYPE_ITEMCLICK) { CDuiString strName = msg.pSender->GetName(); if (strName == _T("menuSequence")) { m_emPlayMode = EM_PLAY_MODE_SEQUENCE; } else if (strName == _T("menuRandom")) { m_emPlayMode = EM_PLAY_MODE_RANDOM; } else if (strName == _T("menuSingleCircle")) { m_emPlayMode = EM_PLAY_MODE_SINGLE_CIRCLE; } }