Skip to content

Commit

Permalink
优化菜单控件的创建和消息响应
Browse files Browse the repository at this point in the history
  • Loading branch information
redrains committed May 1, 2016
1 parent e068ad3 commit 0fca4a8
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 36 deletions.
23 changes: 15 additions & 8 deletions DuiLib/Control/UIMenu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -155,9 +155,16 @@ BOOL CMenuWnd::Receive(ContextMenuParam param)
return TRUE;
}

CMenuWnd* CMenuWnd::CreateMenu(CMenuElementUI* pOwner, STRINGorID xml, POINT point, CPaintManagerUI* pMainPaintManager, std::map<CDuiString, bool>* pMenuCheckInfo /*= NULL*/, DWORD dwAlignment /*= eMenuAlignment_Left | eMenuAlignment_Top*/)
{
CMenuWnd* pMenu = new CMenuWnd;
pMenu->Init(pOwner, xml, point, pMainPaintManager, pMenuCheckInfo, dwAlignment);
return pMenu;
}

void CMenuWnd::Init(CMenuElementUI* pOwner, STRINGorID xml, POINT point,
CPaintManagerUI* pMainPaintManager, std::map<CDuiString,bool>* pMenuCheckInfo/* = NULL*/,
DWORD dwAlignment/* = eMenuAlignment_Left | eMenuAlignment_Top*/)
CPaintManagerUI* pMainPaintManager, std::map<CDuiString,bool>* pMenuCheckInfo,
DWORD dwAlignment)
{

m_BasedPoint = point;
Expand Down Expand Up @@ -232,9 +239,9 @@ void CMenuWnd::OnFinalMessage(HWND hWnd)
}
m_pOwner->m_pWindow = NULL;
m_pOwner->m_uButtonState &= ~ UISTATE_PUSHED;
m_pOwner->Invalidate();
delete this;
m_pOwner->Invalidate();
}
delete this;
}

LRESULT CMenuWnd::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
Expand Down Expand Up @@ -544,6 +551,7 @@ LRESULT CMenuWnd::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
/////////////////////////////////////////////////////////////////////////////////////
//

CDuiString CMenuElementUI::s_clickedMenuItem;
CMenuElementUI::CMenuElementUI():
m_pWindow(NULL),
m_bDrawLine(false),
Expand Down Expand Up @@ -780,9 +788,8 @@ void CMenuElementUI::DoEvent(TEventUI& event)
SetChecked(!GetChecked());
if (CMenuWnd::GetGlobalContextMenuObserver().GetManager() != NULL)
{
CDuiString* strPost = new CDuiString(GetName().GetData());
if (!PostMessage(CMenuWnd::GetGlobalContextMenuObserver().GetManager()->GetPaintWindow(), WM_MENUCLICK, (WPARAM)(strPost), (LPARAM)(GetChecked() == TRUE)))
delete strPost;
s_clickedMenuItem = GetName();
PostMessage(CMenuWnd::GetGlobalContextMenuObserver().GetManager()->GetPaintWindow(), WM_MENUCLICK, (WPARAM)(&s_clickedMenuItem), (LPARAM)(GetChecked() ? TRUE : FALSE));
}
ContextMenuParam param;
param.hWnd = m_pManager->GetPaintWindow();
Expand Down Expand Up @@ -845,7 +852,7 @@ void CMenuElementUI::CreateMenuWnd()
param.wParam = 2;
CMenuWnd::GetGlobalContextMenuObserver().RBroadcast(param);

m_pWindow->Init(static_cast<CMenuElementUI*>(this), _T(""), CPoint(), NULL);
m_pWindow->Init(static_cast<CMenuElementUI*>(this), _T(""), CPoint(), NULL, NULL, eMenuAlignment_Left | eMenuAlignment_Top);
}

void CMenuElementUI::SetLineType()
Expand Down
34 changes: 22 additions & 12 deletions DuiLib/Control/UIMenu.h
Original file line number Diff line number Diff line change
Expand Up @@ -273,16 +273,17 @@ class UILIB_API CMenuWnd : public CWindowWnd, public ReceiverImpl, public INotif
~CMenuWnd();

