mirror of
https://github.com/reactos/reactos.git
synced 2024-07-29 23:58:44 +00:00
[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:
parent
c8c4bcfa52
commit
fe273d3531
|
@ -7,7 +7,6 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "precomp.h"
|
#include "precomp.h"
|
||||||
#include <mshtmcid.h>
|
|
||||||
#include <commoncontrols.h>
|
#include <commoncontrols.h>
|
||||||
|
|
||||||
#define GET_X_LPARAM(lp) ((int)(short)LOWORD(lp))
|
#define GET_X_LPARAM(lp) ((int)(short)LOWORD(lp))
|
||||||
|
@ -37,81 +36,7 @@ CISFBand::~CISFBand()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
// *** CWindowImpl ***
|
// Toolbar
|
||||||
// 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
|
|
||||||
HRESULT CISFBand::CreateSimpleToolbar(HWND hWndParent)
|
HRESULT CISFBand::CreateSimpleToolbar(HWND hWndParent)
|
||||||
{
|
{
|
||||||
// Declare and initialize local constants.
|
// Declare and initialize local constants.
|
||||||
|
@ -159,7 +84,7 @@ HRESULT CISFBand::CreateSimpleToolbar(HWND hWndParent)
|
||||||
StrRetToBuf(&stret, pidl, sz, _countof(sz));
|
StrRetToBuf(&stret, pidl, sz, _countof(sz));
|
||||||
|
|
||||||
TBBUTTON tb = { MAKELONG(index, 0), i, TBSTATE_ENABLED, buttonStyles,{ 0 }, (DWORD_PTR)pidl, (INT_PTR)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);
|
SendMessage(m_hWnd, TB_INSERTBUTTONW, i, (LPARAM)&tb);
|
||||||
//CoTaskMemFree(pidl);
|
//CoTaskMemFree(pidl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -191,10 +116,6 @@ HRESULT CISFBand::CreateSimpleToolbar(HWND hWndParent)
|
||||||
if (FAILED_UNEXPECTEDLY(hr))
|
if (FAILED_UNEXPECTEDLY(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
hr = SubclassWindow(m_hWnd);
|
|
||||||
if (FAILED_UNEXPECTEDLY(hr))
|
|
||||||
return hr;
|
|
||||||
|
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -387,19 +308,82 @@ HRESULT CISFBand::CreateSimpleToolbar(HWND hWndParent)
|
||||||
|
|
||||||
STDMETHODIMP CISFBand::OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult)
|
STDMETHODIMP CISFBand::OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult)
|
||||||
{
|
{
|
||||||
/* switch (uMsg)
|
switch (uMsg)
|
||||||
{
|
{
|
||||||
case WM_COMMAND:
|
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;
|
break;
|
||||||
}
|
}
|
||||||
|
default:
|
||||||
|
*theResult = FALSE;
|
||||||
}
|
}
|
||||||
return DefSubclassProc(hWnd, uMsg, wParam, lParam);*/
|
|
||||||
|
|
||||||
UNIMPLEMENTED;
|
return S_OK;
|
||||||
return E_NOTIMPL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
STDMETHODIMP CISFBand::IsWindowOwner(HWND hWnd)
|
STDMETHODIMP CISFBand::IsWindowOwner(HWND hWnd)
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
|
|
||||||
// COM class for cisfband
|
// COM class for cisfband
|
||||||
class CISFBand :
|
class CISFBand :
|
||||||
public CWindowImpl<CISFBand>,
|
public CWindow,
|
||||||
public CComCoClass<CISFBand>,
|
public CComCoClass<CISFBand>,
|
||||||
public CComObjectRootEx<CComMultiThreadModelNoCS>,
|
public CComObjectRootEx<CComMultiThreadModelNoCS>,
|
||||||
public IObjectWithSite,
|
public IObjectWithSite,
|
||||||
|
@ -39,8 +39,6 @@ public:
|
||||||
|
|
||||||
// Personal Methods
|
// Personal Methods
|
||||||
HRESULT CreateSimpleToolbar(HWND hWndParent);
|
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
|
// IObjectWithSite
|
||||||
|
|
||||||
|
@ -183,10 +181,6 @@ public:
|
||||||
);
|
);
|
||||||
|
|
||||||
//*****************************************************************************************************
|
//*****************************************************************************************************
|
||||||
BEGIN_MSG_MAP(CISFBand)
|
|
||||||
MESSAGE_HANDLER(WM_LBUTTONUP, OnLButtonUp)
|
|
||||||
MESSAGE_HANDLER(WM_RBUTTONUP, OnRButtonUp)
|
|
||||||
END_MSG_MAP()
|
|
||||||
|
|
||||||
DECLARE_NOT_AGGREGATABLE(CISFBand)
|
DECLARE_NOT_AGGREGATABLE(CISFBand)
|
||||||
DECLARE_PROTECT_FINAL_CONSTRUCT()
|
DECLARE_PROTECT_FINAL_CONSTRUCT()
|
||||||
|
|
|
@ -2,10 +2,10 @@
|
||||||
|
|
||||||
#define IDR_QCKLNCH 1001
|
#define IDR_QCKLNCH 1001
|
||||||
|
|
||||||
#define IDM_POPUPMENU 2000
|
#define IDM_POPUPMENU 2001
|
||||||
#define IDM_LARGE_ICONS 1
|
#define IDM_LARGE_ICONS 101
|
||||||
#define IDM_SMALL_ICONS 2
|
#define IDM_SMALL_ICONS 102
|
||||||
#define IDM_SHOW_TEXT 3
|
#define IDM_SHOW_TEXT 103
|
||||||
#define IDM_VIEW_MENU 4
|
#define IDM_VIEW_MENU 104
|
||||||
|
|
||||||
#define IDS_BROWSEINFO_TITLE 100
|
#define IDS_BROWSEINFO_TITLE 201
|
||||||
|
|
Loading…
Reference in a new issue