[QCKLNCH]

-Removed CWindowImpl
-Added CWindow
-Used OnWinEvent() instead of subclassing
-Handled WM_COMMAND and WM_NOTIFY as needed
-Now along with buttons chevron menu is also working

CR-122 (https://code.reactos.org/cru/CR-122#details)

PS: Thank you everyone for spending your time and giving a thorough review. :)

svn path=/branches/GSoC_2017/shellext/; revision=75297
This commit is contained in:
Shriraj Sawant 2017-07-07 14:53:11 +00:00
parent c8c4bcfa52
commit fe273d3531
3 changed files with 86 additions and 108 deletions

View file

@ -7,7 +7,6 @@
*/
#include "precomp.h"
#include <mshtmcid.h>
#include <commoncontrols.h>
#define GET_X_LPARAM(lp) ((int)(short)LOWORD(lp))
@ -26,7 +25,7 @@ BOOL WINAPI _ILIsDesktop(LPCITEMIDLIST pidl)
// *** CISFBand ***
CISFBand::CISFBand() :
m_BandID(0),
m_BandID(0),
m_pidl(NULL),
m_textFlag(true),
m_iconFlag(true)
@ -34,84 +33,10 @@ CISFBand::CISFBand() :
}
CISFBand::~CISFBand()
{
{
}
// *** CWindowImpl ***
// Subclassing
LRESULT CISFBand::OnLButtonUp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
TBBUTTON tb;
POINT pt;
DWORD pos = GetMessagePos();
pt.x = GET_X_LPARAM(pos);
pt.y = GET_Y_LPARAM(pos);
ScreenToClient(&pt);
int index = SendMessage(m_hWnd, TB_HITTEST, 0, (LPARAM)&pt);
bool chk = SendMessage(m_hWnd, TB_GETBUTTON, abs(index), (LPARAM)&tb);
if(chk)
SHInvokeDefaultCommand(m_hWnd, m_pISF, (LPITEMIDLIST)tb.dwData);
return 0;
}
LRESULT CISFBand::OnRButtonUp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
HRESULT hr;
CComPtr<IContextMenu> picm;
HMENU fmenu = CreatePopupMenu();
TBBUTTON tb;
POINT pt;
DWORD pos = GetMessagePos();
pt.x = GET_X_LPARAM(pos);
pt.y = GET_Y_LPARAM(pos);
ScreenToClient(&pt);
int index = SendMessage(m_hWnd, TB_HITTEST, 0, (LPARAM)&pt);
bool chk = SendMessage(m_hWnd, TB_GETBUTTON, abs(index), (LPARAM)&tb);
LPITEMIDLIST pidl = (LPITEMIDLIST)tb.dwData;
if (chk)
{
ClientToScreen(&pt);
hr = m_pISF->GetUIObjectOf(m_hWnd, 1, &pidl, IID_NULL_PPV_ARG(IContextMenu, &picm));
if (FAILED_UNEXPECTEDLY(hr))
return hr;
hr = picm->QueryContextMenu(fmenu, 0, 1, 0x7FFF, CMF_DEFAULTONLY);
if (FAILED_UNEXPECTEDLY(hr))
return hr;
int id = TrackPopupMenuEx(fmenu, TPM_LEFTALIGN | TPM_BOTTOMALIGN | TPM_RETURNCMD, pt.x, pt.y, m_hWnd, 0);
if (id > 0)
{
CMINVOKECOMMANDINFOEX info = { 0 };
info.cbSize = sizeof(info);
info.fMask = CMIC_MASK_UNICODE | CMIC_MASK_PTINVOKE;
if (GetKeyState(VK_CONTROL) < 0)
{
info.fMask |= CMIC_MASK_CONTROL_DOWN;
}
if (GetKeyState(VK_SHIFT) < 0)
{
info.fMask |= CMIC_MASK_SHIFT_DOWN;
}
info.hwnd = m_hWnd;
info.lpVerb = MAKEINTRESOURCEA(id - 1);
info.lpVerbW = MAKEINTRESOURCEW(id - 0x7FFF);
info.nShow = SW_SHOWNORMAL;
info.ptInvoke = pt;
picm->InvokeCommand((LPCMINVOKECOMMANDINFO)&info);
}
}
DestroyMenu(fmenu);
return 0;
}
// ToolbarTest
// Toolbar
HRESULT CISFBand::CreateSimpleToolbar(HWND hWndParent)
{
// Declare and initialize local constants.
@ -159,9 +84,9 @@ HRESULT CISFBand::CreateSimpleToolbar(HWND hWndParent)
StrRetToBuf(&stret, pidl, sz, _countof(sz));
TBBUTTON tb = { MAKELONG(index, 0), i, TBSTATE_ENABLED, buttonStyles,{ 0 }, (DWORD_PTR)pidl, (INT_PTR)sz };
SendMessage(m_hWnd, TB_INSERTBUTTONW, 0, (LPARAM)&tb);
//CoTaskMemFree(pidl);
}
SendMessage(m_hWnd, TB_INSERTBUTTONW, i, (LPARAM)&tb);
//CoTaskMemFree(pidl);
}
// Resize the toolbar, and then show it.
SendMessage(m_hWnd, TB_AUTOSIZE, 0, 0);
@ -189,11 +114,7 @@ HRESULT CISFBand::CreateSimpleToolbar(HWND hWndParent)
hr = CreateSimpleToolbar(hwndParent);
if (FAILED_UNEXPECTEDLY(hr))
return hr;
hr = SubclassWindow(m_hWnd);
if (FAILED_UNEXPECTEDLY(hr))
return hr;
return hr;
return S_OK;
}
@ -386,20 +307,83 @@ HRESULT CISFBand::CreateSimpleToolbar(HWND hWndParent)
}
STDMETHODIMP CISFBand::OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult)
{
/* switch (uMsg)
{
switch (uMsg)
{
case WM_COMMAND:
{
MessageBox(L"Button Clicked", L"Test", MB_OKCANCEL | MB_ICONINFORMATION);
TBBUTTON tb;
bool chk = SendMessage(m_hWnd, TB_GETBUTTON, LOWORD(wParam), (LPARAM)&tb);
if (chk)
SHInvokeDefaultCommand(m_hWnd, m_pISF, (LPITEMIDLIST)tb.dwData);
*theResult = TRUE;
break;
}
case WM_NOTIFY:
{
switch (((LPNMHDR)lParam)->code)
{
case NM_RCLICK:
{
HRESULT hr;
POINT pt = ((LPNMMOUSE)lParam)->pt;
CComPtr<IContextMenu> picm;
HMENU fmenu = CreatePopupMenu();
TBBUTTON tb;
bool chk = SendMessage(m_hWnd, TB_GETBUTTON, ((LPNMMOUSE)lParam)->dwItemSpec, (LPARAM)&tb);
LPITEMIDLIST pidl = (LPITEMIDLIST)tb.dwData;
if (chk)
{
ClientToScreen(&pt);
hr = m_pISF->GetUIObjectOf(m_hWnd, 1, &pidl, IID_NULL_PPV_ARG(IContextMenu, &picm));
if (FAILED_UNEXPECTEDLY(hr))
return hr;
hr = picm->QueryContextMenu(fmenu, 0, 1, 0x7FFF, CMF_DEFAULTONLY);
if (FAILED_UNEXPECTEDLY(hr))
return hr;
int id = TrackPopupMenuEx(fmenu, TPM_LEFTALIGN | TPM_BOTTOMALIGN | TPM_RETURNCMD, pt.x, pt.y, m_hWnd, 0);
if (id > 0)
{
CMINVOKECOMMANDINFOEX info = { 0 };
info.cbSize = sizeof(info);
info.fMask = CMIC_MASK_UNICODE | CMIC_MASK_PTINVOKE;
if (GetKeyState(VK_CONTROL) < 0)
{
info.fMask |= CMIC_MASK_CONTROL_DOWN;
}
if (GetKeyState(VK_SHIFT) < 0)
{
info.fMask |= CMIC_MASK_SHIFT_DOWN;
}
info.hwnd = m_hWnd;
info.lpVerb = MAKEINTRESOURCEA(id - 1);
info.lpVerbW = MAKEINTRESOURCEW(id - 0x7FFF);
info.nShow = SW_SHOWNORMAL;
info.ptInvoke = pt;
picm->InvokeCommand((LPCMINVOKECOMMANDINFO)&info);
}
}
DestroyMenu(fmenu);
*theResult = TRUE;
break;
}
default:
*theResult = FALSE;
}
break;
}
default:
*theResult = FALSE;
}
return DefSubclassProc(hWnd, uMsg, wParam, lParam);*/
UNIMPLEMENTED;
return E_NOTIMPL;
return S_OK;
}
STDMETHODIMP CISFBand::IsWindowOwner(HWND hWnd)

