144 lines
3.2 KiB
C++
144 lines
3.2 KiB
C++
#include "stdafx.h"
|
||
#include "ui_menu.h"
|
||
|
||
namespace ui {
|
||
|
||
/////////////////////////////////////////////////////////////////////////////////////
|
||
//
|
||
|
||
Control* CMenuWnd::CreateControl(const std::wstring& pstrClass)
|
||
{
|
||
if (pstrClass == kMenuElementUIInterfaceName)
|
||
{
|
||
return new CMenuElementUI();
|
||
}
|
||
return NULL;
|
||
}
|
||
|
||
CMenuWnd::CMenuWnd(HWND hParent) :
|
||
m_hParent(hParent),
|
||
m_xml(_T("")),
|
||
no_focus_(false)
|
||
{
|
||
}
|
||
|
||
void CMenuWnd::Init(STRINGorID xml, LPCTSTR pSkinType, POINT point, PopupPosType popupPosType, bool no_focus)
|
||
{
|
||
m_BasedPoint = point;
|
||
m_popupPosType = popupPosType;
|
||
|
||
if (pSkinType != NULL)
|
||
m_sType = pSkinType;
|
||
|
||
m_xml = xml;
|
||
no_focus_ = no_focus;
|
||
Create(m_hParent, L"NIM_DUILIB_MENU_WINDOW", WS_POPUP, WS_EX_TOOLWINDOW | WS_EX_TOPMOST, true, UiRect());
|
||
// HACK: Don't deselect the parent's caption
|
||
HWND hWndParent = m_hWnd;
|
||
while (::GetParent(hWndParent) != NULL) hWndParent = ::GetParent(hWndParent);
|
||
::ShowWindow(m_hWnd, no_focus ? SW_SHOWNOACTIVATE : SW_SHOW);
|
||
::SetWindowPos(m_hWnd, NULL, m_BasedPoint.x, m_BasedPoint.y, 0, 0, SWP_NOSIZE | (no_focus ? SWP_NOACTIVATE : 0));
|
||
::SendMessage(hWndParent, WM_NCACTIVATE, TRUE, 0L);
|
||
}
|
||
|
||
std::wstring CMenuWnd::GetWindowClassName() const
|
||
{
|
||
return _T("MenuWnd");
|
||
}
|
||
|
||
LRESULT CMenuWnd::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||
{
|
||
if (uMsg == WM_KILLFOCUS)
|
||
{
|
||
Close();
|
||
return 0;
|
||
}
|
||
else if (uMsg == WM_KEYDOWN)
|
||
{
|
||
if (wParam == VK_ESCAPE)
|
||
{
|
||
Close();
|
||
}
|
||
}
|
||
|
||
return __super::HandleMessage(uMsg, wParam, lParam);
|
||
}
|
||
|
||
void CMenuWnd::Show()
|
||
{
|
||
MONITORINFO oMonitor = {};
|
||
oMonitor.cbSize = sizeof(oMonitor);
|
||
::GetMonitorInfo(::MonitorFromWindow(m_hWnd, MONITOR_DEFAULTTOPRIMARY), &oMonitor);
|
||
UiRect rcWork = oMonitor.rcWork;
|
||
UiRect monitor_rect = oMonitor.rcMonitor;
|
||
ui::CSize szInit = { rcWork.right - rcWork.left, rcWork.bottom - rcWork.top };
|
||
szInit = GetRoot()->EstimateSize(szInit);
|
||
szInit.cx -= GetShadowCorner().left + GetShadowCorner().right;
|
||
szInit.cy -= GetShadowCorner().top + GetShadowCorner().bottom;
|
||
if (m_popupPosType == RIGHT_BOTTOM)
|
||
{
|
||
if (m_BasedPoint.y + szInit.cy > monitor_rect.bottom)
|
||
{
|
||
m_BasedPoint.y -= szInit.cy;
|
||
}
|
||
}
|
||
else if (m_popupPosType == RIGHT_TOP)
|
||
{
|
||
if (m_BasedPoint.y - szInit.cy >= monitor_rect.top)
|
||
{
|
||
m_BasedPoint.y -= szInit.cy;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
ASSERT(FALSE);
|
||
}
|
||
UiRect rc;
|
||
rc.left = m_BasedPoint.x;
|
||
rc.top = m_BasedPoint.y;
|
||
if (rc.top < monitor_rect.top)
|
||
{
|
||
rc.top = monitor_rect.top;
|
||
}
|
||
|
||
//<2F>ж<EFBFBD><D0B6>Ƿ<C7B7><F1B3ACB3><EFBFBD>Ļ
|
||
if (rc.left > monitor_rect.right - szInit.cx)
|
||
{
|
||
rc.left = monitor_rect.right - szInit.cx;
|
||
}
|
||
if (rc.left < monitor_rect.left)
|
||
{
|
||
rc.left = monitor_rect.left;
|
||
}
|
||
rc.right = rc.left + szInit.cx;
|
||
rc.bottom = rc.top + szInit.cy;
|
||
|
||
SetPos(rc, false, SWP_SHOWWINDOW | (no_focus_ ? SWP_NOACTIVATE : 0), HWND_TOPMOST, false);
|
||
if (!no_focus_)
|
||
SetForegroundWindow(m_hWnd);
|
||
}
|
||
|
||
// MenuElementUI
|
||
const TCHAR* const kMenuElementUIInterfaceName = _T("MenuElement");
|
||
|
||
CMenuElementUI::CMenuElementUI()
|
||
{
|
||
m_bMouseChildEnabled = false;
|
||
}
|
||
|
||
CMenuElementUI::~CMenuElementUI()
|
||
{}
|
||
|
||
bool CMenuElementUI::ButtonUp(EventArgs& msg)
|
||
{
|
||
std::weak_ptr<nbase::WeakFlag> weakFlag = m_pWindow->GetWeakFlag();
|
||
bool ret = __super::ButtonUp(msg);
|
||
if (ret && !weakFlag.expired()) {
|
||
m_pWindow->Close();
|
||
}
|
||
|
||
return ret;
|
||
}
|
||
|
||
} // namespace ui
|