windows-nt/Source/XPSP1/NT/shell/explorer/desktop2/deskhost.h
2020-09-26 16:20:57 +08:00

257 lines
9.4 KiB
C++

#ifndef _DESKHOST_H_
#define _DESKHOST_H_
#include <exdisp.h>
#include <mshtml.h>
#include "dpa.h"
#include "../startmnu.h"
#include <cowsite.h>
#define WC_DV2 TEXT("DV2ControlHost")
// These are in WM_APP range because IsDialogMessage uses
// the WM_USER range and we used to use IsDialogMessage to get our focus
// management right.
#define DHM_DISMISS (WM_APP+0)
#define DesktopHost_Dismiss(hwnd) SendMessage(hwnd, DHM_DISMISS, 0, 0)
EXTERN_C HBITMAP CreateMirroredBitmap(HBITMAP hbm);
class CPopupMenu
{
CPopupMenu() : _cRef(1) { }
~CPopupMenu();
public:
friend HRESULT CPopupMenu_CreateInstance(IShellMenu *psm,
IUnknown *punkSite,
HWND hwnd,
CPopupMenu **ppmOut);
void AddRef() { _cRef++; }
void Release() { if (--_cRef == 0) delete this; }
BOOL IsSame(IShellMenu *psm)
{
return SHIsSameObject(_psm, psm);
}
// Wrapped method calls
HRESULT Invalidate()
{ return _psm->InvalidateItem(NULL, SMINV_REFRESH); }
HRESULT TranslateMenuMessage(MSG *pmsg, LRESULT *plRet)
{ return _pmb->TranslateMenuMessage(pmsg, plRet); }
HRESULT OnSelect(DWORD dwSelectType)
{ return _pmp->OnSelect(dwSelectType); }
HRESULT IsMenuMessage(MSG *pmsg)
{ return _pmb->IsMenuMessage(pmsg); }
HRESULT Popup(RECT *prcExclude, DWORD dwFlags);
private:
HRESULT Initialize(IShellMenu *psm, IUnknown *punkSite, HWND hwnd);
private:
LONG _cRef;
IMenuPopup * _pmp;
IMenuBand * _pmb;
IShellMenu * _psm;
};
class CDesktopHost
: public CUnknown
, public IMenuPopup
, public IMenuBand
, public ITrayPriv2
, public IServiceProvider
, public IOleCommandTarget
, public CObjectWithSite
{
friend class CDeskHostShellMenuCallback;
private:
enum {
IDT_MENUCHANGESEL = 1,
};
enum {
NEWAPP_OFFER_COUNT = 3, // offer up to 3 times
};
private:
HWND _hwnd; // window handle
HTHEME _hTheme;
HWND _hwndChildFocus; // which child last had focus?
IMenuPopup * _pmpTracking; // The popup menu we are tracking
IMenuBand * _pmbTracking; // The menuband we are tracking
LPARAM _itemTracking; // The item that owns the current popup menu
HWND _hwndTracking; // The child window that owns _itemTracking
LPARAM _itemAltTracking; // The item the user has hot-tracked to while viewing a different item's popup menu
HWND _hwndAltTracking; // The child window that owns _itemAltTracking
CPopupMenu * _ppmPrograms; // Cached Programs menu
CPopupMenu * _ppmTracking; // The one that is currently popped up
HWND _hwndNewHandler; // Which window knows which apps are new?
RECT _rcDesired; // The layout gets to specify a desired size
RECT _rcActual; // And then the components can request additional resizing
int _iOfferNewApps; // number of times we should suggest to the
// user that they look at the app that was installed
UINT _wmDragCancel; // user dragged an item off of a submenu
BOOL _fOfferedNewApps; // did we offer new apps this time?
BOOL _fOpen; // Is the menu open for business?
BOOL _fMenuBlocked; // Is menu mode temporarily blocked?
BOOL _fMouseEntered; // Is the mouse inside our window?
BOOL _fAutoCascade; // Should we auto-open on hover?
BOOL _fClipped; // Did we have to pitch some items to fit on screen?
BOOL _fWarnedClipped; // Has the user been warned that it's been clipped?
BOOL _fDismissOnlyPopup; // Are we only dismissing the popup?
HWND _hwndLastMouse; // HWND that received last mousemove message
LPARAM _lParamLastMouse; // LPARAM of last mousemove message
HWND _hwndClipBalloon; // HWND of "you've been clipped!" balloon tip
IFadeTask * _ptFader; // For cool selection fading
SIZE _sizWindowPrev; // previous size of window when we popped up
STARTPANELMETRICS _spm; // start panel metrics
HBITMAP _hbmCachedSnapshot; // This bitmap reflects the current look of the start menu, ready to show!
public:
// *** IUnknown ***
STDMETHODIMP QueryInterface(REFIID riid, void** ppvObj);
STDMETHODIMP_(ULONG) AddRef(void) { return CUnknown::AddRef(); }
STDMETHODIMP_(ULONG) Release(void) { return CUnknown::Release(); }
// *** IOleWindow methods ***
STDMETHODIMP GetWindow(HWND * phwnd) { *phwnd = _hwnd; return S_OK; }
STDMETHODIMP ContextSensitiveHelp(BOOL bEnterMode) { return E_NOTIMPL; }
// *** IDeskBar methods ***
STDMETHODIMP SetClient(IUnknown* punk) { return E_NOTIMPL; };
STDMETHODIMP GetClient(IUnknown** ppunkClient) { return E_NOTIMPL; }
STDMETHODIMP OnPosRectChangeDB (LPRECT prc) { return E_NOTIMPL; }
// *** IMenuPopup methods ***
STDMETHODIMP Popup(POINTL *ppt, RECTL *prcExclude, DWORD dwFlags);
STDMETHODIMP OnSelect(DWORD dwSelectType);
STDMETHODIMP SetSubMenu(IMenuPopup* pmp, BOOL fSet) { return E_NOTIMPL; }
// *** IMenuBand methods ***
STDMETHODIMP IsMenuMessage(MSG *pmsg);
STDMETHODIMP TranslateMenuMessage(MSG *pmsg, LRESULT *plres);
// *** ITrayPriv methods ***
STDMETHODIMP ExecItem(IShellFolder *psf, LPCITEMIDLIST pidl) { return E_NOTIMPL; }
STDMETHODIMP GetFindCM(HMENU hmenu, UINT idFirst, UINT idLast, IContextMenu **ppcmFind) { return E_NOTIMPL; }
STDMETHODIMP GetStaticStartMenu(HMENU* phmenu) { return E_NOTIMPL; }
// *** ITrayPriv2 methods ***
STDMETHODIMP ModifySMInfo(IN LPSMDATA psmd, IN OUT SMINFO *psminfo);
// *** IServiceProvider ***
STDMETHODIMP QueryService(REFGUID guidService, REFIID riid, void **ppvObj);
// *** IOleCommandTarget ***
STDMETHODIMP QueryStatus(const GUID * pguidCmdGroup,
ULONG cCmds, OLECMD rgCmds[], OLECMDTEXT *pcmdtext);
STDMETHODIMP Exec(const GUID * pguidCmdGroup,
DWORD nCmdID, DWORD nCmdexecopt,
VARIANTARG *pvarargIn, VARIANTARG *pvarargOut);
// *** IObjectWithSite ***
STDMETHODIMP SetSite(IUnknown *punkSite);
public:
HRESULT Initialize();
HRESULT Build();
private:
HWND _Create();
HRESULT _Popup(POINT *ppt, RECT *prcExclude, DWORD dwFlags);
private:
~CDesktopHost();
static LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
// Window Messages
void OnCreate(HWND hwnd);
void OnDestroy();
void OnPaint(HDC hdc, BOOL bBackground);
void OnSetFocus(HWND hwndLose);
void OnContextMenu(LPARAM lParam);
void _OnDismiss(BOOL bDestroy);
void _OnMenuChangeSel();
LRESULT OnHaveNewItems(NMHDR *pnm);
LRESULT OnCommandInvoked(NMHDR *pnm);
LRESULT OnFilterOptions(NMHDR *pnm);
LRESULT OnTrackShellMenu(NMHDR *pnm);
void OnSeenNewItems();
LRESULT OnNeedRepaint();
HRESULT TranslatePopupMenuMessage(MSG *pmsg, LRESULT *plres);
// Other helpers
BOOL Register();
void LoadPanelMetrics();
void LoadResourceInt(UINT ids, LONG *pl);
BOOL AddWin32Controls();
BOOL _TryShowBuffered();
void _DismissTrackShellMenu();
void _CleanupTrackShellMenu(); // release + UI-related goo
void _DismissMenuPopup();
BOOL _IsDialogMessage(MSG *pmsg);
BOOL _DlgNavigateArrow(HWND hwndStart, MSG *pmsg);
BOOL _DlgNavigateChar(HWND hwndStart, MSG *pmsg);
HWND _FindNextDlgChar(HWND hwndStart, SMNDIALOGMESSAGE *pnmdm, UINT snmdm);
void _EnableKeyboardCues();
void _MaybeOfferNewApps();
BOOL _ShouldIgnoreFocusChange(HWND hwndFocusRecipient);
void _FilterMouseMove(MSG *pmsg, HWND hwndTarget);
void _FilterMouseLeave(MSG *pmsg, HWND hwndTarget);
void _FilterMouseHover(MSG *pmsg, HWND hwndTarget);
void _RemoveSelection();
void _SubclassTrackShellMenu(IShellMenu *psm);
HRESULT _MenuMouseFilter(LPSMDATA psmd, BOOL fRemove, LPMSG pmsg);
typedef HWND (WINAPI *GETNEXTDLGITEM)(HWND, HWND, BOOL);
HWND _DlgFindItem(HWND hwndStart, SMNDIALOGMESSAGE *pnmdm, UINT smndm,
GETNEXTDLGITEM GetNextDlgItem, UINT fl);
LRESULT _FindChildItem(HWND hwnd, SMNDIALOGMESSAGE *pnmdm, UINT smndm);
void _ReadPaneSizeFromTheme(SMPANEDATA *psmpd);
void _ComputeActualSize(MONITORINFO *pminfo, LPCRECT prcExclude);
void _ChoosePopupPosition(POINT *ppt, LPCRECT prcExclude, LPRECT prcWindow);
void _ReapplyRegion();
void _SaveChildFocus();
HWND _RestoreChildFocus();
void _MaybeShowClipBalloon();
void _DestroyClipBalloon();
};
#endif