コントロ-ルが表示されない

普通は!たったこれだけでDrawItemが呼ばれてくる。

DrawItemがトリガ-されず更新されない

さて!コントロ-ルの初期化は終わり表示しようと起動するが表示されないそこで!皆さんは物凄く悩む、しかしウインドウズから許可が下りなければDrawItemuは起動されないし表示もされない、どうすれば良いのか

普通は皆さんがパニックに陥る

私はVC2022でひどい目にあった、上記の件が発生した色々と確認して見たが原因が不明で不安定であり、信用できないと私は判断し!そこでVC++02005に戻した何も問題は起きない。皆さん最大限に注意して欲しい。

これが表示制御の中身です

上記図はもっと見やすくした

コントロ-ルにあわせ持つメモリ-は絶体に使わない必ず外部にあわせ持つ、例外の発生になる確率は100%です。Vew1_ItemGroup1[nItem]が外部の変数です。コントロ-ルを使うのはRectの範囲を取得するのが目的です、その範囲を使いDrawTextで表示する、これが基本です。

どの様な構成にすれば皆さんが扱いやすいか悩んでいます。

簡単で早く献立を計画するには?何が必要か?

悩んでいます!どうすればいいのか。栄養素は約60種類は有るのですがそれらは隠しておいて必要な時に見れれば良いと思うのですが、皆さんはどう思われますか?私は食材名と栄養素の値上下限から検索だ出来る様に考えています。現在世の中で出回っている献立で使われている食材名では検索出来ない、そう厚生労働省が出している栄養素の一覧表で搭載されている食材の名前が違うのです!皆さん実にいい加減な物なんです、だって名前が違えば対応する食材が特定出来ないのではと私は思うのです。下記の画像で「まあじ」ですが、これが正式名称です、まあじと言うだけで何十種類もあるんですよ!これでバランスの取れた食事とは悲し~

上記画像の下段の表は五大栄養素を確認する箇所、栄養素の項目は横一列で69項目有りますが普通は皆さん見ないでしょう!から極力見せず栄養素の構成が早く出来る様に1食~3食と1週間~1か月へと構造化して行きます、現在その状況に沿いながらデータベースを考慮中です、これから更にページが増えて行きます。栄養素も上下限で検索、更に食材も名前で検索できるようにしています。

MFCの各クラスは隠蔽されている為に直には操作が出来ない!

そこでメッセ-ジハンドラ-が中間をとる、前にもお話ししているのだか例を言えば何本も国道が平行に走り、そしてこの国道は決して交わる事は無い、只この国道は全く別機能をする国道なのである。この国道を唯一渡り合えるのがメッセ-ジハンドラ-なのです。そしてこの国道にWindowsが決めた内容で機能を構築していくのだが。この国道は予め機能が決められているそれが各クラスなのです。アプリケ-ションクラス・メインフレ-ムクラス・ドキュメント・クラスともう一つ紙芝居で使う絵の板ですこれを含めてフレ-ムクラスと言われるものです。これらの国道がWindowz側から送られてくる指示に従い動いていくのです。これらがタイムシェアリングで動くと言う事で昔の様にデバッグが簡単では無く難しいのです。だからこそ、この動きを理解する必要がある。上記のアプリケ-ションはメッセージが右や左に多量に飛び回っている。覚え方は自転車で来る紙芝居ですね!各クラスの置かれ方を理解すればよい、各クラス共に協調性はない!全く機能毎に別々である。インタ-フエスはメッセ-ジハンドラ-だけでありこれらを順序良く必要な時に呼び出すのがウインドウズなのです。

画面が小さくコントロ-ルが隠れている、他のウインドウと重なる

このような場合は例えば「IDC_LIST1」が隠れていた場合などはIDC_LIST1が記載済みのDrawItemの表示処理はウインドウズから呼び出されることは無い、即ち表示する必要が無いとウインドウズから認識されている為に何ですけどもこれが結構知らないとパニックに陥るんですね!注意して下さいね特にデバック中ですが?MFCで扱う全てのコントロ-ルがウインドウズであると言う事を忘れないで下さい。

投稿を編集

更新

総エネルギー量の計算を追加しました

栄養素の役割の説明を加えました

だいぶ高度で高機能になって来ました!

このアプリケ-ションが有れば貴方はもう立派な栄養管理士になれると思います(笑い)。何しろ正確な栄養管理出来てしまいます、画面左側に栄養素エネルギ-がリアルタイムで表示されて来ます、自宅で病院食以上の物を貴方の手で料理する事が可能になります。あなたは信じてくれますか?

血糖値の管理を行うとともに予想を立てるには?

