以下に示すのは、リストボックスコントロールをベースとしたビューウィンドウを作成する例です。
プロジェクトにView.hというヘッダファイルを追加し、そこにCListboxViewというクラスを定義します。
ビューウィンドウにはシステムで使用可能なフォント名の一覧を表示します。
// View.h
#pragma once
class CListboxView : public CWindowImpl<CListboxView, CListBox>
{
public:
DECLARE_WND_SUPERCLASS(NULL, CListBox::GetWndClassName())
BOOL PreTranslateMessage(MSG* pMsg){
return FALSE;
}
BEGIN_MSG_MAP(CListboxView)
MSG_WM_CREATE(OnCreate)
COMMAND_CODE_HANDLER_EX(LBN_DBLCLK, OnListDblClick)
END_MSG_MAP()
int OnCreate(LPCREATESTRUCT lpCreateStruct){
LRESULT lRet = DefWindowProc();
CClientDC dc(m_hWnd);
EnumFontFamilies(dc, NULL,
(FONTENUMPROC)FontProc, (LPARAM)this);
return lRet;
}
static int CALLBACK FontProc(ENUMLOGFONT *lpelf,
NEWTEXTMETRIC *lpntm, int nFontType, LPARAM lParam)
{
CListboxView* pList = (CListboxView*)lParam;
pList->AddString(lpelf->elfLogFont.lfFaceName);
return 1;
}
void OnListDblClick(UINT uNotifyCode, int nID, CWindow wndCtl){
// 現在選択されているアイテムを取得して表示
int nIndex = GetCurSel();
if(nIndex != LB_ERR){
CString strText;
GetText(nIndex, strText);
MessageBox(strText);
}
}
};
|
CListboxViewクラスはCWindowImplから派生し、
CWindowImplの第2テンプレート引数には、ベースとなるCListBoxクラスを指定します。
WM_CREATEメッセージハンドラでは、
EnumFontFamilies()を呼び出してビューにフォント名を列挙します。
次に通知コードがLBN_DBLCLKのリストボックスコントロール用
WM_COMMANDメッセージハンドラとしてOnListDblClick()を追加します。
このハンドラ関数では選択されているフォント名を取得し、メッセージボックスで表示します。
次に示すのは、CListboxViewクラスを使用する例です。
// 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_ZOOMSCROLL
#define _WTL_CE_NO_FULLSCREEN
#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")
CListboxView 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)
CHAIN_MSG_MAP(CAppWindow<CSampleProjectFrame>)
CHAIN_MSG_MAP(CUpdateUI<CSampleProjectFrame>)
CHAIN_MSG_MAP(CFrameWindowImpl<CSampleProjectFrame>)
CHAIN_CLIENT_COMMANDS() // ビュークラスへコマンドチェイン
END_MSG_MAP()
int OnCreate(LPCREATESTRUCT lpCreateStruct){
// メニューバー作成
CreateSimpleCEMenuBar(0, SHCMBF_EMPTYBAR);
// ビューを作成
m_hWndClient = m_view.Create(m_hWnd, rcDefault, NULL,
WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_VSCROLL |
LBS_NOINTEGRALHEIGHT | LBS_NOTIFY | LBS_WANTKEYBOARDINPUT | LBS_SORT);
// メッセージループにメッセージフィルタとアイドルハンドラを追加
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);
}
};
|
// 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;
}
|
まず、CListboxViewクラスのインスタンスを
CSampleProjectFrameクラスのメンバ変数として宣言し、
WM_CREATEメッセージハンドラでCreate()を呼び出してビューウィンドウを作成します。
最後に、SampleProject.cppファイルでSampleProjectFrame.hヘッダの前にView.hヘッダをインクルードします。
|