⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 atlshellext.h

📁 remote debug and compile tools
💻 H
📖 第 1 页 / 共 4 页
字号:
      ATLTRACE2(atlTraceCOM, 0, _T("IEnumIDList::Next\n"));
      *rgelt = NULL; 
      if( pceltFetched ) *pceltFetched = 0;

      if( m_pidl.IsEmpty() ) return S_FALSE;

      m_iPos++;
      if( m_iPos > m_iCount ) return S_FALSE;

      *rgelt = CPidl::PidlCopyFirstItem(m_pCur);
      m_pCur = CPidl::PidlGetNextItem(m_pCur);
      if( (*rgelt!=NULL)  && ((*rgelt)->mkid.cb!=0) ) { 
          if( pceltFetched!=NULL ) *pceltFetched = 1; 
          return S_OK; 
      }

      return E_OUTOFMEMORY; 
   }   

   STDMETHOD(Reset)(void)
   { 
      ATLTRACE2(atlTraceCOM, 0, _T("IEnumIDList::Reset\n"));
      m_iPos = 0;
      m_pCur = m_pidl;
      return S_OK; 
   }

   STDMETHOD(Skip)(ULONG /*celt*/)
   {
      ATLTRACENOTIMPL(_T("IEnumIDList::Skip"));
   }

   STDMETHOD(Clone)(IEnumIDList ** /*ppEnum*/)
   {
      ATLTRACENOTIMPL(_T("IEnumIDList::Clone"));
   }

public:
   CPidl m_pidl;
   LPCITEMIDLIST m_pCur;
   UINT m_iCount; 
   UINT m_iPos;
};


//////////////////////////////////////////////////////////////////////////////
// IShellFolderImpl

#define GET_SHGDN_FOR(dwFlags)         ((DWORD)dwFlags & (DWORD)0x0000FF00)
#define GET_SHGDN_RELATION(dwFlags)    ((DWORD)dwFlags & (DWORD)0x000000FF)

