SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

ATL/WTLを利用したVisual C++のWindowsプログラミング

ATL/WTLプログラミング 5:スプリッタウィンドウ

ATL/WTLを利用したVisual C++のWindowsプログラミング


  • X ポスト
  • このエントリーをはてなブックマークに追加

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」ファイルを追加して次のようなコードを記述します。

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」ファイルを追加して次のようなコードを記述します。

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なメンバ関数を外部から呼び出すことによって設定します。

次のページ
メインウィンドウ

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
ATL/WTLを利用したVisual C++のWindowsプログラミング連載記事一覧

もっと読む

この記事の著者

So()

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/346 2006/05/25 10:14

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング