我正在尝试在我的应用程序中实现类似资源管理器的框架。这也必须在WinXP下工作。
我在我的窗口类中实现了IShellBrowser
+我已经实现了IUnknown
接口。
我的课程资料:
IShellViewPtr m_shView;
HWND m_wndHolder;
CListViewCtrl view;
以下是WM_CREATE
处理程序
m_hWndClient = view.Create(m_hWnd, rcDefault, NULL,
WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS |
WS_CLIPCHILDREN, WS_EX_CLIENTEDGE); // view isn't null after it
CMessageLoop* pLoop = _Module.GetMessageLoop();
pLoop->AddMessageFilter(this);
pLoop->AddIdleHandler(this);
IShellFolderPtr pParentFolder;
ATLVERIFY(SHGetDesktopFolder(&pParentFolder) == S_OK); // OK
FOLDERSETTINGS fs;
fs.fFlags = FVM_DETAILS;
fs.ViewMode = FVM_LIST;
ATLVERIFY(pParentFolder->CreateViewObject(view, IID_IShellView, (void**)&m_shView) == S_OK); // OK
RECT r;
GetClientRect(&r);
ATLVERIFY(m_shView->CreateViewWindow(NULL, &fs, static_cast<IShellBrowser*>(this), &r, &m_wndHolder) == S_OK); // OK
ATLVERIFY(m_shView->UIActivate(SVUIA_ACTIVATE_NOFOCUS) == S_OK); // OK
应用程序启动后,我有类似资源管理器的框架。
我想处理双击事件,以便浏览框架中的文件夹。我希望双击后我会调用BrowseObject
的实现,但它不会发生。而不是在system explorer中打开此文件夹。
请帮忙。谢谢。
答案 0 :(得分:0)
我已经解决了这个问题。
首先,如果你的课,你必须IServiceProvider
接口。实施应如下所示:
QueryService( REFGUID guidService, REFIID riid, void __RPC_FAR *__RPC_FAR *ppvObject )
{
if (IID_IShellBrowser == riid)
{
*ppvObject = static_cast<IShellBrowser*>(this);
AddRef();
return S_OK;
}
*ppvObject = NULL;
return E_NOINTERFACE;
}
此外,您必须在IServiceProvider
方法中添加QueryInterface
支持。
STDMETHOD (QueryInterface)( REFIID riid, __RPC__deref_out void __RPC_FAR *__RPC_FAR *ppvObject)
{
if (!ppvObject)
return E_POINTER;
*ppvObject = NULL;
if ( riid == IID_IShellBrowser )
*ppvObject = static_cast<IShellBrowser*>(this);
else if ( riid == IID_IUnknown )
*ppvObject = static_cast<IUnknown*>(static_cast<IShellBrowser*>(this));
else if ( riid == IID_IServiceProvider )
*ppvObject = static_cast<IServiceProvider*>(this);
if (*ppvObject)
{
AddRef();
return S_OK;
}
return E_NOTIMPL;
}
在您继承IServiceProvider
之后,您无法仅使用IUnknown
将课程强加给static_cast<IUnknown*>(this)
,因此您需要像我一样写一些内容。
之后BrowseObject
应该被称为正常。