Version 5.02
リストボックスを使おう
「じゃ、今回はリストボックスを簡単に使ってみましょう」
『おー!!』
「さて、どうすればいいと思う?」
『分かんない』
「……」
『……』
「じゃーとりあえず方針。【表示】ボタンを押すと、テキトーな文字がリス
トボックスに表示されるようにしましょう」
『ってゆーか、リストボックスってどんなのだっけ。フォルダみたいなの?』
「ううん、ただ単語を縦にずらっと並べるの」
『なんか単純』
「だって最初の練習用だもの。いきなりすごいのにしたら」
『難しいわけねー』
「じゃ、まずは【表示】ボタンを押したときのハンドラ関数を作って」
『ボタンのだから、テストアプリ作ったときのと同じ方法でいいんだよね』
「そう。詳しくは Ver 4.01 ( No.051 )を見てくださいってことで」
『イベントハンドラとかって前にかなーり色々したよね』
「ちょっと忘れちゃった?」
『ちょっと』
「んーと、何かが起きること、たとえばボタンが押されたりとかそーゆーの
をイベントって言います」
『で、イベントが起きた時に呼ばれる関数がイベントハンドラってゆーのよ
ね』
「そうそう」
『で、ボタンのイベントハンドラは、右クリックメニューの【イベント】を
選んで、そのまんま【追加と編集】選べばいいんだよね』
「そうそう。そうすれば関数ができるから。どんな関数?」
『どんなって?』
「復習復習」
『あ、えーっと……』
void CFileTestDlg::OnBtnShow()
{
// TODO: この位置に(以下略)
}
『 void CFileTestDlg::OnBtnShow() ってなってるから、まず引数がなくて、
戻り値が void だからなし』
「そうそう」
『あと、えーっと、 CFileTestDlg がクラス名で、 OnBtnShow がそのメン
バ関数なんだよね』
「そうそう。結構憶えてるね」
『うん、なんとか』
「ま、この辺はまた後でしっかり見てく予定。さてボタンのイベントハンド
ラを作りました。実際にこのハンドラが呼ばれてるか確認するには?」
『んっと、ブレークポイント付ければ分かるんじゃない? あと TRACE()
付けるとか』
「そうだね。まだイベントハンドラ作り慣れてないうちはチェックした方が
いいかもね」
『あたしはテストアプリ作り慣れてるもん』
「じゃあ飛ばして、このボタンを押したらリストボックスに文字を表示させ
たいわけだけど……こんなパターン、憶えてない?」
『計算機!! 【=】ボタン押したらエディットボックスに数字入ってるっ
てゆーの』
「そう! あれに似た方法で行きます。あのときはまずどうしたっけ」
『 Ver 3.10 ( No.035 )によると、まずクラスウィザードってのを……』
メニューの【表示】−【ClassWizard】を選ぶ。
『これ、懐かしいなー』
「クラスウィザードは、クラスの機能とウィンドウズの機能を結びつけてく
れる便利なもの」
『? そうだっけ』
「今初めて言ったかも。【メンバ変数】のページを見て」
『ほいっと。うん、ボタンとかリストボックスとかのIDが並んでるね』
「リストボックスのID【IDC_LST_DATA】をダブルクリックして」
『ダブルクリック! ダイアログが出た』
「でまず一番上の【メンバ変数】を【m_cDataLstBox】に。真ん中の【カテ
ゴリ】を【コントロール】に。んで最後の【変数のタイプ】は、【CListBox】
に」
『あれ? 確か計算機の時は、カテゴリが【値】だったよね』
「そうそう。【値】も【コントロール】も、コントロールを変数として見な
す、っていう点は同じ」
『この例だと、ダイアログに貼っつけたリストボックスが m_cDataLstBox
って変数と同じになるってことだよね』
「で、リストボックスっていっぱい文字列が入るでしょ。そうなると、エ
ディットボックスみたいには操作できないわけ」
『どして?』
「 int i に何種類も数字入れられる?」
『ううん、ひとつ。そっか、リストボックスにはいっぱい入ってるから、一
個の変数って見なせないんだ』
「そう。エディットボックスはデータがひとつしか入らない、そういう場合
には【値】ってして、ひとつの変数って見なすことができます」
『で、リストボックスにはいっぱい入ってるから……どうして【コントロー
ル】?』
「【コントロール】の場合には、コントロールを操作することができるから」
『操作?』
「たとえば〈2番目の値を取得〉とかね」
『あ、なるほど! 【コントロール】は細かい操作ができるから、いっぱい
データが入っててもうまくできるんだ』
「そういうこと。実際、エディットボックスやチェックボックスとか以外は
ほとんど【コントロール】にして、操作してくことになるから」
『ってことはつまり、そーゆーコントロールを使うには、その操作の方法が
分かればOKってことよね』
「そういうこと! んじゃ【OK】押して」
『作成! で、どうなったんだっけ』
「今ので、リストボックスを m_cDataLstBox ってメンバ変数から操作でき
るようになりました」
『メンバ変数って、クラスの中の変数だよね。でもどのクラス?』
「今のクラスウィザードのページに書いてあるでしょ」
『あ、【クラス名】 CFileTestDlg だって』
「じゃあこのクラスの中から、 m_cDataLstBox を作ってる場所を探しましょ
う!」
『げげ。えーっと、 Ver 3.18 ( No. 043 )を見ると、メンバ変数はクラ
スの本体の方にあって、その本体はヘッダーファイルにあるから…… C 取
って .h 付けて、 FileTestDlg.h ってファイルにあるのかな』
「そうそう。見てみ」
『じゃ、ファイルビューから』
class CFileTestDlg : public CDialog
{
// 略
CListBox m_cDataLstBox;
// 略
};
『これが、 m_cDataLstBox を作ってるとこだよね』
「そうそう。こういうメンバ変数は、同じクラスのどのメンバ関数からも呼
び出すことができます」
『それって、この前教わった、ローカルな変数と違うってこと?』
「そう。メンバ変数はローカルな変数と、アクセスできる範囲とか寿命とか
全然違うから。その辺はおいおいだね」
『ほいほい。で、どうするの?』
「どうすればいいと思う? 最初の方針はどうだっけ」
『【表示】ボタンを押したら、だよね。あ、さっき作ったハンドラの
CFileTestDlg::OnBtnShow() もこのクラスのメンバ関数なんだ』
「そう、同じダイアログの操作は、同じクラス、つまり」
『 CFileTestDlg の中でってことになるんだ。だから【表示】のハンドラも、
リストボックスのメンバ変数も、 CFileTestDlg が持ってるんだ』
「そういうこと。で?」
『えーっと、さっき水希ちゃんが〈 m_cDataLstBox を操作して、リストボ
ックスを操作できる〉みたいに言ってたんだから……』
void CFileTestDlg::OnBtnShow()
{
m_cDataLstBox // ……
}
『……で、これのメンバ関数を呼べばいいんだろうけど……』
「このメンバ変数の型は?」
『 CListBox って書いてあるね。さっき、クラスウィザードで作るときに選
んだのだね』
「 CListBox は MFC のクラスのひとつ。リストボックスを操作するための
クラス」
『へー、そういうのが用意されてるんだ』
「ってことは?」
『 MSDN っ! えっと、 CListBox の上にカーソル置いて、 F1キー!
うお、色々出た』
「どれ選ぶ?」
『えーっと、確か〈日本語っぽいの〉から選ぶんだよね。で、
【CListBox::CListBox】ってのは分かんないけど、【CListBox クラスメン
バ】はたぶんメンバ変数とかメンバ関数がいっぱい見られるんだね。で、た
だの【CListBox】は、 CListBox の説明が載ってるっぽいから、これ!』
「そのページに CListBox の説明が載ってるから」
『……だけどチンプンカンプンなんですけど〜』
「そうかもしんない……。まーこの辺は、 MFC 解説書の方が詳しく書いて
あるかもね。それか、使いまくって習うより慣れろ、か」
『それ! じゃ、クラスメンバのページっと。ううっ、いっぱいある……』
「今回は、とりあえず適当な文字列を追加するのが目的だから」
『どれかなどれかな……あ、 AddString ってそれっぽくない?』
「当たり! んじゃ使ってみて」
『えっと、メンバ関数だから……』
m_cDataLstBox.AddString( );
『引数が LPCTSTR ってなってるけど?』
「前にちょっと触れたけど、これが出てきたら "あいうえお" みたいな文字
列を渡せるから」
『あ、じゃあそんな感じに』
void CFileTestDlg::OnBtnShow()
{
m_cDataLstBox.AddString( "あたし" );
}
『じゃ、ビルドして実行!! ……なにも起きないよ?』
「【表示】ボタン押さなきゃ」
『あ、そうそう。ぼちっと、リストボックスに【あたし】って出た!』
「このメンバ関数を立て続けに呼べば、どんどんリストボックスに追加でき
るから」
『こんな感じ?』
void CFileTestDlg::OnBtnShow()
{
m_cDataLstBox.AddString( "あたし" );
m_cDataLstBox.AddString( "水希ちゃん" );
m_cDataLstBox.AddString( "こんな感じ?" );
}
『あ、ちゃんとリストボックスに3つ出た!』
「これが、リストボックスを操作する、ってこと。まとめると?」
『ダイアログにリストボックス貼り付けたら、クラスウィザードで CListBox
型のメンバ変数にくっつけて、あとはそのメンバ変数で操作!』
「基本はそんなところ、だね」
/*
Preview Next Story!
*/
『なんだ、こんなのかんたんじゃん!』
「 LPCTSTR ってなーんだ」
『分かんない』
「その辺をしっかり潰していきましょう」
『というわけで次回』
< Version 5.03 配列とポインタ >
「につづく!」
『またつまんなくなりそう……』
「できることが増えれば、楽しくなるよ?」