📄 atlshellext.h
字号:
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 + -