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

// atlctrls.h内
typedef CPagerCtrlT<ATL::CWindow>   CPagerCtrl;
			

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

 以下に示すのは、CPagerCtrlクラスを使用する例です。 フレームウィンドウを作成し、そのツールバーにページャーを使用します。


// 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_PAGER_BAR = 1001 };
    CPagerCtrl m_pager_bar;

    CSize m_sizeToolbar;     // ツールバーのサイズ

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

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

    BEGIN_UPDATE_UI_MAP(CMainFrame)
        // エントリなし
    END_UPDATE_UI_MAP()

    BEGIN_MSG_MAP_EX(CMainFrame)
        MSG_WM_CREATE(OnCreate)
        NOTIFY_HANDLER_EX(IDC_PAGER_BAR, PGN_CALCSIZE, OnPagerCalcsize)
        NOTIFY_HANDLER_EX(IDC_PAGER_BAR, PGN_SCROLL, OnPagerScroll)
        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();

        // ページャーコントロールを作成
        m_pager_bar.Create(m_hWndToolBar, NULL, NULL,
            WS_CHILD | WS_VISIBLE | PGS_HORZ, 0, IDC_PAGER_BAR);

        // ツールバーを作成
        HWND hWndToolBar = CreateSimpleToolBarCtrl(m_pager_bar.m_hWnd,
            IDR_MAINFRAME, FALSE, ATL_SIMPLE_TOOLBAR_PANE_STYLE);
        UIAddToolBar(hWndToolBar);

        // ツールバーのサイズを取得
        ::SendMessage(hWndToolBar, TB_GETMAXSIZE, 0, (LPARAM)&m_sizeToolbar);

        m_pager_bar.MoveWindow(0, 0, m_sizeToolbar.cx, m_sizeToolbar.cy);
        m_pager_bar.SetChild(hWndToolBar);
        m_pager_bar.SetBkColor(RGB(240, 240, 255));

        AddSimpleReBarBand(m_pager_bar.m_hWnd, _T("ページャー付きツールバー"));

        // ステータスバーを作成
        CreateSimpleStatusBar();

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

        return 0;
    }

    LRESULT OnPagerCalcsize(LPNMHDR pnmh){
        LPNMPGCALCSIZE pCalcSize = (LPNMPGCALCSIZE)pnmh;

        switch(pCalcSize->dwFlag){
        case PGF_CALCWIDTH:
            pCalcSize->iWidth = m_sizeToolbar.cx;
            break;
        }

        return 0;
    }

    LRESULT OnPagerScroll(LPNMHDR pnmh){
        LPNMPGSCROLL pScroll = (LPNMPGSCROLL)pnmh;

        switch(pScroll->iDir){
        case PGF_SCROLLLEFT:
        case PGF_SCROLLRIGHT:
        case PGF_SCROLLUP:
        case PGF_SCROLLDOWN:
            pScroll->iScroll = 10;
            break;
        }

        return 0;
    }

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

// Control.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_PAGESCROLLER_CLASS);

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

 まず、stdafx.h内では、CPagerCtrlクラスとフレームウィンドウを使用するためにatlctrls.hヘッダとatlframe.hヘッダをインクルードします。

 CMainFrameクラスでは一般的なフレームウィンドウを作成することに加え、 ページャーコントロール用にID(IDC_PAGER_BAR)を定義し、 CPagerCtrlクラスのインスタンスをメンバ変数として宣言します。 これを使うためには、WM_CREATEメッセージハンドラでCreate()を呼び出して作成する必要があります。 また、ツールバーのサイズを表すCSizeクラスのインスタンスもメンバ変数として宣言しておきます。

 次に、WM_CREATEメッセージハンドラで、まずCreateSimpleReBar()を呼び出してリバーを作成します。 次に、リバーを親として、つまり、Create()の第1引数にリバーのハンドルm_hWndToolBar を指定してページャーコントロールを作成します。 さらに、ページャーコントロールを親としてツールバーを作成します。 この時、スタイルとしてCCS_NORESIZEを指定する必要があります。 (ATL_SIMPLE_TOOLBAR_PANE_STYLEにはCCS_NORESIZEスタイルが含まれています。) 次に、ページャーコントロールのサイズをツールバーと同じサイズにし、 SetChild()にツールバーのハンドルを指定することよって、 ツールバーをページャーコントロールの子に設定します。 また、SetBkColorによってページャーコントロールの色を指定しています。 このようにして作成したページャーコントロールをAddSimpleReBarBandによってリバーに追加します。

 次に、通知コードがPGN_CALCSIZEのページャーコントロール用通知メッセージハンドラを追加します。 このハンドラではページャーコントロールのサイズをツールバーの幅と同じサイズに設定します。 このハンドラは必須です。

 次に、通知コードがPGN_SCROLLのページャーコントロール用通知メッセージハンドラを追加します。 このハンドラではページャーコントロールのスクロール値を設定します。

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