02.リストコントロールを使う(その2)

前回はリストコントロールに対応する変数をダイアログに追加するところまで書きました。今回はその続きです。

MFC Feature Pack では、CListCtrl の代わりになる CMFCListCtrl が追加されました。いろいろな機能が追加されているので、CMFCListCtrlを使いましょう。ただ、リソースエディタで変数を追加するときにCMFCListCtrlを選べないので、CListCtrlで変数を追加した後に、手でソースコードを修正します。

・CSlidePuzzleDlg で定義した CListCtrl m_LC を CMFCListCtrl m_LC に変更しましょう。
修正前

class CSlidePuzzleDlg : public CDialogEx
    CListCtrl m_LC;
};

修正後

class CSlidePuzzleDlg : public CDialogEx
    CMFCListCtrl m_LC;
};

これで、CMFCListCtrl を使うようになります。
 
・リストコントロールの列を設定しましょう。
OnInitDialog に下記の処理を追加して下さい。

m_LC.InsertColumn(m_LC.GetHeaderCtrl().GetItemCount(), L"No.", LVCFMT_LEFT, 50);
m_LC.InsertColumn(m_LC.GetHeaderCtrl().GetItemCount(), L"問題", LVCFMT_LEFT, 100);
m_LC.InsertColumn(m_LC.GetHeaderCtrl().GetItemCount(), L"結果", LVCFMT_LEFT, 100);

 
ここまでの内容で、アプリを実行して動作を確かめてみましょう。

。。。あれ?なんかおかしいです。列は正しく設定できてますが、見た目がしょぼいです。
CMFCListCtrl は、リボンのリソースを使うのですが、ダイアログベースでプロジェクトを作成したときは、何故かリボンのリソースをインクルードしません。それが原因で、表示がおかしくなっています。これを治すには、リソースファイルを直接編集します。


ソリューションエクスプローラでSlidePuzzleDlg.rcを選択し、ポップアップメニュー(右クリック)からコードの表示を選びます。
これで、リソースファイルをテキストエディタで編集できます。
 
リソースファイルの次の2か所を修正して下さい。 
修正箇所1

3 TEXTINCLUDE 
BEGIN
    "#define _AFX_NO_SPLITTER_RESOURCES\r\n"
    "#define _AFX_NO_OLE_RESOURCES\r\n"
    "#define _AFX_NO_TRACKER_RESOURCES\r\n"
    "#define _AFX_NO_PROPERTY_RESOURCES\r\n"
    "\r\n"
    "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN)\r\n"
    "LANGUAGE 17, 1\r\n"
    "#include ""res\\SlidePuzzle.rc2""  // Microsoft Visual C++ 以外で編集されたリソース\r\n"
    "#endif\r\n"
    "\0"
END

修正後

3 TEXTINCLUDE 
BEGIN
    "#define _AFX_NO_SPLITTER_RESOURCES\r\n"
    "#define _AFX_NO_OLE_RESOURCES\r\n"
    "#define _AFX_NO_TRACKER_RESOURCES\r\n"
    "#define _AFX_NO_PROPERTY_RESOURCES\r\n"
    "\r\n"
    "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN)\r\n"
    "LANGUAGE 17, 1\r\n"
    "#include ""res\\SlidePuzzle.rc2""  // Microsoft Visual C++ 以外で編集されたリソース\r\n"
    "#include ""l.JPN\\afxres.rc""      // 標準コンポーネント\r\n"
    "#if !defined(_AFXDLL)\r\n"
    "#include ""l.JPN\\afxribbon.rc""        // MFC のリボン リソースとコントロール バー リソース\r\n"
    "#endif\r\n"
    "#endif\r\n"
    "\0"
END

 
修正箇所2

#define _AFX_NO_SPLITTER_RESOURCES
#define _AFX_NO_OLE_RESOURCES
#define _AFX_NO_TRACKER_RESOURCES
#define _AFX_NO_PROPERTY_RESOURCES

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN)
LANGUAGE 17, 1
#include "res\SlidePuzzle.rc2"  // Microsoft Visual C++ 以外で編集されたリソース
#include "l.JPN\afxres.rc"      // 標準コンポーネント
#endif

修正後

#define _AFX_NO_SPLITTER_RESOURCES
#define _AFX_NO_OLE_RESOURCES
#define _AFX_NO_TRACKER_RESOURCES
#define _AFX_NO_PROPERTY_RESOURCES

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN)
LANGUAGE 17, 1
#include "res\SlidePuzzle.rc2"  // Microsoft Visual C++ 以外で編集されたリソース
#include "l.JPN\afxres.rc"      // 標準コンポーネント
#if !defined(_AFXDLL)
#include "l.JPN\afxribbon.rc"        // MFC のリボン リソースとコントロール バー リソース
#endif
#endif

 
・CMFCVisualManager::SetDefaultManagerでアプリケーションの外観を設定しましょう。
ダイアログが表示される前なら良いので、CSlidePuzzleApp::InitInstance()で設定すればよいでしょう。

BOOL CSlidePuzzleApp::InitInstance()
{
    //...省略
    CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerVS2008));

これで、CMFCListCtrlを使えるようになりました。リソースを追加やCMFCVisualManager::SetDefaultManagerの設定は、知らないとなかなか気づけないことですね。
最後に実行して正しく設定できたか確認して下さい。