template <class T, typename DataStruct>
class ATL_NO_VTABLE IShellFolderImpl : 
   public IShellFolder,
   public IPersistFolder,
   public CPidl
{
public:

   // IPersistFolder

   STDMETHOD(GetClassID)(CLSID *pClassID)
   {
      ATLTRACE2(atlTraceCOM, 0, _T("IPersistFolder::GetClassID\n"));
      ATLASSERT(pClassID);
      if( pClassID==NULL ) return E_POINTER;
      *pClassID = T::GetObjectCLSID();
      return S_OK;
   }
  
   STDMETHOD(Initialize)(LPCITEMIDLIST pList)
   {
      ATLTRACE2(atlTraceCOM, 0, _T("IPersistFolder::Initialize\n"));
      ATLASSERT(pList);
      if( pList==NULL ) return E_INVALIDARG;
      Copy(pList);
      return S_OK;
   }

   // IShellFolder

   STDMETHOD(EnumObjects)(HWND, DWORD, LPENUMIDLIST *ppRetVal)
   {
      ATLTRACE2(atlTraceCOM, 0, _T("IShellFolder::EnumObjects\n"));
      ATLASSERT(ppRetVal);
      // Return empty collection
      DataStruct v[1];
      v[0].cb = 0;
      HRESULT Hr;
      CComObject<CPidlEnum> *pEnum;
      Hr = CComObject<CPidlEnum>::CreateInstance(&pEnum);
      if( FAILED(Hr) ) return Hr;
      Hr = pEnum->_Init((LPITEMIDLIST)v, 1);
      if( FAILED(Hr) ) return Hr;
      Hr = pEnum->QueryInterface(IID_IEnumIDList,(LPVOID *)ppRetVal);
      if( FAILED(Hr) ) return Hr;
      return S_OK;
   }

   STDMETHOD(BindToObject)(LPCITEMIDLIST /*pidl*/, LPBC, REFIID /*riid*/, LPVOID *ppRetVal)
   {
      // Subfolders not implemented
      *ppRetVal = NULL;
      ATLTRACENOTIMPL(_T("IShellFolder::BindToObject"));
   }

   STDMETHOD(BindToStorage)(LPCITEMIDLIST, LPBC, REFIID, LPVOID *ppRetVal)
   {
      *ppRetVal = NULL;
      ATLTRACENOTIMPL(_T("IShellFolder::BindToStorage"));
   }

   STDMETHOD(CreateViewObject)(HWND /*hwndOwner*/, REFIID riid, LPVOID *ppRetVal )
   {
      ATLTRACE2(atlTraceCOM, 0, _T("IShellFolder::CreateViewObject\n"));
      ATLASSERT(!::IsBadReadPtr(&riid,sizeof(IID)));
      if( riid != IID_IShellView ) return E_NOINTERFACE;
      T *pT = static_cast<T*>(this);
      return pT->_CreateShellFolderView(ppRetVal);
   }

   STDMETHOD(GetUIObjectOf)(HWND, UINT, LPCITEMIDLIST*, REFIID, LPUINT, LPVOID*)
   {
      ATLTRACE2(atlTraceCOM, 0, _T("IShellFolder::GetUIObjectOf\n"));
      return E_NOINTERFACE;
   }

   STDMETHOD(GetDisplayNameOf)(LPCITEMIDLIST, DWORD, LPSTRRET)
   {
      ATLTRACENOTIMPL(_T("IShellFolder::GetDisplayNameOf"));
   }

   STDMETHOD(GetAttributesOf)(UINT, LPCITEMIDLIST*, LPDWORD rgfInOut)
   {
      ATLTRACE2(atlTraceCOM, 0, _T("IShellFolder::GetAttributesOf\n"));      
      *rgfInOut = 0;
      return S_OK;
   }

   STDMETHOD(ParseDisplayName)(HWND, LPBC, LPOLESTR, LPDWORD, LPITEMIDLIST* ppList, LPDWORD)
   {
      *ppList = NULL;
      ATLTRACENOTIMPL(_T("IShellFolder::ParseDisplayName"));
   }

   STDMETHOD(SetNameOf)(HWND, LPCITEMIDLIST, LPCOLESTR, DWORD, LPITEMIDLIST*)
   {
      ATLTRACENOTIMPL(_T("IShellFolder::SetNameOf"));
   }

   STDMETHOD(CompareIDs)(LPARAM, LPCITEMIDLIST, LPCITEMIDLIST)
   {
      ATLTRACENOTIMPL(_T("IShellFolder::CompareIDs"));
   }

   HRESULT _CreateShellFolderView(LPVOID *ppvObj)
   {
      ATLTRACENOTIMPL(_T("IShellFolder::_CreateShellFolderView"));
   }

};


//////////////////////////////////////////////////////////////////////////////
// IShellViewImpl

template <class T>
class ATL_NO_VTABLE IShellViewImpl : 
   public IShellView2
{
public:
   enum { IDC_LISTVIEW = 123 };

   BEGIN_MSG_MAP(IShellViewImpl<T>)
      MESSAGE_HANDLER(WM_CREATE, OnCreate)
      MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
      MESSAGE_HANDLER(WM_KILLFOCUS, OnKillFocus)
      MESSAGE_HANDLER(WM_SIZE, OnSize)
      MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChange)
      MESSAGE_HANDLER(WM_INITMENUPOPUP, OnInitMenu)
      MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground)
      NOTIFY_CODE_HANDLER(NM_SETFOCUS, OnNotifySetFocus)
      NOTIFY_CODE_HANDLER(NM_KILLFOCUS, OnNotifyKillFocus)
   END_MSG_MAP()

   IShellViewImpl() :
      m_pShellBrowser(NULL), m_uState(SVUIA_DEACTIVATE), m_hWnd(NULL), m_hwndList(NULL)
   {
      ZeroMemory(&m_ShellFlags,sizeof(m_ShellFlags));
      m_dwListViewStyle = WS_TABSTOP | 
                          WS_VISIBLE |
                          WS_CHILD | 
                          WS_BORDER | 
                          LVS_REPORT | 
                          LVS_NOSORTHEADER |
                          LVS_SHAREIMAGELISTS;
   }

