Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
99 changes: 26 additions & 73 deletions src/app/ShellBrowseMenu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
CShellBrowseMenu::CShellBrowseMenu(const ShellMenuController* controller)
: m_controller(controller), m_isRendered(false), m_isCtxMenuShowing(false)
{
LoadIconImages();
LoadMenuImages();
}

HRESULT CShellBrowseMenu::Rebuild()
Expand Down Expand Up @@ -57,7 +57,7 @@ BOOL CShellBrowseMenu::InvokeWithSelection(LPCTSTR strVerb) const

void CShellBrowseMenu::UxModeUpdateColorSettings()
{
CUxModeMenuHelper::UxModeUpdateColorSettings();
CUxModeMenuBase::UxModeUpdateColorSettings();
if (!uxTheme.IsInDarkMode())
{
m_menuColors.crHighlightBg = UXCOLOR_LIGHTER(m_menuColors.crHighlightBg, 0.3);
Expand Down Expand Up @@ -279,7 +279,7 @@ LRESULT CShellBrowseMenu::OnDrawItem(UINT, WPARAM /*wParam*/, LPARAM lParam, BOO
}

bHandled = TRUE;
return CustomDrawMenuItem(lpDis);
return CustomDrawPopupMenuItem(lpDis);
}

LRESULT CShellBrowseMenu::OnMeasureItem(UINT, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)
Expand All @@ -292,57 +292,31 @@ LRESULT CShellBrowseMenu::OnMeasureItem(UINT, WPARAM /*wParam*/, LPARAM lParam,
}

bHandled = TRUE;
return MeasureMenuItem(lpMis);
auto pData = reinterpret_cast<LPSHELLMENUITEMDATA>(lpMis->itemData);
return MeasurePopupMenuItem(lpMis, pData ? (LPCTSTR)pData->caption : NULL);
}

BOOL CShellBrowseMenu::CustomDrawMenuItem(LPDRAWITEMSTRUCT lpDis)
BOOL CShellBrowseMenu::CustomDrawPopupMenuItem(LPDRAWITEMSTRUCT lpDis)
{
CustomDrawPopupMenuBackground(lpDis);
auto itemState = CustomDrawPopupMenuItemBackground(lpDis);

auto pData = (LPSHELLMENUITEMDATA)lpDis->itemData;

CDCHandle dc = lpDis->hDC;
RECT& rcItem = lpDis->rcItem;

CRect rcOverpaint(rcItem);
rcOverpaint.top -= 1;
rcOverpaint.bottom += 1;
m_menuTheme.DrawThemeBackground(dc, MENU_POPUPBACKGROUND, 0, rcOverpaint, NULL);

auto isDisabled = ODS_GRAYED == (lpDis->itemState & ODS_GRAYED);
auto isSelected = ODS_SELECTED == (lpDis->itemState & ODS_SELECTED);
auto isSeparator = 0 == pData->caption.GetLength();

auto itemState = isDisabled ? MPIF_DISABLED : MPI_NORMAL;
if (isSelected)
itemState = isDisabled ? MPI_DISABLEDHOT : MPI_HOT;
m_menuTheme.DrawThemeBackground(dc, MENU_POPUPITEM, itemState, &rcItem, NULL);

if (isSelected && !isDisabled)
{
CPen pen;
pen.CreatePen(PS_SOLID, 1, m_menuColors.crHihghlight);
auto oldPen = dc.SelectPen(pen);
auto oldBrush = dc.SelectBrush((HBRUSH)::GetStockObject(HOLLOW_BRUSH));
dc.Rectangle(&rcItem);
if (oldBrush)
dc.SelectBrush(oldBrush);
if (oldPen)
dc.SelectPen(oldPen);
}

CRect rc(rcItem);
CRect rc(lpDis->rcItem);
if (m_menuMetrics.sizeIcon.cx)
{
rc.left += m_menuMetrics.sizeIcon.cx + (m_menuMetrics.paddingIcon.cx * 2);
}

if (isSeparator)
auto pData = (LPSHELLMENUITEMDATA)lpDis->itemData;
CDCHandle dc = lpDis->hDC;

if (NULL == pData || 0 == pData->caption.GetLength())
{
m_menuTheme.DrawThemeBackground(dc, MENU_POPUPSEPARATOR, 0, rc, NULL);
}
else
{
auto isSubmenu = ::IsMenu((HMENU)(UINT_PTR)lpDis->itemID);
auto isDisabled = ODS_GRAYED == (lpDis->itemState & ODS_GRAYED);

if (-1 < pData->iconIndex && m_pImageList)
{
Expand Down Expand Up @@ -370,51 +344,30 @@ BOOL CShellBrowseMenu::CustomDrawMenuItem(LPDRAWITEMSTRUCT lpDis)
}
m_menuTheme.DrawThemeText(dc, MENU_POPUPITEM, itemState, pData->caption, -1, dwFlags, 0, rc);

if (isSubmenu)
if (::IsMenu((HMENU)(UINT_PTR)lpDis->itemID))
{
CustomDrawMenuArrow(dc, &rcItem, isDisabled);
CustomDrawMenuArrow(dc, &lpDis->rcItem, isDisabled);
}

dc.ExcludeClipRect(&rcItem);
dc.ExcludeClipRect(&lpDis->rcItem);
}
return TRUE;
}

