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

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

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

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


プロジェクトファイル ダウンロード
// 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_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(CMainFrame)
        MSG_WM_CREATE(OnCreate)
        MSG_WM_DESTROY(OnDestroy)
        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, OnFileExit)
        CHAIN_MSG_MAP(CUpdateUI<CMainFrame>)
        CHAIN_MSG_MAP(CFrameWindowImpl<CMainFrame>)
    END_MSG_MAP()

    int OnCreate(LPCREATESTRUCT lpCreateStruct){
        // リバーを作成
        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);

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

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

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

    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バージョン情報



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

 CMainFrameクラスでは、 ページャーコントロール用にID(IDC_PAGER_BAR)を定義し、 CPagerCtrlクラスのインスタンスをメンバ変数として宣言します。 また、ツールバーのサイズを保持するためのCSizeクラスのインスタンスもメンバ変数として宣言します。

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

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

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

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