コントロ-ルとはウインドウズであり、多種の制御が可能!

食材の操作のバグ取りは保母終わりました、これからは献立が主体

かなり複雑な操作をしています。でも問題は無いようです、なのでユチュ-ブで操作方法を説明を行なおうとしています、が鳴り画面がめまぐるしく変化します。でもどうしてもやり易さから自然の流れを取っています食材が2700もあり、更に栄養素が68項目ありますから普通は大変です、これらを携帯端末でやると言う事自体私には理解出来ません。

画面左側にツリ-が加わりました

PFCバランスも加わり保母初期の段階は終了したかな~と思いますが、更に画面右上部には基本食材重量ガイドも搭載しました、マルチ処理の見本の様です!そうですウィンドウズはマルチタスクに近いのです、だからこそ疑似タスクと申します。栄養素エネルギ-表も追加してあります、次の作業は料理の構築作業です、これから更に作業が複雑になって行きます。この上の栄養素では脂質の摂取が大きすぎその他のタンパク質と炭水化物が少なすぎです、と言う様にリアルタイムで改善する事が出来ます、脂質が不足している場合に有効ですよね!かやってなに!私は知らない。

調べてみました(栄養満点の和製アーモンド、榧の実栄養満点の和製アーモンド、榧の実

榧の木は日本に古くからある樹木です。木材は将棋の盤として最高級の材料とも言われています。榧の木にはオリーブに似た緑色の実がつき、その中に殻を被った種(榧の実)が入っています。榧の実は栄養素を豊富に含んでいて縄文時代から大切な食糧のひとつとされてきました。

私のツリ-制御はコントロ-ルと更に見えないがツリ-が使われている

このツり-は単純には作れません、その為に更に裏で別にリストコントロ-ルとかツリ-が使われています。これらを組み合わせてこの様に実現させています、まずディレクトリ-の検索用と予め組み込みラベルの収集と更にリストの組み立て等々ですプログラムコードは複雑です、後でユチュ-ブで動画をお見せします!

ツリ-が有るビュ-の初期化コード

void Vew1_Form::OnInitialUpdate()
{
	CFormView::OnInitialUpdate();
	GetParentFrame()->RecalcLayout();
	ResizeParentToFit();

	
	CFoodNutrinetDoc* pDoc = GetDocument();
	//==============================================================	
	CRect rect;
	GetClientRect(&rect)    ;
	int cx = rect.Width()   ;
	int cy = rect.Height()  ;
	pDoc->RemoveNmber=_T("");
	//==============================================================	
	CString dir=(LPCTSTR)pDoc->ms_RegDetaList.RecipiDir;
	SearchFile(dir);

	CBitmap myBMP;
	//==============================================================	
	m_imagelist.Create(16, 16, ILC_COLOR, 4, 4);
	//==============================================================	
	myBMP.LoadBitmapW(IDB_TABmenu1); m_imagelist.Add(&myBMP, COLORREF(0)); myBMP.DeleteObject();
	myBMP.LoadBitmapW(IDB_TABmenu2); m_imagelist.Add(&myBMP, COLORREF(0)); myBMP.DeleteObject();
	myBMP.LoadBitmapW(IDB_TABmenu3); m_imagelist.Add(&myBMP, COLORREF(0)); myBMP.DeleteObject();
	myBMP.LoadBitmapW(IDB_TABmenu4); m_imagelist.Add(&myBMP, COLORREF(0)); myBMP.DeleteObject();
	myBMP.LoadBitmapW(IDB_TABmenu5); m_imagelist.Add(&myBMP, COLORREF(0)); myBMP.DeleteObject();
	myBMP.LoadBitmapW(IDB_TABmenu6); m_imagelist.Add(&myBMP, COLORREF(0)); myBMP.DeleteObject();
	myBMP.LoadBitmapW(IDB_TABmenu7); m_imagelist.Add(&myBMP, COLORREF(0)); myBMP.DeleteObject();
	myBMP.LoadBitmapW(IDB_TABmenu8); m_imagelist.Add(&myBMP, COLORREF(0)); myBMP.DeleteObject();
	//==============================================================
	TC_ITEM tac0; tac0.mask = TCIF_IMAGE | TCIF_TEXT; tac0.iImage = 0;
	TC_ITEM tac1; tac1.mask = TCIF_IMAGE | TCIF_TEXT; tac1.iImage = 1;
	TC_ITEM tac2; tac2.mask = TCIF_IMAGE | TCIF_TEXT; tac2.iImage = 2;
	TC_ITEM tac3; tac3.mask = TCIF_IMAGE | TCIF_TEXT; tac3.iImage = 3;
	TC_ITEM tac4; tac4.mask = TCIF_IMAGE | TCIF_TEXT; tac4.iImage = 4;
	TC_ITEM tac5; tac5.mask = TCIF_IMAGE | TCIF_TEXT; tac5.iImage = 5;
	TC_ITEM tac6; tac6.mask = TCIF_IMAGE | TCIF_TEXT; tac6.iImage = 6;
	TC_ITEM tac7; tac7.mask = TCIF_IMAGE | TCIF_TEXT; tac7.iImage = 7;
	//==============================================================
	tac0.pszText = _T("料理一覧") ;CT_Tab1.InsertItem(0,&tac0);
	tac1.pszText = _T("検索条件") ;CT_Tab1.InsertItem(1,&tac1);
	tac2.pszText = _T("食材一覧") ;CT_Tab1.InsertItem(2,&tac2);
	tac3.pszText = _T("料理編集") ;CT_Tab1.InsertItem(3,&tac3);
	tac4.pszText = _T("栄養_画面");CT_Tab1.InsertItem(4,&tac4);
	tac5.pszText = _T("献立_画面");CT_Tab1.InsertItem(5,&tac5);
	tac6.pszText = _T("--------") ;CT_Tab1.InsertItem(6,&tac6);
	tac7.pszText = _T("--------") ;CT_Tab1.InsertItem(7,&tac7);
	//==============================================================
	CT_Tab1.SetImageList(&m_imagelist);
	CT_Tab1.MoveWindow(5,1,300,25);
	CT_Tab1.ShowWindow(SW_SHOW);
	//=======================検索条件==========================
	LV_COLUMN  lvc;
	lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
	for (int i = 0; i < 4; i++) {
			lvc.iSubItem = i;
			lvc.pszText = Vew1HeaderGroup1[i];//栄養素判定の設定リスト
			lvc.fmt     = LVCFMT_LEFT        ;	
			lvc.cx      = Vew1HeaderGroupWidth[i];
			IDC_ListCtrl1.InsertColumn(i, &lvc)  ;
			}
	//======================食材大分類==========================
	for (int i = 0; i < 1; i++) {
		lvc.iSubItem = i;
		lvc.pszText = _T("");
		lvc.cx = 150;
		lvc.fmt = LVCFMT_CENTER;
		IDC_ListCtrl2.InsertColumn(i, &lvc);
		}
	//======================食材リスト==========================
	for (int i = 0; i <2; i++) {
		lvc.iSubItem = i;
		lvc.pszText = _T("") ;
		if(i==0) lvc.cx = 35 ;
		else     lvc.cx = 500;
		lvc.fmt = LVCFMT_CENTER;
		IDC_ListCtrl3.InsertColumn(i, &lvc);
		}
	//=======================検索条件=============================
	LV_ITEM     lvi;
	lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
	lvi.iSubItem = 0;
	for (int i = 0; i <63; i++) {
			lvi.iItem = i  ;
			lvi.pszText = Vew1_ItemGroup1[i];
			IDC_ListCtrl1.InsertItem(&lvi)  ; 
			}
	//====================食材大分類================================
	for (int i = 0; i < 19; i++) {
			lvi.iItem = i  ;
			lvi.pszText = FoodGroups[i];
			IDC_ListCtrl2.InsertItem(&lvi);// 
			}
	//====================食材リスト================================

	for (int i = 0; i < 19; i++) {
			lvi.iItem = i  ;
			lvi.pszText = _T("");
			IDC_ListCtrl3.InsertItem(&lvi);// 
			}
	//==============================================================
	CTreeCtrl1.MoveWindow(5, 30,300, 500) ;//料理一覧
	CTreeCtrl2.MoveWindow(5, 30,300, 500) ;//食材一覧
	CTreeCtrl3.MoveWindow(5, 30,300, 500) ;//栄養素一覧
	CTreeCtrl4.MoveWindow(5, 30,300, 500) ;//献立一覧
	//==============================================================
	IDC_ListCtrl1.MoveWindow(   5,60, 300, cy+100) ;//検索条件
	IDC_ListCtrl2.MoveWindow(   5,60, 160, 390)    ;//食材大分類
	IDC_ListCtrl3.MoveWindow(150 ,60, 400, 390) ;//食材リスト
	//==============================================================
	IDC_Bouttn1.MoveWindow(5, 560, 300, 35) ;//検索開始
	IDC_Bouttn1.ShowWindow(SW_HIDE)  ;
	IDC_Bouttn2.MoveWindow(5, 460, 290, 35) ;//画面1切り替え
	IDC_Bouttn2.ShowWindow(SW_HIDE)  ;
	IDC_Bouttn3.MoveWindow(5, 500, 290, 35) ;//画面2切り替え
	IDC_Bouttn3.ShowWindow(SW_HIDE)  ;
	IDC_Bouttn4.MoveWindow(5, 540, 290, 35) ;//画面3切り替え
	IDC_Bouttn4.ShowWindow(SW_HIDE)  ;
	//==============================================================
	CTreeCtrl1.ShowWindow(SW_HIDE)   ;
	CTreeCtrl2.ShowWindow(SW_HIDE)   ;
	CTreeCtrl3.ShowWindow(SW_HIDE)   ;
	CTreeCtrl4.ShowWindow(SW_HIDE)   ;
	CeditControl1.ShowWindow(SW_HIDE);//レシピ名
	//==============================================================
	CeditControl3.SetWindowTextW(_T("検索する食材名"));//ラベル
	CeditControl3.ShowWindow(SW_HIDE);//ラベル
	CeditControl3.MoveWindow(  5,32,100,16);
	CeditControl4.SetWindowTextW(_T("「,」で区切って設定 (例)あわ"));//食材名
	CeditControl4.ShowWindow(SW_HIDE);//食材名
	CeditControl4.MoveWindow(110,30,180,16);
	//==============================================================
	ms_ClickAfter2.Click=FALSE;
	ms_ClickAfter2.DbleClick=FALSE;
	ms_ClickAfter3.Click=FALSE;
	ms_ClickAfter3.DbleClick=FALSE;

	//==============================================================
	HTREEITEM childhItem = CTreeCtrl1.GetSelectedItem();
	HTREEITEM lhNextItem = CTreeCtrl1.GetNextItem(childhItem, TVGN_CHILD);
	CTreeCtrl1.Expand(lhNextItem, TVE_EXPAND);

	DishRecipiTree();
}

ツリ-の構築する最初のコードです

/////////////////////////////////////////////////////////////////////////////
//////////////////////     レシピツリー構築 ctTreeCtrl1       ////////////////////
void Vew1_Form::DishRecipiTree()
{
	CFoodNutrinetDoc* pDoc = GetDocument();
    //=======================================================================
	char* buffer    ;
	char  werk[2048];
	WCHAR buf[2048] ;
    //=======================================================================
	int root=0;	
    //=======================================================================
	CString Dir=_T(""),RecipiGuid=_T("");
	pDoc->RechipiDirectoryPath=_T("N://VC++ 2022 slh/DietaryCure/");
    //=======================指定されたレシピディレクトリー==================
	Dir.Format(_T("%s"),pDoc->RechipiDirectoryPath);//指定されたレシピディレクトリー
	CArray<s_HandleCon,s_HandleCon> arrayHandle;
	//============ディレクトリー文字列最後に\マークが有る為これを除く=================
	for(int i=0;i<2048;i++) buf[i]=0L;
	for(int i=0;i<Dir.GetLength();i++) buf[i]=Dir.GetAt(i);
    //===============ファイルの位置が特定されていない場合の処理==================
	if(0==Dir.GetLength()) {
			RecipiGuid.Format(_T("[マウスの右クリックで指定]レシピ・リスト"))   ;
			m_HondTree[root+1]=CTreeCtrl1.InsertItem(RecipiGuid,TVI_ROOT);
			CTreeCtrl1.SetItemImage(m_HondTree[root++],0,1);
			return;
			}
	//------------現在の起動ディレクトリー-----------------------------------
	if( (buffer = _getcwd( NULL, 0 )) == NULL )  {
		                ::MessageBox(0,L"異常[000-0003-008]",L"!!!起動できません!!!",MB_OK);
						exit(TRUE);
						}
	//===================================================================
	for(int i=0;i<2048;i++)  werk[i]=0;
	strcpy_s(werk,buffer);free(buffer);
	CString localMDir=(CAtlStringW)werk;//保存する現在の起動ディレクトリー
	//==============指定されたレシピディレクトリーへ移動=================
	for(int i=0;i<2048;i++)  buf[i]=0L;
	for(int i=0;i<Dir.GetLength()-1;i++) buf[i]=Dir.GetAt(i);
	_wchdir(buf );//指定されたレシピディレクトリーへ移動
	//===================================================================
	if( (buffer = _getcwd( NULL, 0 )) == NULL )  exit(TRUE);
	free(buffer);
	//================  arrayDirectoryList.Add(finFile)  ================
	SearchFile(Dir);//ワークディレクトリーをリストに追加します
	//===================================================================
	IDC_ListCtrl4.DeleteAllItems();
	arrayRecipiHandl.RemoveAll()  ;
	//===================================================================
	LV_ITEM lvi;
	int   rop=0;
	lvi.mask = LVIF_TEXT | LVIF_IMAGE |LVIF_PARAM ; 
	//==================================================
	for(int i=0;i<(int)arrayDirectoryList.GetCount();i++){
			lvi.iItem    =i;
			lvi.pszText  =_T("");
			IDC_ListCtrl4.InsertItem(&lvi);
			CString vl=arrayDirectoryList.GetAt(i);
			TreeMenberChck(vl);
			}
}

ツリを作成するコードです

bool Vew1_Form::TreeMenberChck(CString vn)
{
	CFoodNutrinetDoc* pDoc = GetDocument();

	s_TreeControl ms_TreeControl;
	ms_TreeControl.CharLine=vn  ;

	//===========================================================
	vn.Replace(pDoc->RechipiDirectoryPath,_T(""));//ルート名は削除
	vn.Replace(_T(".."),_T("."));
	int count=0,Nest=1           ;
	int it1=(int)arrayRecipiHandl.GetCount();
	//===========================================================
	if(arrayRecipiHandl.GetCount()!=0){
		    HTREEITEM  lhChildItem=NULL;
			//--------------------------
			int count=0                ;
		    s_TreeControl ms_Tr,ms_Merk;
		    CString tkn=vn.Tokenize(_T("\\"),count);
			while(tkn!=""){
				    CArray<CString,CString> nestName;
					nestName.Add(tkn)               ;
					for(int i=0;i<arrayRecipiHandl.GetCount();i++){
							ms_Tr=arrayRecipiHandl.GetAt(i); 
							//同一の階層で同一の階層名があるか確認
							if((ms_Tr.HierarchicalNumber==Nest)&&(ms_Tr.Categori==tkn)){
											++Nest                 ;
											ms_Merk=ms_Tr          ;
											lhChildItem=ms_Tr.hItem;
											tkn=vn.Tokenize(_T("\\"),count);//有った場合更に次の階層を確認
											nestName.Add(tkn)      ;//階層の履歴を作成
											if(tkn=="") return TRUE;
											}
							}
					//------------------------------------------------
					if(lhChildItem!=NULL){//親の階層が有る場合
						    CString FilVal=_T("")         ;
							int cb=(int)nestName.GetCount()-1;//階層の深さ オフセット-1した値
							FilVal=nestName.GetAt(cb-1)   ;//今の階層より一っ前が親の階層
							//----------------------------
						    ms_TreeControl.val=vn         ;
							ms_TreeControl.Categori=tkn   ;
							FilVal+=+_T("\\")+tkn+_T("\\");
							ms_TreeControl.HierarchicalNumber=Nest;
							ms_TreeControl.hItem=CTreeCtrl1.InsertItem(tkn,lhChildItem,TVI_LAST);
							arrayRecipiHandl.Add(ms_TreeControl);
							tkn=vn.Tokenize(_T("\\"),count)     ; 
							while(tkn!=""){
									++Nest               ; 
									ms_TreeControl.val=vn;ms_TreeControl.Categori=tkn; ms_TreeControl.HierarchicalNumber=Nest;
									ms_TreeControl.hItem=ms_TreeControl.hItem=CTreeCtrl1.InsertItem(tkn,ms_TreeControl.hItem,TVI_LAST);
									arrayRecipiHandl.Add(ms_TreeControl);
									tkn=vn.Tokenize(_T("\\"),count)        ;
									}
							return TRUE;
							}

					//------------------------------------------------
					else   { //階層が無い場合新しく追加する
						    HTREEITEM lhChildItem=CTreeCtrl1.GetChildItem(0)    ;
							CString tkn=vn.Tokenize(_T("\\"),count=0),FilVal=_T("");
							ms_TreeControl.hItem=lhChildItem;
							arrayRecipiHandl.Add(ms_TreeControl);
							ms_TreeControl.val=vn       ;
							ms_TreeControl.Categori=tkn ;
							ms_TreeControl.HierarchicalNumber=Nest;
							FilVal=tkn+_T("\\");
							ms_TreeControl.hItem=CTreeCtrl1.InsertItem(tkn,lhChildItem,TVI_LAST);
							arrayRecipiHandl.Add(ms_TreeControl);
							tkn=vn.Tokenize(_T("\\"),count)     ; 
							while(tkn!=""){
									++Nest               ; 
									ms_TreeControl.val=vn;ms_TreeControl.Categori=tkn; ms_TreeControl.HierarchicalNumber=Nest;
									ms_TreeControl.hItem=ms_TreeControl.hItem=CTreeCtrl1.InsertItem(tkn,ms_TreeControl.hItem,TVI_LAST);
									arrayRecipiHandl.Add(ms_TreeControl);
									tkn=vn.Tokenize(_T("\\"),count)     ;
									}
						   return TRUE;
						   }
					}
			}
	//==================================================================================
	else {	
		    HTREEITEM lhChildItem=CTreeCtrl1.GetChildItem(0)    ;
		    CString tkn=vn.Tokenize(_T("\\"),count),FilVal=_T("");
			ms_TreeControl.hItem=lhChildItem;
			arrayRecipiHandl.Add(ms_TreeControl);
			ms_TreeControl.val=vn       ;
			ms_TreeControl.Categori=tkn ;
			ms_TreeControl.HierarchicalNumber=Nest;
			FilVal=tkn+_T("\\");
			ms_TreeControl.hItem=CTreeCtrl1.InsertItem(tkn,lhChildItem,TVI_LAST);
			arrayRecipiHandl.Add(ms_TreeControl);
			tkn=vn.Tokenize(_T("\\"),count)     ;
			int test=(int)arrayRecipiHandl.GetCount();
			while(tkn!=""){
					++Nest; 
					ms_TreeControl.val  =vn;ms_TreeControl.Categori=tkn; ms_TreeControl.HierarchicalNumber=Nest;
					ms_TreeControl.hItem=CTreeCtrl1.InsertItem(tkn,ms_TreeControl.hItem,TVI_LAST);
					arrayRecipiHandl.Add(ms_TreeControl);
					tkn=vn.Tokenize(_T("\\"),count)     ;
					}
		return true;
		}
	return TRUE;
}

構造体

//==============================
//==============================
typedef struct TreeControl {
	HTREEITEM   hItem;
	CString       val;
	CString   FilName;
	CString   VeryKind;
	CString   Categori;
	CString   CharLine;
	int HierarchicalNumber;//階層番号
}s_TreeControl;

構造体定義部分

	CArray<s_TreeControl,s_TreeControl> arrayRecipiHandl;

ディレクトリ-の構造を収集する関数

//=========================================================
//=========指示されたディレクトリ-の内容を調査します======

CString Vew1_Form::SearchFile(CString strFolder)
{
	CFileFind FileFind;
	//=======================================================
	CString finFile = _T("");
	//=======================================================
	CString strSearchFile = strFolder + _T("\\*.*");// すべてのファイルを検索
	if (!FileFind.FindFile(strSearchFile))	return _T("");
	//=======================================================
	TRACE("%s/n", strFolder);
	BOOL bContinue = TRUE;
	//=======================================================
	while (bContinue) {
			bContinue = FileFind.FindNextFile();
			// ドット("." , "..")の場合 無視
			if (FileFind.IsDots())
							continue;
			// ディレクトリの場合、そのディレクトリ内を検索するため再起呼び出し
			if (FileFind.IsDirectory()) {
						BOOL eqFrg = FALSE;
						finFile = SearchFile(FileFind.GetFilePath());
						if (arrayDirectoryList.GetCount() == 0) arrayDirectoryList.Add(finFile);
						//=======================================================
						for (int i = 0; i < arrayDirectoryList.GetCount(); i++) {
									if (0 <= arrayDirectoryList.GetAt(i).Find(finFile)) eqFrg = TRUE;
									}
						//=======================================================
						if (eqFrg == FALSE) arrayDirectoryList.Add(finFile);
						}
				else {
					// ファイルの場合
					BOOL eqFrg=FALSE;
					finFile=FileFind.GetFilePath()   ;
					if(0<=finFile.Find((_T("BodeyInformation"))))       ;
					else if(0<=finFile.Find((_T("FoodConfig"))))         ;
					else if(0<=finFile.Find((_T("InsulinInformation"))));
					else if(0<=finFile.Find((_T("StandardNutrient"))))  ;
					else if(0<=finFile.Find((_T("確定ファイル"))))           ;
					else if(0<=finFile.Find((_T("prc"))))                ;
					else{
							finFile.Replace(_T("bmp"),_T(""));
							finFile.Replace(_T("rcp"),_T(""));
							if(arrayDirectoryList.GetCount()==0) arrayDirectoryList.Add(finFile);
							for(int i=0;i<arrayDirectoryList.GetCount();i++){
											if(0<=arrayDirectoryList.GetAt(i).Find(finFile)) eqFrg=TRUE;
											}
							if(eqFrg==FALSE) arrayDirectoryList.Add(finFile);
						}
				}
			}
	return strFolder;
}

ファイル保存時の手順(構造体を作成する)

typedef struct DIETARY_CURE {
WORD TimeZon;
//==========================
WCHAR TargetCalories; //基本の目標カロリ-
WCHAR TotalCaloriesv; //実際に接種出来る総合カロリ-
WCHAR Proteins;//タンパク質
WCHAR Lipids;         //脂質
WCHAR Carbohydrates;  //炭水化物
WCHAR Vitamins;       //ビタミン
WCHAR Mineral;        //ミネラル 
//==========================
WCHAR  AnserVal[20][60]; //エネルギ-各計算値
//==========================
WORD ThePresenceOofOthers;//人前
WORD Age;//年齢
WORD TargetTotalCalories ;//目標総合カロリ-
//==========================
WCHAR Dir[256];//デイレクトリ-
WCHAR CookingName;//料理名
//==========================
WCHAR PersonalName[80];//個人の名前
WCHAR ID_Nmber[20];
WCHAR Time[50];//作成時間
WCHAR Recipi[4096*2];//料理方法
WCHAR FoodName[64];//料理名
WCHAR aMountUsed[128];//人前 6桁から成る数字X配列 使用量
WCHAR FoodNmber[128];//食材番号 6桁から成る数字X配列 食品番号
}s_DietaryCure;

変数にデータを入れる例

ZeroMemory(&ms_DietaryCure,sizeof(s_DietaryCure));
swprintf_s(ms_DietaryCure.AnserVal[0],sizeof(ms_DietaryCure.AnserVal[0])/sizeof(WCHAR),L"%s",(LPCTSTR)AnserVal[0]);//総合カロリ-
swprintf_s(ms_DietaryCure.AnserVal[1],sizeof(ms_DietaryCure.AnserVal[1])/sizeof(WCHAR),L"%s",(LPCTSTR)AnserVal[1]);//タンパク質
swprintf_s(ms_DietaryCure.AnserVal[2],sizeof(ms_DietaryCure.AnserVal[2])/sizeof(WCHAR),L"%s",(LPCTSTR)AnserVal[2]);//脂質
swprintf_s(ms_DietaryCure.AnserVal[3],sizeof(ms_DietaryCure.AnserVal[3])/sizeof(WCHAR),L"%s",(LPCTSTR)AnserVal[3]);//炭水化物
swprintf_s(ms_DietaryCure.AnserVal[4],sizeof(ms_DietaryCure.AnserVal[4])/sizeof(WCHAR),L"%s",(LPCTSTR)AnserVal[4]);//糖質
swprintf_s(ms_DietaryCure.AnserVal[5],sizeof(ms_DietaryCure.AnserVal[5])/sizeof(WCHAR),L"%s",(LPCTSTR)AnserVal[5]);//食塩相当量
swprintf_s(ms_DietaryCure.AnserVal[6],sizeof(ms_DietaryCure.AnserVal[6])/sizeof(WCHAR),L"%s",(LPCTSTR)AnserVal[6]);//リン
swprintf_s(ms_DietaryCure.AnserVal[7],sizeof(ms_DietaryCure.AnserVal[7])/sizeof(WCHAR),L"%s",(LPCTSTR)AnserVal[7]);//動物性タンパク質比率
swprintf_s(ms_DietaryCure.AnserVal[8],sizeof(ms_DietaryCure.AnserVal[8])/sizeof(WCHAR),L"%s",(LPCTSTR)AnserVal[8]);//動物性脂質の重量
swprintf_s(ms_DietaryCure.AnserVal[9],sizeof(ms_DietaryCure.AnserVal[9])/sizeof(WCHAR),L"%s",(LPCTSTR)AnserVal[9]);//穀類比率

ファイル書き込み部分

//=============================================
bool CFoodNutrinetDoc::MemberReshpiFileSave()
{
	CFile myFile,myFileDami;
	ULONGLONG dwLength1=0L ;
	//=========================================
	CFileException fileException;

	if(0==ms_FoodFind.GetCount()) return FALSE;//食材が選択されていない

	//==============================================================================================
	CString OpenFileName=RechipiDirectoryPath+ManualReshipName+_T(".rcp");
	//==============================================================================================
	if(!myFile.Open(OpenFileName,CFile::modeReadWrite | CFile::typeBinary, &fileException)){
					if(!myFile.Open(OpenFileName,CFile::modeCreate | CFile::modeReadWrite | CFile::typeBinary, &fileException))	return true;
					}
	//============================================================
	for(int j=0;j<(int)ms_FoodFind.GetCount();j++){
				ms_DietaryCure.TimeZon=TimeZon;
				myFile.Write(&ms_DietaryCure,sizeof(ms_DietaryCure));
				}
	myFile.Close();
	return TRUE;
}

食材組み立てとPFC

食材組み立て

ファイル・アクセス関数

//=============================================
bool CFoodNutrinetDoc::MemberReshpiFileSave()
{
	CFile myFile,myFileDami;
	ULONGLONG dwLength1=0L ;
	//=========================================
	CFileException fileException;

	if(0==ms_FoodFind.GetCount()) return FALSE;//食材が選択されていない

    WCHAR Amount[1][20]   ;//使用量
    WCHAR AmountUse[1][20];//人前  
	WCHAR FoodNmber[1][20];//食材番号
	//==============================================================================================
	CString OpenFileName=RechipiDirectoryPathName+ManualReshipName+_T(".rcp");
	//==============================================================================================
	if(!myFile.Open(OpenFileName,CFile::modeReadWrite | CFile::typeBinary, &fileException)){
					if(!myFile.Open(OpenFileName,CFile::modeCreate | CFile::modeReadWrite | CFile::typeBinary, &fileException))	return true;
					}
	//============================================================
	ms_DietaryCure.Size=(WORD)ms_FoodFind.GetCount()    ;//食材数
	myFile.Write(&ms_DietaryCure,sizeof(ms_DietaryCure));
	//============================================================
	for(int j=0;j<(int)ms_FoodFind.GetCount();j++){
				swprintf_s(Amount[0],sizeof(Amount[0])/sizeof(WCHAR),L"%s",(LPCTSTR)ms_FoodFind.GetAt(j).Amount) ;//使用量
				swprintf_s(AmountUse[0],sizeof(AmountUse[0])/sizeof(WCHAR),L"%s",(LPCTSTR)ms_FoodFind.GetAt(j).AmountUsed);//人前
				swprintf_s(FoodNmber[0],sizeof(FoodNmber[0])/sizeof(WCHAR),L"%s",(LPCTSTR)ms_FoodFind.GetAt(j).sVal[1])   ;//食材番号
				myFile.Write(&Amount,sizeof(Amount))      ;//使用量
				myFile.Write(&AmountUse,sizeof(AmountUse));//人前
				myFile.Write(&FoodNmber,sizeof(FoodNmber));//食材番号
				}
	myFile.Close();
	return TRUE;
}

/////////////////////////////////////////////////////////////////////////////////
bool CFoodNutrinetDoc::MemberReshpiFileRead()
{
	CFile myFile,myFileDami;
	ULONGLONG dwLength1=0L,dwPosition1=0L;

	//=========================================
	CFileException fileException;

	//=========================================
	if(RechipiDirectoryPath=="") return FALSE;

	//==============================================================================================
	CString OpenFileName=RechipiDirectoryPathName+_T(".rcp");
	//==============================================================================================
	if(!myFile.Open(OpenFileName,CFile::modeReadWrite | CFile::typeBinary, &fileException)){
					if(!myFile.Open(OpenFileName,CFile::modeCreate | CFile::modeReadWrite | CFile::typeBinary, &fileException))	return true;
					}
	//=============ファイル全体の大きさを予め確認します===========
	myFile.SeekToBegin();
	dwLength1=myFile.GetLength();dwPosition1=myFile.GetPosition();
	//==================================================================
	myFile.Read(&ms_DietaryCure,sizeof(s_DietaryCure));
	//==================================================================
	WCHAR Amount[1][20]   ;//使用量
	WCHAR AmountUse[1][20];//人前  
	WCHAR FoodNmber[1][20];//食材番号
	s_FoodWerk ss_LocalWerk; 
	for(int i=0;i<ms_DietaryCure.Size;i++){
				CString A1,A2,A3;
				myFile.Read(&Amount,sizeof(Amount))      ;//使用量
				myFile.Read(&AmountUse,sizeof(AmountUse));//人前
				myFile.Read(&FoodNmber,sizeof(FoodNmber));//食材番号
				A1.Format(_T("%s"),Amount);	A2.Format(_T("%s"),AmountUse);A3.Format(_T("%s"),FoodNmber);
				ss_LocalWerk.Amount.Format(_T("%s"),A1);ss_LocalWerk.sVal[1].Format(_T("%s"),A3);ss_LocalWerk.AmountUsed.Format(_T("%s"),A2);
				ms_FineList.Add(ss_LocalWerk);
				}
	myFile.Close();
	return TRUE;
}