BOOL CShellBrowseMenu::MeasureMenuItem(LPMEASUREITEMSTRUCT lpMis)
HRESULT CShellBrowseMenu::LoadMenuImages()
{
auto pData = (LPSHELLMENUITEMDATA)lpMis->itemData;

auto isSeparator = 0 == pData->caption.GetLength();
if (isSeparator)
{
lpMis->itemHeight = ::GetSystemMetrics(SM_CYMENU) / 2;
lpMis->itemWidth = 0;
}
else
auto result = S_FALSE;
if (!m_pImageList)
{
CWindowDC dc(GetOwnerHWND());
CRect rcText;
m_menuTheme.GetThemeTextExtent(dc, MENU_POPUPITEM, MPI_NORMAL, pData->caption, -1, DT_SINGLELINE | DT_LEFT | DT_VCENTER | DT_CALCRECT, NULL, rcText);

lpMis->itemHeight = m_menuMetrics.itemHeight;
lpMis->itemWidth = rcText.Width() + m_menuMetrics.paddingIcon.cx + m_menuMetrics.sizeMnuArrow.cx;
if (m_menuMetrics.sizeIcon.cx)
result = ::SHGetImageList(SHIL_SMALL, IID_IImageList, (void**)&m_pImageList);
if (SUCCEEDED(result) && m_pImageList)
{
lpMis->itemWidth += (m_menuMetrics.paddingText.cx * 2) + m_menuMetrics.sizeIcon.cx;
m_pImageList->GetIconSize((int*)&m_menuMetrics.sizeIcon.cx, (int*)&m_menuMetrics.sizeIcon.cy);
m_pImageList->GetIconSize((int*)&m_menuMetrics.sizeIcon.cx, (int*)&m_menuMetrics.sizeIcon.cy);
}
}

return TRUE;
}

HRESULT CShellBrowseMenu::LoadIconImages()
{
auto result = ::SHGetImageList(SHIL_SMALL, IID_IImageList, (void**) &m_pImageList);
if (SUCCEEDED(result) && m_pImageList)
{
m_pImageList->GetIconSize((int*)&m_menuMetrics.sizeIcon.cx, (int*)&m_menuMetrics.sizeIcon.cy);
m_pImageList->GetIconSize((int*)&m_menuMetrics.sizeIcon.cx, (int*)&m_menuMetrics.sizeIcon.cy);
}
if (S_FALSE == result)
m_menuMetrics.sizeIcon.cx = m_menuMetrics.sizeIcon.cy = 16;
return result;
}

Expand Down
13 changes: 7 additions & 6 deletions src/app/ShellBrowseMenu.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
#endif

class CShellBrowseMenu
: public CUxModeMenuHelper<CShellBrowseMenu>
: public CUxModeMenuBase<CShellBrowseMenu>
{
public:
enum MessageID
Expand Down Expand Up @@ -60,7 +60,7 @@ class CShellBrowseMenu
virtual ~CShellBrowseMenu() = default;

BEGIN_MSG_MAP(CShellBrowseMenu)
CHAIN_MSG_MAP(CUxModeMenuHelper<CShellBrowseMenu>)
CHAIN_MSG_MAP(CUxModeMenuBase<CShellBrowseMenu>)
MESSAGE_HANDLER(WM_MENURBUTTONUP, OnMenuRButtonUp)
MESSAGE_HANDLER(WM_RBUTTONUP, OnRButtonUp)
MESSAGE_HANDLER(WM_MENUCOMMAND, OnMenuCommand)
Expand Down Expand Up @@ -89,9 +89,10 @@ class CShellBrowseMenu
void Bind(const ShellMenuController* controller)
{
ATLASSERT(controller);
auto init = NULL == m_controller;
m_controller = controller;
m_mnuTop.Attach(m_controller ? m_controller->GetTopHMenu() : NULL);
UxModeSetup();
UxModeSetup(init);
SetupMenuInfo(m_mnuTop);
if (!m_rootIDL.IsNull())
{
Expand All @@ -116,6 +117,8 @@ class CShellBrowseMenu
{
return m_controller ? m_controller->GetHWnd() : NULL;
}
HRESULT LoadMenuImages();

private:
LRESULT OnInitMenuPopup(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/);
LRESULT OnUninitMenuPopup(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/);
Expand All @@ -126,10 +129,8 @@ class CShellBrowseMenu
LRESULT OnDrawItem(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnMeasureItem(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled);

BOOL CustomDrawMenuItem(LPDRAWITEMSTRUCT lpDis);
BOOL MeasureMenuItem(LPMEASUREITEMSTRUCT lpMis);
BOOL CustomDrawPopupMenuItem(LPDRAWITEMSTRUCT lpDis);

HRESULT LoadIconImages();
BOOL SetupMenuInfo(CMenuHandle& menu);
HRESULT BuildFolderMenu(LPSHELLFOLDER pFolder, HMENU hMenu);
void CleanUpMenuData(HMENU hMenu);
Expand Down
1 change: 1 addition & 0 deletions src/wtlx/wtlx.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -252,6 +252,7 @@
<ClInclude Include="wtlx\taskbarautomation.h" />
<ClInclude Include="wtlx\TaskBarList.h" />
<ClInclude Include="wtlx\UxModeHyperLink.h" />
<ClInclude Include="wtlx\UxModePopupMenu.h" />
<ClInclude Include="wtlx\uxthemehelper.h" />
</ItemGroup>
<ItemGroup>
Expand Down
39 changes: 39 additions & 0 deletions src/wtlx/wtlx.vcxproj.filters
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,45 @@
<ClInclude Include="targetver.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="wtlx\CoolContextMenu.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="wtlx\dialogresizeex.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="wtlx\Draw.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="wtlx\FileVersionInfo.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="wtlx\formattools.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="wtlx\IatHook.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="wtlx\NotifyTrayIcon.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="wtlx\PictureCtrl.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="wtlx\taskbarautomation.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="wtlx\TaskBarList.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="wtlx\UxModeHyperLink.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="wtlx\uxthemehelper.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="wtlx\UxModePopupMenu.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="pch.cpp">
Expand Down
Loading