シングルドキュメントクラスに対してツリーコントロールを組み込みツリーリスト内にファイルリストを標示してみる、皆さん参考にしてください、表示画面は2つに分割するこれは私が常用するもっとも得意なスキルです。
コントロ-ル・サンプルをダウンロードします。http://control-practice
画面を分割する機構を組み込む
ツリーコントロールを配置する
各ビューにメッセ^ジハンドラーを組み込む
良くあるのはビユーを切り替えると最初1回目の切り替えは良いのだが、2回目以降に例外が出てシステムが必ず落ちてしまうとかデバッグモードからリリースモードにして動かすと不安定で使い物にならないとか多くの問題に皆さん遭遇するが基本が守られていないために起きるのです、マイクロソフトの技術者はそこまで面倒を見てくれないし説明もしてはくれないだから皆さん断念するにです、私が教えてあげますよ最初から、皆さん勉強して下さい。
皆さんこれが正規のリストコントロール表示データ
もし!コントロールのデータを貴方がこのように定義する事が出来れば、もう例外は二度と起きなくなります。
この中に出てくるstaticと言うキーワードに注目してください、このキーワドには重要な意味があるのです。普通各クラスは動的に作成されていきます例を言えばお風呂に出来る泡のようなもので出来ては消えて行きますこれを絶えず行っていますがその泡の中に大事な参照データが作成されては他のクラスから参照が出来なくなってしまうのですそこでリンカーに対してこの大事な参照データを泡の中に作成する事を禁止する事をリンカーに知らせるのです、するとリンカーは外部固定データ範囲内に参照データが作成されていきます。
ツリー用に追加したフォ-ムビュ-
自動的に作成されたフォームビュ-(親はフォ-ムビュ-)ですがこれでは旨くいかないのですなので名前と継承を残して注意しながらクラスのメンバとかその他を書き換えてしまいます。
書き換えて変更を加えた内容
説明するのは困難ですが挑戦します
動画で見て貰えれば一番楽なのですが、皆さん見るのに抵抗あると思われますので動画は諦めて静止画で組み合わせてお見せしますします。
メインフレーム・クラスに加える機能
- メイン・フレームクラスからドキュメントクラスへの参照機能。
- 分割画面の管理関数の搭載。
- メッセージハンドラの搭載
フォ-ムビュ-の各ヘッダーを組み込みます
メインフレームCPPファイル先頭部に上記の様に記載します。基本的に全てのフォームビューは参照する必要が有ります。
メインフレームに追加
ないようはこの様に変数を追加した。
コードの記載と準備は、まだまだ延々と続ずく、皆さん着いてきてください。皆さんの期待に対して決して私は裏切らない!
メインフレームと各ビューとの応答メッセージを登録します。
ツ-ルバーは不要なので削除する
ツ-ルバーが消えています。
記載コードは下記の様に変更を加えています。
画面を分割するコードを実装
画面の分割処理関数を実装します
画面が二つに分割されました
手始めに左側ペインにツリ-コントロールを組み込みます
適当な階層フォルダーを新しく作成してツリーコントロール内にリストアップして見ましょう。
ツリコントロールのプロパテイは左の様に設定します。
この様なアプリも作れるのです
コントロールとはウインドイズを意味します
MFCで言うコントロールとは全てウインドウズとして実装します、単純に小さな大きさのウインドウズなのです、これらの意味する事を良く考えて理解してください。
メインフレームに追加
メインフレーム・ヘッダーファイルに宣言を行いその後にメインフレーム・CPPに追加します、フォームビューを切り替え及び管理するためにはドキュメントクラスへのアクセスが必要不可欠なんです、これから多種多彩のコーテイングを行っていきますが無駄なものは一切ありません言い換えれば絶対に必要な処理であり機能なんです。
重要なアルゴリズムに付いて
ツリ-ビュ-に表示する階層フォルダーとファイルをどのように調査すればいいんだ!と貴方は悩みませんか?再帰的スキャンを行えば良いのはと頭では理解しているが実際にコ-ドを記載するとなるとこれはさすがに難しい問題です、貴方ならどうしますか?ツリ-コントロールを使うにはどうしてもこの問題から避けることは出来ません。
再帰的にフォルダ-内を検索する関数です
非常に汎用性の高い再帰的な処理で貴方に公開します、色々な場面に使えると私は考えます。私は良く使いますから安心してお使いください。
ツリ-コントロールの初期化は単純ではない
初期化は色々な機能(関数)が集まって始めて初期化が出来る様になるんです、多数の山を乗り越えた其の後に初期化が可能になるのです。大変な作業です。だからこそ簡単に真似される事は有りません、覚えてしまえば貴方のスキルが格段にあがります。
コードは見やすく、関数は出来るだけ1画面に収まる様にしてください。だれが見るかも解りませんし、このコードが成果物であり商品だと貴方が認識して絶えずコーテイングして行きましょう。
リストコントロールに有るデータエリアは従属的には使用できません、ですからドキュメントクラスに実装しなくては打行けないのです、そうでなければビューの切り替えが行われたときにその保持データは失われてしまいます、そこで例外が発生してMFCが停止してしまいます.CString型は使えませんからキャストする事になりますので注意してください。
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
define MAX_PATH 1000
//======================================================//=============リストコントロール のデタ- ========================
static _TCHAR szShort_buffDim[100][8][MAX_PATH];
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
class ControlpracticeDoc : public CDocument