public:
   const MSG *m_pCurrentMsg;
   HWND m_hWnd;
   HWND m_hwndList;
   DWORD m_dwListViewStyle;
   //
   FOLDERSETTINGS m_FolderSettings;
   SHELLFLAGSTATE m_ShellFlags;
   LPSHELLBROWSER m_pShellBrowser;
   UINT m_uState;

public:
   // IOleWindow
   
   STDMETHOD(GetWindow)(HWND *phWnd)
   {
      ATLTRACE2(atlTraceCOM, 0, _T("IOleWindow::GetWindow\n"));
      ATLASSERT(phWnd);
      ATLASSERT(::IsWindow(m_hWnd));
      *phWnd = m_hWnd;
      return S_OK;
   }

   STDMETHOD(ContextSensitiveHelp)(BOOL)
   {
      ATLTRACENOTIMPL(_T("IOleWindow::ContextSesitiveHelp"));
   }

   // IShellView

   STDMETHOD(TranslateAccelerator)(LPMSG /*lpmsg*/)
   {
      return E_NOTIMPL;
   }

   STDMETHOD(Refresh)(void)
   {
      ATLTRACE2(atlTraceCOM, 0, _T("IShellView::Refresh\n"));
      ATLASSERT(::IsWindow(m_hwndList));
      // Empty the list
      ListView_DeleteAllItems(m_hwndList);
      // Refill the list
      T *pT = static_cast<T*>(this);
      pT->_FillListView();
      return S_OK;
   }

   STDMETHOD(AddPropertySheetPages)(
      DWORD /*dwReserved*/,
      LPFNADDPROPSHEETPAGE /*lpfn*/, 
      LPARAM /*lParam*/)
   {
      ATLTRACENOTIMPL(_T("IShellView::AddPropertySheetPages"));
   }

   STDMETHOD(SelectItem)(LPCITEMIDLIST /*pidlItem*/, UINT /*uFlags*/)
   {
      ATLTRACENOTIMPL(_T("IShellView::SelectItem"));
   }

   STDMETHOD(GetItemObject)(UINT /*uItem*/, REFIID /*riid*/, LPVOID* ppRetVal)
   {
      ATLASSERT(ppRetVal);
      ppRetVal;
      ATLTRACENOTIMPL(_T("IShellView::GetItemObject"));
   }

   STDMETHOD(EnableModeless)(BOOL /*fEnable*/)
   {
      ATLTRACENOTIMPL(_T("IShellView::EnableModeless"));
   }

   STDMETHOD(GetCurrentInfo)(LPFOLDERSETTINGS lpFS)
   {
      ATLTRACE2(atlTraceCOM, 0, _T("IShellView::GetCurrentInfo\n"));
      ATLASSERT(lpFS);
      *lpFS = m_FolderSettings;
      return S_OK;
   }

   STDMETHOD(UIActivate)(UINT uState)
   {
      ATLTRACE2(atlTraceCOM, 0, _T("IShellView::UIActivate (%d)\n"), uState);
      ATLASSERT(m_pShellBrowser);
      // Only do this if we are active
      if( m_uState==uState ) return S_OK;      
      // _ViewActivate() handles merging of menus etc
      T *pT = static_cast<T*>(this);
      if( SVUIA_ACTIVATE_FOCUS==uState ) ::SetFocus(m_hwndList);
      pT->_ViewActivate(uState);
      if( uState != SVUIA_DEACTIVATE) {
         // Update the status bar: set 'parts' and change text
         LRESULT lResult;
         int nPartArray[1] = { -1 };
         m_pShellBrowser->SendControlMsg(FCW_STATUS, SB_SETPARTS, 1, (LPARAM)nPartArray, &lResult);
         // Set the statusbar text to the default description.
         // The string resource IDS_DESCRIPTION must be defined!
         TCHAR szName[128];
         ::LoadString(_Module.GetResourceInstance(), IDS_DESCRIPTION, szName, sizeof(szName)/sizeof(TCHAR));
         m_pShellBrowser->SendControlMsg(FCW_STATUS, SB_SETTEXT, 0, (LPARAM)szName, &lResult);
      }
      return S_OK;
   }

   STDMETHOD(CreateViewWindow)(
      IShellView* /*lpPrevView*/,
      LPCFOLDERSETTINGS pFS, 
      IShellBrowser *pSB,
      RECT *prcView, 
      HWND *phWnd)
   {
      ATLTRACE2(atlTraceCOM, 0, _T("IShellView::CreateViewWindow\n"));
      ATLASSERT(prcView);
      ATLASSERT(pSB);
      ATLASSERT(pFS);
      ATLASSERT(phWnd);

      // Register the ClassName.
      // The ClassName comes from the string resource IDS_CLASSNAME!
      TCHAR szClassName[64];
      ::LoadString(_Module.GetResourceInstance(), IDS_CLASSNAME, szClassName, sizeof(szClassName)/sizeof(TCHAR));
      WNDCLASS wc = { 0 };
      *phWnd = NULL;
      // If our window class has not been registered, then do so
      if( !::GetClassInfo(_Module.GetModuleInstance(), szClassName, &wc) ) {
         wc.style          = 0;
         wc.lpfnWndProc    = (WNDPROC)WndProc;
         wc.cbClsExtra     = 0;
         wc.cbWndExtra     = 0;
         wc.hInstance      = _Module.GetModuleInstance();
         wc.hIcon          = NULL;
         wc.hCursor        = ::LoadCursor(NULL, IDC_ARROW);
         wc.hbrBackground  = (HBRUSH)(COLOR_WINDOW + 1);
         wc.lpszMenuName   = NULL;
         wc.lpszClassName  = szClassName; 
         if( !::RegisterClass(&wc) ) return E_FAIL;
      }

      // Set up the member variables
      m_pShellBrowser = pSB;
      m_FolderSettings = *pFS;
      m_ShellFlags.fWin95Classic = TRUE;
      m_ShellFlags.fShowAllObjects = TRUE;
      m_ShellFlags.fShowAttribCol = TRUE;

      // Get our parent window
      HWND hwndShell;
      m_pShellBrowser->GetWindow(&hwndShell);
      // Create host window
      T *pT = static_cast<T*>(this);
      *phWnd = ::CreateWindowEx(WS_EX_CONTROLPARENT,
                                szClassName,
                                NULL,
                                WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_TABSTOP,
                                prcView->left,
                                prcView->top,
                                prcView->right - prcView->left,
                                prcView->bottom - prcView->top,
                                hwndShell,
                                NULL,
                                _Module.GetModuleInstance(),
                                (LPVOID)pT);
      if(!*phWnd) return E_FAIL;

      pT->_MergeToolbar(SVUIA_ACTIVATE_FOCUS);

      m_pShellBrowser->AddRef();
      return S_OK;
   }

   STDMETHOD(DestroyViewWindow)(void)
   {
      ATLTRACE2(atlTraceCOM, 0, _T("IShellView::DestroyViewWindow\n"));
      ATLASSERT(m_pShellBrowser);

      // Make absolutely sure all our UI is cleaned up.
      UIActivate(SVUIA_DEACTIVATE);

      ::DestroyWindow(m_hWnd);

      // Release the shell browser object
      m_pShellBrowser->Release();
      return S_OK;
   }

   STDMETHOD(SaveViewState)(void)
   {
      return S_OK;
   }

   // IShellView2

   STDMETHOD(CreateViewWindow2)(LPSV2CVW2_PARAMS lpParams) 
   {
      ATLTRACE2(atlTraceCOM, 0, _T("IShellView::CreateViewWindow2\n"));
      return CreateViewWindow(lpParams->psvPrev, lpParams->pfs, lpParams->psbOwner, lpParams->prcView, &lpParams->hwndView);
   }
   
   STDMETHOD(GetView)(SHELLVIEWID* /*pvid*/, ULONG /*uView*/) 
   {
      ATLTRACENOTIMPL(_T("IShellView2::GetView"));
   }
   
   STDMETHOD(HandleRename)(LPCITEMIDLIST /*pidlNew*/) 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -