ホーム WTL Mobile
ツールバー
ドキュメント種別 ATL/WTL に関する文書
最終更新日 2009/12/30
PR
 WTLではコモンコントロールのツールバーコントロールをCToolBarCtrlT というクラステンプレートでカプセル化しています。 テンプレート引数にはクラスを指定しますが、 そのクラスはCToolBarCtrlTの基底クラスとして使用されます。 atlctrls.hヘッダではtypedefによって次のように宣言されています。

// atlctrls.h
typedef CToolBarCtrlT<ATL::CWindow>   CToolBarCtrl;
			

これは、CToolBarCtrlクラスはCWindowクラスの派生クラスであることを意味します。

 WTLのCToolBarCtrlクラスは、MFCの同名のクラスと同等の機能を備えています。 以下に示すのは、CToolBarCtrlクラスを使用する例です。 フレームウィンドウを作成してツールバーを追加し、 ツールバー上の最初のボタンをドロップダウンスタイルにします。


プロジェクトファイル ダウンロード
// stdafx.h
#pragma once

#define WINVER 0x0420
#include <atlbase.h>
#if _ATL_VER == 0x900
#define _SECURE_ATL 1
#endif

#define _WTL_USE_CSTRING
#include <atlapp.h>
extern CAppModule _Module;
#include <atlwin.h>

#include <tpcshell.h>
#include <aygshell.h>
#pragma comment(lib, "aygshell.lib")

#include <atlcrack.h>
#include <atlmisc.h>
#include <atlframe.h>
#include <atlctrls.h>
#define _WTL_CE_NO_ZOOMSCROLL
#define _WTL_CE_NO_FULLSCREEN
#include <atlwince.h>
			

// SampleProjectFrame.h
#pragma once

class CSampleProjectFrame : 
    public CFrameWindowImpl<CSampleProjectFrame>,
    public CUpdateUI<CSampleProjectFrame>,
    public CAppWindow<CSampleProjectFrame>,
    public CMessageFilter, public CIdleHandler
{
public:
    DECLARE_APP_FRAME_CLASS(NULL, IDR_MAINFRAME, L"Software\\WTL")

    CToolBarCtrl m_toolbar;

    virtual BOOL PreTranslateMessage(MSG* pMsg){
        return CFrameWindowImpl<CSampleProjectFrame>::PreTranslateMessage(pMsg);
    }

    virtual BOOL OnIdle(){
        return FALSE;
    }

    BEGIN_UPDATE_UI_MAP(CSampleProjectFrame)
    END_UPDATE_UI_MAP()

    BEGIN_MSG_MAP(CSampleProjectFrame)
        MSG_WM_CREATE(OnCreate)
        MSG_WM_DESTROY(OnDestroy)
        NOTIFY_CODE_HANDLER_EX(TBN_DROPDOWN, OnToolbarDropdown)
        COMMAND_ID_HANDLER_EX(ID_HELLO_WORLD, OnHelloWorld)
        COMMAND_ID_HANDLER_EX(ID_HELLO_ATL, OnHelloATL)
        COMMAND_ID_HANDLER_EX(ID_HELLO_WTL, OnHelloWTL)
        COMMAND_ID_HANDLER_EX(ID_APP_EXIT, OnAppExit)
        CHAIN_MSG_MAP(CAppWindow<CSampleProjectFrame>)
        CHAIN_MSG_MAP(CUpdateUI<CSampleProjectFrame>)
        CHAIN_MSG_MAP(CFrameWindowImpl<CSampleProjectFrame>)
    END_MSG_MAP()

    int OnCreate(LPCREATESTRUCT lpCreateStruct){
        // メニューバー作成
        CreateSimpleCEMenuBar(IDR_MAINFRAME, SHCMBF_HMENU);

        // ツールバー作成
        m_toolbar = CreateSimpleCEToolBar();

        // ツールバー上のボタンのスタイルを変更
        TBBUTTONINFO bi = { sizeof(bi), TBIF_STYLE };
        m_toolbar.GetButtonInfo(ID_HELLO_WORLD, &bi);
        bi.fsStyle |= TBSTYLE_DROPDOWN | TBSTYLE_AUTOSIZE;
        m_toolbar.SetButtonInfo(ID_HELLO_WORLD, &bi);

        // メッセージループにメッセージフィルタとアイドルハンドラを追加
        CMessageLoop* pLoop = _Module.GetMessageLoop();
        pLoop->AddMessageFilter(this);
        pLoop->AddIdleHandler(this);
        return 0;
    }

    void OnDestroy(){
        // メッセージループからメッセージフィルタとアイドルハンドラを削除
        CMessageLoop* pLoop = _Module.GetMessageLoop();
        pLoop->RemoveMessageFilter(this);
        pLoop->RemoveIdleHandler(this);
        SetMsgHandled(false);
    }

    LRESULT OnToolbarDropdown(LPNMHDR pnmh){
        LPNMTOOLBAR pnmtb = (LPNMTOOLBAR)pnmh;
        if(pnmtb->iItem == ID_HELLO_WORLD){
            // ドロップダウンメニューを表示する位置を取得
            CRect rcButton;
            m_toolbar.GetRect(ID_HELLO_WORLD, rcButton);
            m_toolbar.ClientToScreen(rcButton);

            TPMPARAMS tpm = {sizeof(tpm)};
            tpm.rcExclude = rcButton;

            // ドロップダウンメニュー表示
            CMenu menuDropdown;
            menuDropdown.LoadMenu(IDR_MENU_DROPDOWN);
            menuDropdown.GetSubMenu(0).TrackPopupMenuEx(
                TPM_RIGHTALIGN | TPM_BOTTOMALIGN,
                rcButton.right, rcButton.top, m_hWnd, &tpm);
        }

        return FALSE;
    }

    void OnHelloWorld(UINT uNotifyCode, int nID, CWindow wndCtl){
        MessageBox(_T("Hello World"));
    }

    void OnHelloATL(UINT uNotifyCode, int nID, CWindow wndCtl){
        MessageBox(_T("Hello ATL"));
    }

    void OnHelloWTL(UINT uNotifyCode, int nID, CWindow wndCtl){
        MessageBox(_T("Hello WTL"));
    }

    void OnAppExit(UINT uNotifyCode, int nID, CWindow wndCtl){
        PostMessage(WM_CLOSE);
    }
};
			