/*
* @pOwner 一级菜单不要指定这个参数,这是菜单内部使用的
* @xml 菜单的布局文件
* @point 菜单的左上角坐标
* @pMainPaintManager 菜单的父窗体管理器指针
* @pMenuCheckInfo 保存菜单的单选和复选信息结构指针
* @dwAlignment 菜单的出现位置,默认出现在鼠标的右下侧。
*/
void Init(CMenuElementUI* pOwner, STRINGorID xml, POINT point,
CPaintManagerUI* pMainPaintManager, std::map<CDuiString,bool>* pMenuCheckInfo = NULL,
* @pOwner 一级菜单不要指定这个参数,这是菜单内部使用的
* @xml 菜单的布局文件
* @point 菜单的左上角坐标
* @pMainPaintManager 菜单的父窗体管理器指针
* @pMenuCheckInfo 保存菜单的单选和复选信息结构指针
* @dwAlignment 菜单的出现位置,默认出现在鼠标的右下侧。
*/
static CMenuWnd* CreateMenu(CMenuElementUI* pOwner, STRINGorID xml, POINT point,
CPaintManagerUI* pMainPaintManager, std::map<CDuiString, bool>* pMenuCheckInfo = NULL,
DWORD dwAlignment = eMenuAlignment_Left | eMenuAlignment_Top);

LPCTSTR GetWindowClassName() const;
void OnFinalMessage(HWND hWnd);
void Notify(TNotifyUI& msg);
Expand All @@ -304,14 +305,20 @@ class UILIB_API CMenuWnd : public CWindowWnd, public ReceiverImpl, public INotif
// 重新调整子菜单的大小
void ResizeSubMenu();

public:
private:
friend class CMenuElementUI;
void Init(CMenuElementUI* pOwner, STRINGorID xml, POINT point,
CPaintManagerUI* pMainPaintManager, std::map<CDuiString, bool>* pMenuCheckInfo,
DWORD dwAlignment);

private:

POINT m_BasedPoint;
STRINGorID m_xml;
CPaintManagerUI m_pm;
CMenuElementUI* m_pOwner;
CMenuUI* m_pLayout;
DWORD m_dwAlignment; //菜单对齐方式
CMenuUI* m_pLayout;
DWORD m_dwAlignment; //菜单对齐方式
};

class CListContainerElementUI;
Expand Down Expand Up @@ -351,6 +358,7 @@ class UILIB_API CMenuElementUI : public CListContainerElementUI

void SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue);


protected:
CMenuWnd* m_pWindow;

Expand All @@ -364,6 +372,8 @@ class UILIB_API CMenuElementUI : public CListContainerElementUI

bool m_bShowExplandIcon;
CImageAttribute m_expandIcon;

static CDuiString s_clickedMenuItem; //被单击的菜单项名字
};

} // namespace DuiLib
Expand Down
25 changes: 10 additions & 15 deletions 各个Demo/菜单和窗体阴影demo/Duilib/FrameWnd.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
CFrameWnd::CFrameWnd( LPCTSTR pszXMLPath )
: m_strXMLPath(pszXMLPath)
{
m_pMenu = NULL;

}

LPCTSTR CFrameWnd::GetWindowClassName() const
Expand Down Expand Up @@ -44,22 +44,18 @@ void CFrameWnd::Notify( TNotifyUI& msg )
{
if( msg.pSender->GetName() == _T("btnMenu") )
{
if (m_pMenu != NULL)
{
delete m_pMenu;
m_pMenu = NULL;
}
m_pMenu = new CMenuWnd();
CPoint point = msg.ptMouse;
ClientToScreen(m_hWnd, &point);
m_pMenu->Init(NULL, _T("menutest.xml"), point, &m_PaintManager, &m_MenuCheckInfo);
CPoint point(0, 0);
GetCursorPos(&point);

CMenuWnd* pMenu = CMenuWnd::CreateMenu(NULL, _T("menutest.xml"), point, &m_PaintManager, &m_MenuCheckInfo);

//左侧打开菜单
//pMenu->Init(NULL, _T("menutest.xml"), point, &m_PaintManager, &m_MenuCheckInfo, eMenuAlignment_Right );
//CMenuWnd* pMenu = CMenuWnd::CreateMenu(NULL, _T("menutest.xml"), point, &m_PaintManager, &m_MenuCheckInfo, eMenuAlignment_Right );
//左上侧打开菜单
//pMenu->Init(NULL, _T("menutest.xml"), point, &m_PaintManager, &m_MenuCheckInfo, eMenuAlignment_Right | eMenuAlignment_Bottom);
//CMenuWnd* pMenu = CMenuWnd::CreateMenu(NULL, _T("menutest.xml"), point, &m_PaintManager, &m_MenuCheckInfo, eMenuAlignment_Right | eMenuAlignment_Bottom);

// 先获取到根项,然后就可以使用rootMenu插到到菜单内的任意子菜单项,然后做添加删除操作
CMenuUI* rootMenu = m_pMenu->GetMenuUI();
CMenuUI* rootMenu = pMenu->GetMenuUI();
if (rootMenu != NULL)
{
CMenuElementUI* pNew = new CMenuElementUI;
Expand Down Expand Up @@ -88,7 +84,7 @@ void CFrameWnd::Notify( TNotifyUI& msg )
}

// 动态添加后重新设置菜单的大小
m_pMenu->ResizeMenu();
pMenu->ResizeMenu();
}
else if (msg.pSender->GetName() == _T("Menu_btn") )
{
Expand Down Expand Up @@ -138,7 +134,6 @@ void CFrameWnd::Notify( TNotifyUI& msg )
MessageBox(m_hWnd, L"你单击了动态添加菜单", L"", 0);
}

delete strMenuName;
}
bHandled = false;
return 0;
Expand Down
1 change: 0 additions & 1 deletion 各个Demo/菜单和窗体阴影demo/Duilib/FrameWnd.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,5 @@ class CFrameWnd: public WindowImplBase
private:
CDuiString m_strXMLPath;

CMenuWnd *m_pMenu;
map<CDuiString,bool> m_MenuCheckInfo; //保存菜单的单选复选信息
};

0 comments on commit 0fca4a8

Please sign in to comment.