View file

@ -9,7 +9,7 @@
// COM class for cisfband
class CISFBand :
public CWindowImpl<CISFBand>,
public CWindow,
public CComCoClass<CISFBand>,
public CComObjectRootEx<CComMultiThreadModelNoCS>,
public IObjectWithSite,
@ -24,9 +24,9 @@ class CISFBand :
DWORD m_BandID;
CComPtr<IUnknown> m_Site;
// Toolbar
// Toolbar
CComPtr<IShellFolder> m_pISF;
PCIDLIST_ABSOLUTE m_pidl;
PCIDLIST_ABSOLUTE m_pidl;
// Menu
BOOL m_textFlag;
@ -39,8 +39,6 @@ public:
// Personal Methods
HRESULT CreateSimpleToolbar(HWND hWndParent);
LRESULT OnLButtonUp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnRButtonUp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
// IObjectWithSite
@ -182,11 +180,7 @@ public:
UINT uFlags
);
//*****************************************************************************************************
BEGIN_MSG_MAP(CISFBand)
MESSAGE_HANDLER(WM_LBUTTONUP, OnLButtonUp)
MESSAGE_HANDLER(WM_RBUTTONUP, OnRButtonUp)
END_MSG_MAP()
//*****************************************************************************************************
DECLARE_NOT_AGGREGATABLE(CISFBand)
DECLARE_PROTECT_FINAL_CONSTRUCT()

View file

@ -2,10 +2,10 @@
#define IDR_QCKLNCH 1001
#define IDM_POPUPMENU 2000
#define IDM_LARGE_ICONS 1
#define IDM_SMALL_ICONS 2
#define IDM_SHOW_TEXT 3
#define IDM_VIEW_MENU 4
#define IDM_POPUPMENU 2001
#define IDM_LARGE_ICONS 101
#define IDM_SMALL_ICONS 102
#define IDM_SHOW_TEXT 103
#define IDM_VIEW_MENU 104
#define IDS_BROWSEINFO_TITLE 100
#define IDS_BROWSEINFO_TITLE 201