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;
}
戻る
コメントスペース