KumaBarBand.h


#pragma once
#include "ToolbarKuma.h"
#include "resource.h"
#include "ToolbarWindow.h"

#include <comsvcs.h>
#include <shlguid.h>
#include <shlobj.h>

// CKumaBarBand

//IDispatchImplを継承
//IEツールバーを作る際は、IDeskBandとかIObjectWithSiteを継承しないといけない
//そういったインターフェースを実装しておけば、IEが呼んでくれる感じになる
class ATL_NO_VTABLE CKumaBarBand :
    public CComObjectRootEx<CComSingleThreadModel>,
    public CComCoClass<CKumaBarBand, &CLSID_KumaBarBand>,
    public IDeskBand,
    public IObjectWithSiteImpl<CKumaBarBand>,
    public CWindowImpl<CKumaBarBand>,
    public IDispatchImpl<IKumaBarBand, &IID_IKumaBarBand, &LIBID_ToolbarKumaLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
{
public:
    CKumaBarBand();
    ~CKumaBarBand();


    //FinalConstruct の実行中、集約される内部オブジェクトが参照カウントをインクリメントし、
    //その後カウントを 0 にデクリメントした場合でも、オブジェクトが削除されないように保護します。
    //とMSDNに書いてあった
    DECLARE_PROTECT_FINAL_CONSTRUCT()

    HRESULT FinalConstruct()
    {
        return S_OK;
    }

    void FinalRelease()
    {
    }


//レジストリファイル(KumaBarBand.rgs)を読み込んで登録をしてくれる
DECLARE_REGISTRY_RESOURCEID(IDR_KUMABARBAND)

//Objectは集約できないとか書いてあった
//良く分からない、知らない、小麦粉か何かだ
DECLARE_NOT_AGGREGATABLE(CKumaBarBand)

//COMマップ
//ここに書いておけば、QueryInterfaceを通してインターフェイスをクライアントに公開できるそうな
//後でIDeskBandとかをここへ登録する
BEGIN_COM_MAP(CKumaBarBand)
    COM_INTERFACE_ENTRY(IKumaBarBand)
    COM_INTERFACE_ENTRY(IOleWindow)
    COM_INTERFACE_ENTRY_IID(IID_IDockingWindow, IDockingWindow)
    COM_INTERFACE_ENTRY_IID(IID_IDeskBand, IDeskBand)
    COM_INTERFACE_ENTRY(IObjectWithSite)
    COM_INTERFACE_ENTRY(IDispatch)
END_COM_MAP()

private:
    CToolbarWindow m_ToolbarWnd;
    HWND m_ParentHWnd;//なんとなくここ削除

//CWindowImpl
public:
    DECLARE_WND_CLASS(NULL)
    BEGIN_MSG_MAP(CKumaBarBand)
        MESSAGE_HANDLER(WM_CREATE, OnCreate)
        CHAIN_MSG_MAP_MEMBER(m_ToolbarWnd) //この2行追加
    END_MSG_MAP()

LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); //これも追加

// IDeskBand
public:
    STDMETHOD(GetBandInfo)(DWORD dwBandID, DWORD dwViewMode, DESKBANDINFO* pdbi);

// IOleWindow
public:
    STDMETHOD(GetWindow)(HWND* phwnd);
    STDMETHOD(ContextSensitiveHelp)(BOOL fEnterMode);

// IDockingWindow
public:
    STDMETHOD(ShowDW)(BOOL fShow);
    STDMETHOD(CloseDW)(unsigned long dwReserved);
    STDMETHOD(ResizeBorderDW)(const RECT* prcBorder, IUnknown* punkToolbarSite, BOOL fReserved);


};

//外からRegisterServerが呼ばれた際に、
//ここで設定した内容(KumaBarBand.rgs)も自動でレジストリ登録してくれるらしい
//UnregisterServerも同じく
OBJECT_ENTRY_AUTO(__uuidof(KumaBarBand), CKumaBarBand)

戻る

コメントスペース