| 類型 | 容器 | 引入版本 | 典型用途 |
|---|---|---|---|
| Explorer Bar (垂直/水平) | IE / 總管 | IE4 | 搜尋、收藏夾、歷史、自訂資訊面板 |
| Tool Band | IE ReBar | IE5 | 單選工具列、自訂工具列 |
| Desk Band | Shell (工作列) | IE4 | 桌面浮動視窗、工作列工具列 |
IUnknown, IClassFactoryIDeskBand (繼承 IDockingWindow → IOleWindow)IObjectWithSiteIPersistStreamIInputObject (接受輸入焦點)、IContextMenu (右鍵選單)| Band 類型 | CATID |
|---|---|
| 垂直 Explorer Bar | CATID_InfoBand |
| 水平 Explorer Bar | CATID_CommBand |
| Desk Band | CATID_DeskBand |
Tool Band 不需 CATID,改在 HKLM\Software\Microsoft\Internet Explorer\Toolbar\{CLSID} 註冊。
BOOL RegisterCat(CLSID clsid, CATID catid) {
ICatRegister* pcr;
CoCreateInstance(CLSID_StdComponentCategoriesMgr, nullptr,
CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr);
HRESULT hr = pcr->RegisterClassImplCategories(clsid, 1, &catid);
pcr->Release();
return SUCCEEDED(hr);
}
STDMETHODIMP SetSite(IUnknown* punkSite) {
if (m_pSite) m_pSite->Release(), m_pSite = nullptr;
if (!punkSite) return S_OK;
IOleWindow* pWin;
if (SUCCEEDED(punkSite->QueryInterface(IID_IOleWindow, (void**)&pWin))) {
pWin->GetWindow(&m_hwndParent);
pWin->Release();
}
if (!m_hwndParent) return E_FAIL;
// 建立子視窗
CreateChildWindow();
// 取得 IInputObjectSite
punkSite->QueryInterface(IID_IInputObjectSite, (void**)&m_pSite);
return S_OK;
}
STDMETHODIMP GetBandInfo(DWORD dwBandID, DWORD dwViewMode, DESKBANDINFO* pdbi) {
m_dwBandID = dwBandID; m_dwViewMode = dwViewMode;
if (pdbi->dwMask & DBIM_MINSIZE) { pdbi->ptMinSize = {30, 30}; }
if (pdbi->dwMask & DBIM_MAXSIZE) { pdbi->ptMaxSize = {-1, -1}; }
if (pdbi->dwMask & DBIM_TITLE) { lstrcpyW(pdbi->wszTitle, L"My Band"); }
if (pdbi->dwMask & DBIM_MODEFLAGS) { pdbi->dwModeFlags = DBIMF_VARIABLEHEIGHT; }
return S_OK;
}
子視窗處理 WM_PAINT、WM_COMMAND、WM_SETFOCUS/KILLFOCUS (通知 IInputObjectSite::OnFocusChangeIS)。
BandObjs.cpp:DllMain/DllGetClassObject/DllRegisterServerClsFact.cpp:標準類別工廠InfoBand.cpp:垂直 Explorer Bar 實作CommBand.cpp:水平 Explorer BarDeskBand.cpp:Desk Band