私はVisualStudioMFC関連の初心者です。小さなアプリケーションを作成する緊急の必要性があります。私はこれに固執している助けが必要です、そして私は次のデータを持っているテキストファイルを持っています。A-A1、A2ここで、Aはルートノードであり、A1A2は子ノードです。私の要件は、SDIMFCアプリケーションを作成する必要があることです。[ファイル]->[開く]->[xxx.txt](上記のデータが含まれています)に移動すると、A | _ A1 | _ A2(TREE VIEW)のような形式で表示される必要があります。トークン化する必要があるなど、多くのチュートリアルを経験しました。進め方など、本当に混乱しています。私は、ダイログベースでSDIを初めて使用しただけです。どんな助けでも大歓迎です。前もって感謝します。
2 に答える
コメントから収集できるものから、Codeprojectでリンクされている質問と同じ質問まで、少し助けを差し上げますが、質問がどれほど一般的であるかを考えると、答えもあまり具体的ではないでしょう。
まず、ツリービューを表示する場合は、ビュークラスをCTreeViewにする必要があります。CTreeViewは、CTreeCtrlが埋め込まれたCViewです。CEditViewは、CEditが埋め込まれたCViewであるため、テキスト(テキストエディタなど)を表示すると便利です。プレーンなCViewは特別な種類のコンテンツをサポートしていないため、自分で「描画」する必要があります。
ここで、ビューに何かを表示するには、それを表示するように指示する必要があります。ファイルを読むだけではうまくいきません。積極的に見せなければなりません。通常、ファイルからデータを何らかの構造に読み込んで、そこから表示します。または、データをツリーに直接保存することもできます。とにかく、CTreeView/CTreeCtrlの使い方を学ぶ必要があります。基本的に、CTreeCtrl::InsertItemを使用して要素を追加します。
トークン化については、あなたのフォーマットが理解できるかどうかはわかりませんが、ルートノードと子ノードで異なるセパレーターを使用すると思います。したがって、ROOT-Child1、Child2がある場合は、次のようにします。
int pos = 0;
CString strRoot = strLine.Tokenize(_T("-"), pos);
// do something with strRoot, like store it or display it in the tree
while (pos != -1)
{
CString strChild;
strChild = strLine.Tokenize(_T(","), pos);
// do something with strChild, like store it or display it in the tree
}
最後に、Doc / Viewアーキテクチャを使用する場合、データを表示から分離する方法があります。したがって、通常はデータをドキュメントに保持し、そこですべてのオープン/保存操作を実行してから、GetDocumentを使用してビューからドキュメント内のデータにアクセスして表示します。ビューにライブデータを含めることが理にかなっている場合もありますが、それは通常の方法ではありません。そのような場合は、代わりにダイアログベースのアプリにするのが理にかなっているかもしれません。
基本的に、私はdailogベースのアプリケーションのCTreeCtrlで作業しましたが、SDIで作業するのはこれが初めてです。そのような解決策を提供してくれて本当にありがとう。私は小さなコードを開発しましたそれを見てください
void CFileView::OnFileOpen()
{
// TODO: Add your command handler code here
CString pathname,strLine;
CStdioFile File;
if(File.Open(pathname, CFile::modeRead)) // Open to read
{
while(File.ReadString(strLine)) // Read file
{
int Position = 0;
CString Token;
Token = strLine.Tokenize(_T("-:,"), Position);
HTREEITEM hRoot = m_wndFileView.InsertItem(Token, 0, 0);
while(Token!="")
{
Token = strLine.Tokenize(_T("-:,"), Position);
HTREEITEM hSrc = m_wndFileView.InsertItem(Token, 0, 0, hRoot);
}
}
}
}
私のポイントのように、コードを正しい関数に配置していますか?つまり、ファイルを開く場所です。クライアントウィンドウでは、空白のウィンドウではなく何も表示されないためです。SDIはCTreeViewクラスに基づいています。これで、トークナイザーとツリーコントロールの部分が明確になりましたが、クライアントウィンドウに何も表示されないのはなぜか混乱しています:(