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の設定は、知らないとなかなか気づけないことですね。
最後に実行して正しく設定できたか確認して下さい。