首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

Windows Band 對象完整指南:Explorer Bar、Tool Band、Desk Band 建立與註冊

     編輯:關於VC++

三種 Band 類型

類型容器引入版本典型用途
Explorer Bar (垂直/水平)IE / 總管IE4搜尋、收藏夾、歷史、自訂資訊面板
Tool BandIE ReBarIE5單選工具列、自訂工具列
Desk BandShell (工作列)IE4桌面浮動視窗、工作列工具列

必須實作的 COM 介面

  • IUnknown, IClassFactory
  • IDeskBand (繼承 IDockingWindow → IOleWindow)
  • IObjectWithSite
  • IPersistStream
  • 可選:IInputObject (接受輸入焦點)、IContextMenu (右鍵選單)

關鍵註冊差異:CATID 決定類型與容器

Band 類型CATID
垂直 Explorer BarCATID_InfoBand
水平 Explorer BarCATID_CommBand
Desk BandCATID_DeskBand

Tool Band 不需 CATID,改在 HKLM\Software\Microsoft\Internet Explorer\Toolbar\{CLSID} 註冊。

CATID 註冊代碼

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);
}

IObjectWithSite::SetSite 關鍵流程

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;
}

IDeskBand::GetBandInfo 回應容器查詢

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/DllRegisterServer
  • ClsFact.cpp:標準類別工廠
  • InfoBand.cpp:垂直 Explorer Bar 實作
  • CommBand.cpp:水平 Explorer Bar
  • DeskBand.cpp:Desk Band
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved