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

戻る

コメントスペース