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

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

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

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


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

#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
#pragma once

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_VIEW_TOOLBAR, UPDUI_MENUPOPUP)
    END_UPDATE_UI_MAP()

    BEGIN_MSG_MAP(CMainFrame)
        MSG_WM_CREATE(OnCreate)
        MSG_WM_DESTROY(OnDestroy)
        COMMAND_ID_HANDLER_EX(ID_VIEW_TOOLBAR, OnViewToolbar)
        COMMAND_ID_HANDLER_EX(ID_APP_EXIT, OnFileExit)
        CHAIN_MSG_MAP(CUpdateUI<CMainFrame>)
        CHAIN_MSG_MAP(CFrameWindowImpl<CMainFrame>)
    END_MSG_MAP()

    int OnCreate(LPCREATESTRUCT lpCreateStruct){
        // ツールバーを作成
        HWND hWndToolBar = CreateSimpleToolBarCtrl(m_hWnd,
            IDR_MAINFRAME, FALSE, ATL_SIMPLE_TOOLBAR_PANE_STYLE);
        UIAddToolBar(hWndToolBar);
        UISetCheck(ID_VIEW_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"));

        // リバーを作成し、ツールバーとコンボボックスをバンドに追加
        CreateSimpleReBar();
        AddSimpleReBarBand(hWndToolBar);
        AddSimpleReBarBand(m_combo_rebar);

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

        // メッセージループにメッセージフィルタとアイドルハンドラを追加
        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);
    }

    void OnViewToolbar(UINT uNotifyCode, int nID, CWindow wndCtl){
        static BOOL bVisible = TRUE;
        bVisible = !bVisible;
        CReBarCtrl rebar = m_hWndToolBar;
        int nBandIndex = rebar.IdToIndex(ATL_IDW_BAND_FIRST);
        rebar.ShowBand(nBandIndex, bVisible);
        UISetCheck(ID_VIEW_TOOLBAR, bVisible);
        UpdateLayout();
    }

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

// SampleProject.cpp
#include "stdafx.h"
#include "resource.h"
#include "MainFrm.h"

CAppModule _Module;

int WINAPI _tWinMain(HINSTANCE hInstance, 
    HINSTANCE /*hPrevInstance*/, LPTSTR lpstrCmdLine, 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));

    CMessageLoop theLoop;
    _Module.AddMessageLoop(&theLoop);

    CMainFrame wndMain;
    wndMain.CreateEx();
    wndMain.ShowWindow(nCmdShow);

    int nRet = theLoop.Run();

    _Module.RemoveMessageLoop();

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

    return nRet;
}
			

 まず、プロジェクトにツールバーリソースを追加し、[ID]と[Prompt]を次のように設定します。 ボタンの種類は ATL/WTL AppWizard が生成するものと同じです。

リソース名 ID Prompt
ツールバー IDR_MAINFRAME -
ツールバーボタン ID_FILE_NEW 新しいドキュメントを作成します。\n新規作成
ツールバーボタン ID_FILE_OPEN 既存のドキュメントを開きます。\n開く
ツールバーボタン ID_FILE_SAVE 現在のドキュメントを保存します。\n上書き保存
ツールバーボタン ID_EDIT_CUT 選択範囲を切り取ってクリップボードに移動します。\n切り取り
ツールバーボタン ID_EDIT_COPY 選択範囲をクリップボードにコピーします。\nコピー
ツールバーボタン ID_EDIT_PASTE クリップボードの内容を挿入します。\n貼り付け
ツールバーボタン ID_FILE_PRINT 現在のドキュメントを印刷します。\n印刷
ツールバーボタン ID_APP_ABOUT プログラム情報、バージョン、著作権を表示します。\nバージョン情報



さらに、メニューバーに次のようなメニューアイテムを追加します。

リソース名 ID Caption Prompt
メニューアイテム(トップレベル) - 表示(&V) -
メニューアイテム ID_VIEW_TOOLBAR ツールバー(&T) ツールバーの表示/非表示を切り替えます。\nツールバー



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

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

 次に、リソースIDがID_VIEW_TOOLBARWM_COMMANDメッセージハンドラとしてOnViewToolbar()を追加します。 このハンドラ関数では静的変数bVisibleによってツールバーの可視状態を保持し、 CReBarCtrlクラスのメンバ関数であるShowBand()を呼び出して可視状態を切り換えます。 なお、このハンドラ関数のコードは ATL/WTL AppWizard が生成するものとほぼ同じです。

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