ToolbarButtonCtrl.cpp
#include "StdAfx.h"
#include "ToolbarButtonCtrl.h"
#include "const.h"
CToolbarButtonCtrl::CToolbarButtonCtrl ( )
{
}
CToolbarButtonCtrl::~CToolbarButtonCtrl(void)
{
ImageList_Destroy(m_hImageList);
}
//ATLのSendMessageみたく、HWNDを省略できるように
LRESULT CToolbarButtonCtrl::SendMessage ( UINT Msg, WPARAM wParam, LPARAM lParam )
{
return ::SendMessage ( m_hWnd, Msg, wParam, lParam );
}
//初期化処理
//このクラスを使用する前に、必ず行う
//ボタンを使う前に行うSendMessage処理とかをこなす
void CToolbarButtonCtrl::Init ( HWND hWnd )
{
m_hWnd = hWnd;
SendMessage(TB_SETEXTENDEDSTYLE, 0, (LPARAM)TBSTYLE_EX_MIXEDBUTTONS);
SendMessage(TB_BUTTONSTRUCTSIZE, sizeof(TBBUTTON), 0);
SendMessage(TB_SETMAXTEXTROWS, 1, 0L);
SendMessage(TB_SETEXTENDEDSTYLE, 0, (LPARAM)TBSTYLE_EX_DRAWDDARROWS);
m_hImageList = ImageList_Create(16,16, ILC_COLOR16, 1, 0);
SendMessage ( TB_SETIMAGELIST, 0, (LPARAM)m_hImageList );
}
//ボタン追加
void CToolbarButtonCtrl::AddButton ( int idCommand, wchar_t* string, wchar_t* imageName, BYTE style, BYTE state )
{
//文字・画像の双方が未設定の場合は、追加を行わない
if ( ! string && ! imageName )
return;
//ボタン作成
TBBUTTON btn;
ZeroMemory( ( void* ) &btn, sizeof ( TBBUTTON ) );
//ID
btn.idCommand = idCommand;
//ENABELD指定
btn.fsState = TBSTATE_ENABLED | state;
//スタイル指定
btn.fsStyle = TBSTYLE_BUTTON | BTNS_AUTOSIZE | style;
if ( string )
btn.fsState |= BTNS_SHOWTEXT;
//文字列設定
if ( string )
btn.iString = (int)SendMessage(TB_ADDSTRING, 0, (LPARAM)string);
//画像設定
if ( imageName )
{
wchar_t buf[MAX_PATH];
wsprintf ( buf, L"%s\\%s.bmp", KUMA_PATH, imageName );
HBITMAP hBitmap = (HBITMAP) LoadImage ( NULL, buf, IMAGE_BITMAP,16, 16, LR_LOADFROMFILE );
btn.iBitmap = ImageList_Add(m_hImageList, hBitmap, NULL);
}
else
{
btn.iBitmap = -2;
}
btn.dwData = 0;
//ボタンを追加する
SendMessage( TB_ADDBUTTONS, 1, (LPARAM)&btn );
}
//メニュー追加
void CToolbarButtonCtrl::AddMenu ( int idParent, int idCommand, wchar_t* string )
{
//MENUの設定
MENUITEMINFO menuInfo;
menuInfo.cbSize = sizeof( menuInfo );
menuInfo.fMask = MIIM_STRING | MIIM_ID;
menuInfo.fType = MFT_STRING;
menuInfo.wID = idCommand;
menuInfo.dwTypeData = string;
//メニューの要素番号
int menuIdx = ( int ) m_MenuMap.count ( idParent );
//既にキーが存在する場合(追加登録)
if ( menuIdx > 0 )
{
m_MenuMap[idParent].push_back ( menuInfo );
}
//キーが存在しない場合(新規追加)
else
{
std::auto_ptr<std::vector<MENUITEMINFO>> vec ( new std::vector<MENUITEMINFO>() );
vec->push_back ( menuInfo );
m_MenuMap[idParent] = *vec;
}
}
//メニュー表示
void CToolbarButtonCtrl::DispMenu ( int idParent )
{
//メニューの存在チェック
if ( m_MenuMap.find ( idParent ) == m_MenuMap.end ( ) )
return;
//ポップアップメニューを作る
HMENU hMenu = CreatePopupMenu();
//MENUINFOをメニューに追加する
std::vector < MENUITEMINFO >::iterator ite = m_MenuMap[idParent].begin ( );
while ( ite != m_MenuMap[idParent].end ( ) )
{
InsertMenuItem ( hMenu, 1, FALSE, &(*ite) );
ite++;
}
//メニュー表示位置の取得
RECT btnRect, wndRect;
SendMessage ( TB_GETRECT, (WPARAM)idParent, (LPARAM)&btnRect );
GetWindowRect ( m_hWnd, &wndRect );
//メニュー表示
TrackPopupMenu ( hMenu, TPM_LEFTALIGN, btnRect.left + wndRect.left, wndRect.bottom,
0, m_hWnd, NULL );
}
戻る
コメントスペース