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

// atlctrls.h内
typedef CReBarCtrlT<ATL::CWindow>   CReBarCtrl;
			

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

 WTLのCReBarCtrlクラスは、MFCの同名のクラスとほぼ同じメンバ関数を用意しています。 以下に示すのは、CReBarCtrlクラスを使用する例です。 フレームウィンドウを作成してリバーを追加し、 そのリバーのバンドにツールバーとコンボボックスコントロールを追加します。 リバーのバンドに追加されたツールバーは表示/非表示を切り換えられるようにします。


// stdafx.h内
#include <atlbase.h>
#include <atlapp.h>
extern CAppModule _Module;
#include <atlwin.h>

#include <atlcrack.h>
#include <atlmisc.h>
#include <atlctrls.h>
#include <atlframe.h>
			

// mainfrm.h内
class CMainFrame : public CFrameWindowImpl<CMainFrame>,
    public CUpdateUI<CMainFrame>, public CMessageFilter, public CIdleHandler
{
public:
    DECLARE_FRAME_WND_CLASS(NULL, IDR_MAINFRAME)

    enum { IDC_COMBO_REBAR = 1001 };
    CComboBox m_combo_rebar;

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

    virtual BOOL OnIdle(){
        UIUpdateToolBar();
        return FALSE;
    }

    BEGIN_UPDATE_UI_MAP(CMainFrame)
        UPDATE_ELEMENT(ID_MENUITEM_TOOLBAR, UPDUI_MENUPOPUP)
    END_UPDATE_UI_MAP()

    BEGIN_MSG_MAP_EX(CMainFrame)
        MSG_WM_CREATE(OnCreate)
        COMMAND_ID_HANDLER_EX(ID_MENUITEM_TOOLBAR, OnMenuToolbar)
        COMMAND_ID_HANDLER_EX(ID_APP_EXIT, OnMenuExit)
        CHAIN_MSG_MAP(CUpdateUI<CMainFrame>)
        CHAIN_MSG_MAP(CFrameWindowImpl<CMainFrame>)
    END_MSG_MAP()

    LRESULT OnCreate(LPCREATESTRUCT lpcs){
        // リバーを作成
        CreateSimpleReBar();

        // ツールバーを作成してバンドに追加
        HWND hToolBar = CreateSimpleToolBarCtrl(m_hWnd,
            IDR_MAINFRAME, FALSE, ATL_SIMPLE_TOOLBAR_PANE_STYLE);
        AddSimpleReBarBand(hToolBar);

        UIAddToolBar(hToolBar);
        UISetCheck(ID_MENUITEM_TOOLBAR, 1);

        // コンボボックスを作成してバンドに追加
        m_combo_rebar.Create(m_hWnd, CRect(0, 0, 100, 100), NULL,
            WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_DROPDOWNLIST, 0, IDC_COMBO_REBAR);
        m_combo_rebar.SetFont(AtlGetDefaultGuiFont());
        m_combo_rebar.AddString(_T("アイテム1"));
        m_combo_rebar.AddString(_T("アイテム2"));
        AddSimpleReBarBand(m_combo_rebar);

        // リバーのサイズを調整
        SizeSimpleReBarBands();

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

        return 0;
    }

    void OnMenuToolbar(UINT uNotifyCode, int nID, HWND hWndCtl){
        static BOOL bVisible = TRUE;
        bVisible = !bVisible;
        CReBarCtrl rebar = m_hWndToolBar;
        int nBandIndex = rebar.IdToIndex(ATL_IDW_BAND_FIRST);
        rebar.ShowBand(nBandIndex, bVisible);
        UISetCheck(ID_MENUITEM_TOOLBAR, bVisible);
        UpdateLayout();
    }

    void OnMenuExit(UINT uNotifyCode, int nID, HWND hWndCtl){
        PostMessage(WM_CLOSE);
    }
};
			

// app.cpp内
#include "stdafx.h"

#include "resource.h"

#include "mainfrm.h"

CAppModule _Module;

int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE, LPTSTR lpCmdLine, int nCmdShow)
{
    HRESULT hRes = ::CoInitialize(NULL);
    ATLASSERT(SUCCEEDED(hRes));

    ::DefWindowProc(NULL, 0, 0, 0L);

    AtlInitCommonControls(ICC_COOL_CLASSES | ICC_WIN95_CLASSES);

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

    int nRet = 0;
    // BLOCK: アプリケーション実行
    {
        CMessageLoop theLoop;
        _Module.AddMessageLoop(&theLoop);

        CMainFrame wnd;
        wnd.CreateEx();
        wnd.ShowWindow(nCmdShow);
        wnd.UpdateWindow();

        nRet = theLoop.Run();

        _Module.RemoveMessageLoop();
    }

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

    return nRet;
}
			

 まず、メニューバーのトップレベルに[表示]を作成し、 その下に[ツールバー]メニューアイテムを追加します。 この[ツールバー]にはID_MENUITEM_TOOLBARというIDを設定します。



 次に、stdafx.h内では、CReBarCtrlクラスを使用するためにatlctrls.hヘッダをインクルードします。

 CMainFrameクラスでは一般的なフレームウィンドウを作成します。 WM_CREATEメッセージハンドラでは、まずCreateSimpleReBar()を呼び出してリバーを作成します。 これにより、フレームウィンドウのメンバ変数であるm_hWndToolBarにリバーのハンドルが設定されます。 次にツールバーコントロールとコンボボックスコントロールを作成し、 それぞれリバーのバンドに追加します。

 次に、メニューアイテム[ツールバー](ID:ID_MENUITEM_TOOLBAR) 用のコマンドメッセージハンドラを追加します。 このハンドラでは静的変数bVisibleによってツールバーの可視状態を保持し、 CReBarCtrlクラスのメンバ関数であるShowBand()で可視状態を切り換えています。 なお、このハンドラのコードは ATL/WTL AppWizard が出力するものとほぼ同じです。

 最後に、_tWinMain()内でICC_COOL_CLASSESフラグを指定して AtlInitCommonControls()を呼び出します。 これによりリバーコントロールが使用可能になります。