ATL/WTL AppWizard
今回のサンプルプログラムはATL/WTL AppWizardを使用します。ATL/WTL AppWizardでは、デフォルトの状態で[終了]ボタンを押します。これにより以下のオプションが選択されたことになります。
- SDI Application
- Add Common Controls Manifest
- Toolbar
- Rebar
- Command Bar
- Status Bar
- Use a view window
- Generic window
作成されたスケルトンに対して、本稿でも前回同様、_ATL_MIN_CRT
を削除してリソースファイルを修正します。また、自動生成される「proj05view.h」「aboutdlg.h」は使用しないのでプロジェクトから削除します。
フォントリストペイン
スプリッタウィンドウの左ペインは、システムにインストールされている利用可能なフォント名の一覧を表示します。
このフォントリストペインを作成するために、プロジェクトに「FontListView.h」ファイルを追加して次のようなコードを記述します。
class CFontListView : public CWindowImpl<CFontListView, CListBox> { public: DECLARE_WND_SUPERCLASS(NULL, CListBox:: GetWndClassName()) BOOL PreTranslateMessage(MSG* pMsg){ return FALSE; } // メッセージマップ BEGIN_MSG_MAP_EX(CFontListView) MSG_WM_CREATE(OnCreate) END_MSG_MAP() LRESULT OnCreate(LPCREATESTRUCT lpcs){ LRESULT lRet = DefWindowProc(); SetFont(AtlGetDefaultGuiFont()); 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) { CFontListView* pList = (CFontListView*)lParam; // TrueTypeフォント名のみリストに追加 if(nFontType & TRUETYPE_FONTTYPE) pList->AddString(lpelf->elfLogFont.lfFaceName); return 1; } };
フォントリストペインは、リストボックスを基底クラスとしたビューウィンドウです。WM_CREATE
メッセージハンドラでEnumFontFamilies()
を呼び出し、システムで利用可能なTrueTypeフォント名だけをリストボックスに追加しています。
フォントプレビューペイン
スプリッタウィンドウの右ペインは、左ペインで選択されたフォントを表示します。
このフォントプレビューペインを作成するために、プロジェクトに「FontPreviewView.h」ファイルを追加して次のようなコードを記述します。
class CFontPreviewView : public CWindowImpl<CFontPreviewView> { CString m_strFontName; public: BOOL PreTranslateMessage(MSG* pMsg){ return FALSE; } // メッセージマップ BEGIN_MSG_MAP_EX(CFontPreviewView) MSG_WM_PAINT(OnPaint) END_MSG_MAP() void OnPaint(HDC /*hDC*/){ CPaintDC dc(m_hWnd); if(!m_strFontName.IsEmpty()){ // サイズ20ポイントのフォントを作成し、選択 CFont font; font.CreatePointFont(200, m_strFontName); HFONT hOldFont = dc.SelectFont(font); // ビューウィンドウにフォント名を描画 CRect rect; GetClientRect(rect); dc.SetBkMode(TRANSPARENT); dc.DrawText(m_strFontName,m_strFontName.GetLength(), rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE); // 元のフォントを選択 dc.SelectFont(hOldFont); } } void SetFontName(LPCTSTR lpszFontName){ m_strFontName = lpszFontName; Invalidate(); } };
フォントプレビューペインは一般的なビューウィンドウです。WM_PAINT
メッセージハンドラでフォント名を描画しますが、そのフォント名はSetFontName()
というpublicなメンバ関数を外部から呼び出すことによって設定します。