// SampleProject.cpp
#include "stdafx.h"
#include "resourceppc.h"
#include "SampleProjectFrame.h"

CAppModule _Module;

int WINAPI _tWinMain(HINSTANCE hInstance,
    HINSTANCE /*hPrevInstance*/, LPTSTR lpstrCmdLine, int nCmdShow)
{
    HRESULT hRes =
        CSampleProjectFrame::ActivatePreviousInstance(hInstance, lpstrCmdLine);

    if(FAILED(hRes) || S_FALSE == hRes){
        return hRes;
    }

    hRes = ::CoInitializeEx(NULL, COINIT_MULTITHREADED);
    ATLASSERT(SUCCEEDED(hRes));

    AtlInitCommonControls(ICC_BAR_CLASSES);
    SHInitExtraControls();

    hRes = _Module.Init(NULL, hInstance);
    ATLASSERT(SUCCEEDED(hRes));

    int nRet = CSampleProjectFrame::AppRun(lpstrCmdLine, nCmdShow);

    _Module.Term();
    ::CoUninitialize();

    return nRet;
}
			

 まず、プロジェクトにツールバーリソースを追加し、[ID]を次のように設定します。

リソース名 ID
ツールバー IDR_MAINFRAME
ツールバーボタン ID_HELLO_WORLD



 次に、プロジェクトにメニューリソースを追加し、[ID]と[Caption]を次のように設定します。

リソース名 ID Caption
メニュー IDR_MAINFRAME -
メニューアイテム(トップレベル) ID_APP_EXIT 終了



さらに、ドロップダウン用のメニューリソースを追加し、[ID]と[Caption]を次のように設定します。

リソース名 ID Caption
メニュー IDR_MENU_DROPDOWN -
メニューアイテム(トップレベル) - index0
メニューアイテム ID_HELLO_ATL ATL
メニューアイテム ID_HELLO_WTL WTL



 CSampleProjectFrameクラスでは、まず、 ツールバーコントロール用にCToolBarCtrlクラスのインスタンスをメンバ変数として宣言します。 これを使うためには、WM_CREATEメッセージハンドラでCreateSimpleCEToolBar()の戻り値であるツールバーのハンドルを代入する必要があります。

 次に、WM_CREATEメッセージハンドラで、リソースIDがID_HELLO_WORLDのツールバーボタンにTBSTYLE_DROPDOWNスタイルとTBSTYLE_AUTOSIZEスタイルを追加します。

 次に、通知コードがTBN_DROPDOWNWM_NOTIFYメッセージハンドラとしてOnToolbarDropdown()を追加します。 このハンドラ関数はドロップダウンボタンの矢印部分をタップするたびに呼び出されます。 ここではボタンのリソースIDを確認し、ドロップダウンメニューを表示します。

 次に、WM_COMMANDメッセージハンドラを追加します。 OnHelloWorld()はドロップダウンボタンを押した時に呼び出され、 OnHelloATL()OnHelloWTL()はドロップダウンメニューアイテムを実行した時に呼び出されます。 これらのハンドラ関数ではメッセージボックスを表示します。

 最後に_tWinMain()で、引数にICC_BAR_CLASSESを指定して AtlInitCommonControls()を呼び出します。