WTLはズームスクロールウィンドウを作成するために Windows Mobile 用のCZoomScrollImplというクラステンプレートを用意しています。
CZoomScrollImplはCScrollWindowImplの基底クラスであるCScrollImplクラステンプレートから派生しており、
テンプレート引数には派生クラス名を指定します。
以下に示すのは、CZoomScrollImplをベースとしたビューウィンドウを作成する例です。
プロジェクトにView.hというヘッダファイルを追加し、そこにCZoomScrollViewというクラスを定義します。
メニューバーには、クライアント領域に表示した画像を拡大/縮小するためのメニューアイテムを追加します。
// View.h
#pragma once
class CZoomScrollView : public CWindowImpl<CZoomScrollView>,
public CZoomScrollImpl<CZoomScrollView>
{
public:
CBitmap m_bitmap;
BOOL PreTranslateMessage(MSG* pMsg){
return FALSE;
}
BEGIN_MSG_MAP(CZoomScrollView)
MSG_WM_CREATE(OnCreate)
CHAIN_MSG_MAP(CZoomScrollImpl<CZoomScrollView>)
END_MSG_MAP()
int OnCreate(LPCREATESTRUCT lpCreateStruct){
LRESULT lRet = DefWindowProc();
// ビットマップファイル読み込み
TCHAR szImage[_MAX_PATH];
::GetModuleFileName(NULL, szImage, sizeof(szImage) / sizeof(TCHAR));
::StringCbCopy(::_tcsrchr(szImage, _T('\\')) + 1,
sizeof(szImage), _T("sample.bmp"));
m_bitmap = ::SHLoadImageFile(szImage);
CSize sizeImage;
m_bitmap.GetSize(sizeImage);
SetZoomScrollSize(sizeImage);
return lRet;
}
void DoPaint(CDCHandle dc){
if(!m_bitmap.IsNull()){
Draw(m_bitmap, dc);
}
}
};
|
CZoomScrollViewクラスはCWindowImplとCZoomScrollImplから派生し、
メッセージマップにはWM_CREATEメッセージエントリとCZoomScrollImplへのチェインを追加します。
WM_CREATEメッセージハンドラではアプリケーションと同じフォルダにあるビットマップファイルを読み込み、
SetZoomScrollSize()を呼び出してスクロールサイズをビットマップと同じサイズに設定します。
次に、DoPaint()をオーバーライドし、
CZoomScrollImplのメンバ関数であるDraw()を呼び出します。
Draw()はビットマップを拡大/縮小して描画します。
次に示すのは、CZoomScrollViewクラスを使用する例です。
// 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_FULLSCREEN
#include <atlscrl.h> // CZoomScrollImplを使用するため
#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")
CZoomScrollView m_view;
virtual BOOL PreTranslateMessage(MSG* pMsg){
if(CFrameWindowImpl<CSampleProjectFrame>::PreTranslateMessage(pMsg))
return TRUE;
return m_view.IsWindow() ? m_view.PreTranslateMessage(pMsg) : FALSE;
}
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)
COMMAND_ID_HANDLER_EX(ID_ZOOM_50, OnZoom50)
COMMAND_ID_HANDLER_EX(ID_ZOOM_100, OnZoom100)
COMMAND_ID_HANDLER_EX(ID_ZOOM_200, OnZoom200)
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_hWndClient = m_view.Create(m_hWnd, rcDefault, NULL,
WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);
// メッセージループにメッセージフィルタとアイドルハンドラを追加
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 OnZoom50(UINT uNotifyCode, int nID, CWindow wndCtl){
m_view.SetZoom(1.0 / 0.5);
}
void OnZoom100(UINT uNotifyCode, int nID, CWindow wndCtl){
m_view.SetZoom(1.0 / 1.0);
}
void OnZoom200(UINT uNotifyCode, int nID, CWindow wndCtl){
m_view.SetZoom(1.0 / 2.0);
}
void OnAppExit(UINT uNotifyCode, int nID, CWindow wndCtl){
PostMessage(WM_CLOSE);
}
};
|
// SampleProject.cpp
#include "stdafx.h"
#include "resourceppc.h"
#include "View.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_DATE_CLASSES);
SHInitExtraControls();
hRes = _Module.Init(NULL, hInstance);
ATLASSERT(SUCCEEDED(hRes));
int nRet = CSampleProjectFrame::AppRun(lpstrCmdLine, nCmdShow);
_Module.Term();
::CoUninitialize();
return nRet;
}
|
まず、プロジェクトにメニューリソースを追加し、[ID]と[Caption]を次のように設定します。
| リソース名 |
ID |
Caption |
| メニュー |
IDR_MAINFRAME |
- |
| メニューアイテム(トップレベル) |
ID_APP_EXIT |
終了 |
| メニューアイテム(トップレベル) |
- |
ズーム |
| メニューアイテム |
ID_ZOOM_50 |
50% |
| メニューアイテム |
ID_ZOOM_100 |
100% |
| メニューアイテム |
ID_ZOOM_200 |
200% |

次に、stdafx.hヘッダでは、CZoomScrollImplを使用するためにatlwince.hヘッダの前にatlscrl.hヘッダをインクルードします。
次に、CZoomScrollViewクラスのインスタンスを
CSampleProjectFrameクラスのメンバ変数として宣言し、
WM_CREATEメッセージハンドラでCreate()を呼び出してビューウィンドウを作成します。
次に、各ズーム率に応じてリソースIDがID_ZOOM_50、ID_ZOOM_100、
ID_ZOOM_200のWM_COMMANDメッセージハンドラとしてOnZoom50()、
OnZoom100()、OnZoom200()を追加します。
これらの関数ではCZoomScrollImplのメンバ関数であるSetZoom()を呼び出してズーム率を設定します。
最後に、SampleProject.cppファイルでSampleProjectFrame.hヘッダの前にView.hヘッダをインクルードします。
|