KumaBarBand.cpp


// KumaBarBand.cpp : CKumaBarBand の実装

#include "stdafx.h"
#include "KumaBarBand.h"


// CKumaBarBand
    //コンストラクタ。とりあえず何もしない
    CKumaBarBand::CKumaBarBand()
    {
    }
    //デストラクタ。WindowのDestroy処理
    CKumaBarBand::~CKumaBarBand()
    {
        if ( IsWindow() )
            DestroyWindow();
    }


// IDeskBand
STDMETHODIMP CKumaBarBand::GetBandInfo(DWORD /* dwBandID */, DWORD /* dwViewMode */, DESKBANDINFO* pdbi)
{
    if (pdbi)
    {
        //ツールバーの最小サイズ
        if (pdbi->dwMask & DBIM_MINSIZE)
        {
            pdbi->ptMinSize.x = 100;
            pdbi->ptMinSize.y = 22;
        }
        //ツールバーの最大サイズ
        //0なら未設定
        if (pdbi->dwMask & DBIM_MAXSIZE)
        {
            pdbi->ptMaxSize.x = -1;
            pdbi->ptMaxSize.y = 22;
        }
        //分からない、知らない
        if (pdbi->dwMask & DBIM_INTEGRAL)
        {
            pdbi->ptIntegral.x = 1;
            pdbi->ptIntegral.y = 1;
        }
        //小麦粉か何かだ
        if (pdbi->dwMask & DBIM_ACTUAL)
        {
            pdbi->ptActual.x = -1;
            pdbi->ptActual.y = 22;
        }
        if (pdbi->dwMask & DBIM_TITLE)
        {
            //ツールバー左側に表示されるタイトル文字列
            wcscpy_s(pdbi->wszTitle, _T("KUMA"));
        }
        if( pdbi->dwMask & DBIM_BKCOLOR )
        {
            //こう書いておけば、デフォルトの背景色になってくれるらしい
            pdbi->dwMask &= ~DBIM_BKCOLOR;
        }
        if (pdbi->dwMask & DBIM_MODEFLAGS)
        {
            pdbi->dwModeFlags = 
                //他のサンプルの多くはこう書いていた
                DBIMF_NORMAL | DBIMF_USECHEVRON |
                //バーを表示する際に、必ず次の行にしてくれる指定だそうな
                DBIMF_BREAK;
        }
    }
    return S_OK;
}


// IOleWindow
STDMETHODIMP CKumaBarBand::GetWindow(HWND* phwnd)
{
    //親のWindowハンドルを捕まえる
    //子Windowを作る
    //その子供として、11節で作ったCToolbarWindowをCreateする
    //最後にCToolbarWindowのWindowハンドルを、phwndに放り込む
    //ということをこれからやります

    //既にCToolbarWindow(メンバ変数のm_ToolbarWndで保持)がCreateされていた場合は、
    //そのままm_ToolbarWndのハンドルを入れればOK
    if ( m_ToolbarWnd.IsWindow() )
    {
        *phwnd = m_ToolbarWnd.m_hWnd;
        return S_OK;
    }

    //IOleWindowの取得
    //IObjectWithSiteImplが、勝手にSetSiteしてくれた、m_spUnkSiteというメンバ変数がいます
    //これをCComQIPtrを使って、IOleWindowとして扱えるようにします
    //詳しい説明は、この辺りを参考にしました
    //http://www.hamusuta.net/openbbs/pc/prg/wtl.html#msg9
    CComQIPtr<IOleWindow, &IID_IOleWindow> sp_OleWindow(m_spUnkSite);

    //親Windowの取得
    //IOleWindowのGetWindowを使うと、親Windowのハンドルが取れます
    HWND hParentWnd;
    sp_OleWindow->GetWindow(&hParentWnd);

    //Window作成
    //さっき取ったハンドルの子として、WS_CHILDだけ指定したWindowを作ります
    //KBBandとかMotleyFoolで言うところのReflectionWindowです
    Create (hParentWnd, 0, 0, WS_CHILD);
    if ( ! IsWindow ( ) )
        return E_FAIL;

    //ツールバー作成
    //さっき作ったWindowのハンドル( = このクラスのハンドル = m_hWnd)の子として、
    //いい感じなスタイル指定をしてCreateをします
    m_ToolbarWnd.Create ( m_hWnd, 0, 0, 
        WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE |
        TBSTYLE_TOOLTIPS | TBSTYLE_FLAT | TBSTYLE_TRANSPARENT | TBSTYLE_LIST | TBSTYLE_CUSTOMERASE |
        CCS_TOP | CCS_NODIVIDER | CCS_NOPARENTALIGN | CCS_NORESIZE
    );
    if ( ! m_ToolbarWnd.IsWindow() )
        return E_FAIL;

    //最後に今作ったツールバーのハンドルを登録
    *phwnd = m_ToolbarWnd.m_hWnd;

    return S_OK;
}

STDMETHODIMP CKumaBarBand::ContextSensitiveHelp(BOOL /* fEnterMode */)
{
    return E_NOTIMPL;
}


// IDockingWindow
STDMETHODIMP CKumaBarBand::ShowDW(BOOL /* fShow */)
{
    //ツールバーのShowWindowを実行する
    //まだツールバーを作ってないので、何もしない

    return S_OK;
}

STDMETHODIMP CKumaBarBand::CloseDW(unsigned long /* dwReserved */)
{
    //CLOSE時の動作。ツールバーを非表示にする
    ShowDW(FALSE);

    return S_OK;
}

STDMETHODIMP CKumaBarBand::ResizeBorderDW(const RECT* /* prcBorder */, IUnknown* /* punkToolbarSite */, BOOL /* fReserved */)
{
    return E_NOTIMPL;
}

戻る

コメントスペース