MFC で作る食事管理アプリケ-ション

保存するを!説明します。此処では左の画面内容を保存して見よう

左側画面に存在する「BMPファイル」と「コメント記載ファイル」を保存します、勿論関数はドキュメント・クラスに設置します。皆さんはどの様な方法で行いますか?

BMPを保存するコード

この後に説明します

プログラムが、かなり動きが複雑になりました

右側の画面制御は保母完成です、次は左側画面との同期とプログラム追加を行いますがメッセ-ジハンドラ-を追加して行きます、リストボックスは全部で5個搭載しておりそれぞれのリストボックスは複雑に機能しています。一番下側のリストは五大栄養素の状態を表示していますがこの情報は左側のバランスグラフに表します。右側上画面は献立に選んだ食材と使用量を選択しこの情報が五大栄養素の表示に表れます右側下のリストには食材を検索した結果を提示します、データの量が非常に多きな物ですから材料を選択するにも苦労し、又一般の献立に使われている食材名はいい加減過ぎて厚生労働省のデータ一覧には保母存在していません、これが現実です。ですから検索する事にも重点を置いています。

画面下中央には検索キ-を入力と張っけが行えるようにしました「、」で区切り何個でも入力できますHPで献立が紹介されています、その献立をコピ-して此処に組み込む事が出来ます。出来るだけ簡単に管理可能にするように工夫しています。ともかく公開されている献立食材は厚生労働省の食材一覧から検索する事は非常に困難ですからこの検索方法が非常に重要な操作になります。一例として短い食材名で検索一覧に表示して食品番号で検索するのが一番正確で簡単な方法です。

グラフィックの表示を追加中です(五大栄養素の状態)

必要な処理が増加してます(これだけ複雑な処理が携帯電話で?)

料理管理が携帯なんかで出来る訳無いと思うのですが?皆さんは正直出来ると思われますか?私は気休めとしか思えません。でも命に係わる人が大勢いますので私はがんばります。

LF の指定と制御方法

此処では左上側の画像に文字を書き込んでいます。文字の大きさと回転方法の制御を説明したいと思います。LFを使いますがかなりの余計なコードが必要ですが印刷にも使用しますので有効な処理になります。

必要なコードです、ドキュメント・クラスに実装します

static int MS_HE[] = { -7,-8,-9,-10,-11,-12,-13,-15,-16,-19,-21,-24,-27,-29,-32,-35,-37 };//MSゴシック

void CANutrinetAppDoc::MakeLogFont(LOGFONT* lf, int he, int mode, int size)
{
//論理フォント構造体をゼロで初期化します(ゼロ埋め)
memset(lf, 0, sizeof(LOGFONT));

switch (size) {
case 7:lf->lfHeight = MS_HE[0]; break;                      //フォント高さの設定
case 8:lf->lfHeight = MS_HE[1]; break;                      //フォント高さの設定
case 9:lf->lfHeight = MS_HE[2]; break;
case 10:lf->lfHeight = MS_HE[3]; break;                      //フォント高さの設定
case 11:lf->lfHeight = MS_HE[4]; break;
case 12:lf->lfHeight = MS_HE[5]; break;                      //フォント高さの設定
case 14:lf->lfHeight = MS_HE[6]; break;
case 16:lf->lfHeight = MS_HE[7]; break;                      //フォント高さの設定
case 18:lf->lfHeight = MS_HE[8]; break;
case 20:lf->lfHeight = MS_HE[9]; break;                      //フォント高さの設定
case 22:lf->lfHeight = MS_HE[10]; break;
case 24:lf->lfHeight = MS_HE[11]; break;                      //フォント高さの設定
case 26:lf->lfHeight = MS_HE[12]; break;
case 28:lf->lfHeight = MS_HE[13]; break;                      //フォント高さの設定
case 30:lf->lfHeight = MS_HE[14]; break;                      //フォント高さの設定
case 32:lf->lfHeight = MS_HE[15]; break;
case 34:lf->lfHeight = MS_HE[16]; break;                      //フォント高さの設定
}

lf->lfCharSet = SHIFTJIS_CHARSET;       //ここでは日本語文字を使います

switch (mode)
{
case 0:   //MSゴシック体の設定です(固定ピッチフォントで、モダン型です)
    lf->lfPitchAndFamily = FIXED_PITCH | FF_MODERN;
    lstrcpy(lf->lfFaceName, _T("MS ゴシック"));
    break;

case 1:   //MS Pゴシックの設定です(可変ピッチフォントで、モダン型です)
    lf->lfPitchAndFamily = VARIABLE_PITCH | FF_MODERN;
    lstrcpy(lf->lfFaceName, _T("MS Pゴシック"));
    break;

case 2:   //MS明朝の設定です(固定ピッチフォントで、ローマン型です)
    lf->lfPitchAndFamily = FIXED_PITCH | FF_ROMAN;
    lstrcpy(lf->lfFaceName, _T("MS 明朝"));
    break;

case 3:   //MS P明朝の設定です(可変ピッチフォントで、ローマン型です)
    lf->lfPitchAndFamily = VARIABLE_PITCH | FF_ROMAN;
    lstrcpy(lf->lfFaceName, _T("MS P明朝"));
    break;
}
return;

}

セルの入力方法の説明

画面右上(赤く反転されている)が編集対象(下記画像を見て下さい)になっておりますが、改行でセルに文字列が取り込まれます、この方法を詳しく説明したいと思います。操作概要ですがまずエディツト・コントロ-ルを1つ用意します、そのエディツト・コントロ-ルをセルの大きさに合わせてセルの真上に配置して表示します、つぎにエディツト・コントロ-ルの背景を赤くしています。次に改行が行われエディツト・コントロ-ルを非表示にします、次はデータに設定して通常動作に移行します、此処でめんどくさいのは文字を登録しなければならないのとエディツト・コントロ-ルの大きさを決める事ですがサブアイテムがクリックされたRectの大きさせ大きさを確定します。

印刷に必要なメッセ-ジハンドラ-

//============================================================================
case IDS_SCRENN_TO_BMP:                                                                                                      			                                         Vew3Form::OnFilePrintPreview();//此処がトリガ-になり印刷が始まります
break;

virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
virtual void OnPrepareDC(CDC* pDC, CPrintInfo* pInfo);
virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);
virtual void OnPrint(CDC* pDC, CPrintInfo* pInfo);

このほかに処理関数が存在します。兎にも角にもMFCは昔から不親切です、解らない人は使うな!と言っているような物です。

具体的には下記の様になります

void Vew3Form::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
CANutrinetAppDoc* pDoc = GetDocument();

switch (lHint) {
        case IDS_NutritionalBalanceLabel://栄養素バランスの表示
                    m_pStatic->ShowWindow(SW_HIDE);//BMPを非表示に
                    IDC1_List.ShowWindow(SW_SHOW);
                    break;
        case IDS_PRINTE_TO_JOB_VEW3://Vew3に対する印刷指示が来た
                    Vew3Form::OnFilePrintPreview(); break;
        case 0://一番最初のコード
                    //pDoc->UpdateAllViews(NULL, IDD_RESHIPI_NAME_RESET, this);
                    break;
        }

}

自分の画面をコピ-してBMPファイルを作成します

下記のコードで作製したBMPファイルです

綺麗にBMPファイルが作成されています

/////////////////////////////////////////////////////////////////////////////
////////////////// 画面をコピーしてBMP型式へ変更する  //////////////////////
/////////////////////////////////////////////////////////////////////////////
void Vew2Form::ViewEriaToBitmap(CString FileName)
{
CANutrinetAppDoc* pDoc = GetDocument();
//———————————————————
//———————————————————
HBITMAP hBitmap, hBitmapPrev;
BITMAPINFO* pbmi;
//———————————————————
//———————————————————
void* pbits;
HANDLE hfile;
//———————————————————
//———————————————————
HDC hDC;
HDC hDCCompat;
//———————————————————
//———————————————————
DWORD temp;
BITMAPFILEHEADER bmfh;
HWND hWnd = Vew2Form::m_hWnd;
CRect rect;
GetClientRect(rect);
hDC = ::GetDC(hWnd);
//———————————————————
//———————————————————
pbmi = (BITMAPINFO*)new BYTE[sizeof(BITMAPINFO)];
ZeroMemory(&pbmi->bmiHeader, sizeof(pbmi->bmiHeader));
pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pbmi->bmiHeader.biWidth = rect.Width();
pbmi->bmiHeader.biHeight = rect.Height();
pbmi->bmiHeader.biBitCount = GetDeviceCaps(hDC, BITSPIXEL);
pbmi->bmiHeader.biPlanes = 1;
pbmi->bmiHeader.biSizeImage = (((pbmi->bmiHeader.biWidth * pbmi->bmiHeader.biBitCount + 31) >> 3)
& 0xfffffffc) * pbmi->bmiHeader.biHeight;
//———————————————————
//———————————————————
hBitmap = CreateDIBSection(hDC, pbmi, DIB_RGB_COLORS, &pbits, NULL, 0);
hDCCompat = CreateCompatibleDC(hDC);
hBitmapPrev = (HBITMAP)SelectObject(hDCCompat, hBitmap);
BitBlt(hDCCompat, 0, 0, pbmi->bmiHeader.biWidth, pbmi->bmiHeader.biHeight, hDC, rect.left, rect.top, SRCCOPY);
//———————————————————
//———————————————————
bmfh.bfType = 0x4d42;
bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
bmfh.bfSize = bmfh.bfOffBits + pbmi->bmiHeader.biSizeImage;
//==============================================================
hfile = CreateFile(FileName,GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, 0, NULL);
//==============================================================
WriteFile(hfile,&bmfh, sizeof(bmfh), &temp, NULL);
WriteFile(hfile,&pbmi->bmiHeader, sizeof(pbmi->bmiHeader), &temp, NULL);
SetFilePointer(hfile,bmfh.bfOffBits, NULL, FILE_BEGIN);
WriteFile(hfile, pbits, pbmi->bmiHeader.biSizeImage, &temp, NULL);
//==============================================================
CloseHandle(hfile) ;
deletepbmi;
}

献立のツリ-を搭載しました

エスケープ・シーケンス・コード「¥¥」の記載が変わりました。

トークンの切りだし方法が違います。大分コードが増加していますが皆さんは興味がありますか?

MFCの動き方、メッセ-ジハンドラ-とは何か?

例えば国道が10本平行に有るとしましょう!この国道にはお互いが交差する箇所は有りません、但し唯一Windowsからなら自由に走行ラインを変える事が出来ますが、それが何時なのかはプロフラマ-には解りません、この国道こそがメッセ-ジハンドラ-と言われている物です。只しその国道を走る順序は大まかに決まっています、その理由はタイム分割で満遍なく国道を選んでいるからですが、これがメッセ-ジハンドラ-の動きです。だからこそブレ-ク・ポイントを掛けるにもメッセ-ジハンドラ-の理屈が解らないと不可能です。

印刷機構を乗せるにはOnUpdate()が必要です

/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////

void Vew3Form::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
CANutrinetAppDoc* pDoc = GetDocument();
CString val;
int cunt;
switch (lHint) {
   case IDS_NutritionalBalanceLabel://栄養素バランスの表示
      m_pStatic->ShowWindow(SW_HIDE);//BMPを非表示に
      IDC1_List.ShowWindow(SW_SHOW) ;
      IDC1_List.Invalidate() ;
      break;
   case IDS_PRINTE_TO_JOB_VEW3://Vew3に対する印刷指示が来た
      Vew3Form::
OnFilePrintPreview();
      break;

   case 0://一番最初のコード
     arrayDirectoryList.RemoveAll();//リセット
     val.Format(_T(“%s”),pDoc->ms_RegDetaList.RecipiDir);
     SearchFile(val);
     cunt = (int)arrayDirectoryList.GetCount();
     break;
     }
}

上記赤色で記載した箇所を呼び出します。

OnUpdate これがトリガ-で貴方が呼び出し(OnFilePrintPreview();)が起動されます。これだけですコードの中身は無いです!次にOnPreparePrinting(CPrintInfo* pInfo)が勝手にWindowz側から呼ばれて起動します。途中の流れは皆目解りませんし目をつぶってエイヤ!と始めて下さい。用紙サイズとか印刷の向きとか!を設定」します。

/////////////////////////////////////////////////////////////////////////////
///////////////////// プレビュー モード /////////////////////////////////
//////////////////// 印刷はここから始まる /////////////////////////////////
BOOL Vew3Form::OnPreparePrinting(CPrintInfo* pInfo)
{
CANutrinetAppDoc* pDoc = GetDocument();

pInfo->SetMaxPage(2);// この文書は2ページである:
// 最初のページはタイトルページで2ページ目は図面にする
BOOL bRet = DoPreparePrinting(pInfo);// default preparation
pInfo->m_nNumPreviewPages = 2;        // Preview 2 pages at a time
return bRet;

}

OnPreparePrinting(CPrintInfo* pInfo)

上記がWindowsから呼ばれるのです、MFCアプリケ-ションの印刷を押すと必ず呼ばれて来ます、上記のコードを記載すればよいですがLFも必要になります、次に決まったコードが勝手に起動されて行きますが後はコードを注意深く見て下さい、いずれにしても私がこれから印刷コ-ドを実装して行きますから参考に、例えばBMPのカラ-印刷するにはどうすれば良いのか、拡大とかどうするのか文字列の大きさとかそりゃ~盛りだくさんです。

次に関数を定義します

void PrintPageHeader(CDC* pDC, CPrintInfo* pInfo, CString& strHeader);
void PrintPageFooter(CDC* pDC, CPrintInfo* pInfo, CString& strHeader);
void MyPrinteDrwTypeV(CDC* pDC, CPrintInfo* pInfo);
void MyPrinteDrwTypeH(CDC* pDC, CPrintInfo* pInfo);
void MyPrinteDrwTypeSecoundV(CDC* pDC, CPrintInfo* pInfo);//縦方向
void MyPrinteDrwTypeSecoundH(CDC* pDC, CPrintInfo* pInfoo);//横方向

上記コード内で実際に印刷して行きます

上記画像はリストコントロ-ル内部の表示方法です

リストコントロ-ルに表示する文字列は全て外部変数に持たせてありますがその理由はWindowsが切り替わりこのビュ-が消去された場合にデータが消えてしまうからです、

CArray<CString, CString> gropName;//グループ名
CArray<CString, CString> ReferenceAmount1;//目安量1
CArray<CString, CString> ReferenceAmount2;//目安量1
CArray<CString, CString> weight;//重量
CArray<CString, CString> Cup;//カップ
CArray<CString, CString> ms_Array_FoodGrop;//栄養素原本一覧

可動容量の変数定義を行いドキュメント・クラスに配置する

//==================================================================
typedef struct FDOOD_DATA {
BOOL frg;
int item;
double Vitamin; //ビタミン 計算値
double Mineral; //ミネラル 計算値
double TotalCaloriesv;//総合カロリ-
double Proteins ;//タンパク質
double Lipids ;//脂質
double Carbohydrates ;//炭水化物
//====================================
CString Amount; //分量
CString date;
CString Name;
CString resip; //料理手順
CString AmountUsed;//人前
CString FoodGrp;
CString sVal[70];
}s_FoodWerk;//1食料理

上記は構造体と言われる変数の型を表します

CArray<s_FoodWerk,s_FoodWerk> ms_FoodWerk  ;//栄養素行デ-タ

そしてこの構造体を配列型としてドキュメントクラスに定義します

s_FoodWerk ms_FoodWerk;
ms_FoodWerk=pDoc->ms_IngredientRegistration[nItem];//IDC_LIST4 デ-タ

OnDrawItemでのメッセ-ジハンドラ-も記載方法です

Windowsから順序正しくリストコントロ-ルのアイテム番号が指定されてこの関数が呼ばれて来ますIDC_LIST1~IDC_LIST6まで処理を順序正しくですが、基本的に表示に変化が無い場合には呼ばれる事は有りません!そこでデータ変化して強制的に表示したい場合には

            FoodGroupsName.Invalidate(); //再表示
            IngredientName.Invalidate(); //再表示
上記の様にWindowsに指示をだします、するとWindowsからOnDrawItemが呼ばれ指定のリストコントロ-ルだけが再表示出来るのです。

Windowsはタイム・シェアリング(短い時間だけ操作を許可される)で動作するのです。

何回にもWindowsから細かく分けてOnDrawItemが呼ばれ、その度ごとにアイテム番号が順次加算されて行きます、だから関数にはアイテム番号を与えて指定行のみ操作権限が与えられる。

データを参照しリストコントロ-ルのセル大きさを取得し表示する

IngredientRegistration.GetSubItemRect(nItem, i, LVIR_BOUNDS, lRect);//このアイテムの横幅です

下記はリストコントロ-ル内部の表示方法です

	//=====================================================================================
if(nItem<(int)pDoc->ms_IngredientRegistration.GetCount()){
pDC->SetTextColor(RGB(0, 0, 0));
ms_FoodWerk=pDoc->ms_IngredientRegistration[nItem];//IDC_LIST4 デ-タ
IngredientRegistration.GetSubItemRect(nItem,0, LVIR_BOUNDS, lRect);//このアイテムの横幅です
pDC->DrawText(ms_FoodWerk.sVal[1], -1, lRect, DT_LEFT | DT_SINGLELINE | DT_VCENTER);
IngredientRegistration.GetSubItemRect(nItem,1, LVIR_BOUNDS, lRect);//このアイテムの横幅です
pDC->DrawText(ms_FoodWerk.sVal[3], -1, lRect, DT_LEFT | DT_SINGLELINE | DT_VCENTER);
IngredientRegistration.GetSubItemRect(nItem,2, LVIR_BOUNDS, lRect);//このアイテムの横幅です
pDC->DrawText(ms_FoodWerk.sVal[5], -1, lRect, DT_LEFT | DT_SINGLELINE | DT_VCENTER);
IngredientRegistration.GetSubItemRect(nItem,3, LVIR_BOUNDS, lRect);//このアイテムの横幅です
pDC->DrawText(ms_FoodWerk.Amount, -1, lRect, DT_LEFT | DT_SINGLELINE | DT_VCENTER);
//===============================================
				}

上記の様にすれば他のフォ-ムビュ-でも自由にデータを使える

重要な画面切り替え部分、勿論メインフレ-ム・クラスです

この部分は今後ドンドン増加して行きます、そう!紙芝居を連想して下さい画像(シナリオです)を順次差し替えて物語は進行して行きます。所でもう一つ

このビュ-切り替えを呼び出す所です

ツリ-でダブルクリックが発生した場合にビユ-切り替え器に判断をお伺いを立て許可が出ればフォームが切り替わります、そしてファイルの読み込みが関係している場合此処で読み出し構造体で一括にデータを渡します、これもコントロ-ラ側では一切データを持たずドキュメント・クラスが持っているからこそ出来るんです!

BMPファイルの読み出しは、このように記載します

hBitmapを返します。

指定されたディレクトリ内部の構成を確認してDirlisteに加算

指示されたディレクトリ-がどんなに大きくても問題なくストックして行きます、ファイル名とかディレクトリ-も自動的に保存して返します、中々に便利です。

arrayDirectoryList.Add(finFile);が重要です

定義は「CArray<CString, CString > arrayDirectoryList;」と定義しています、ストックの上限は許される限り限界は有りません。後はコードをご覧ください。

ツリ-項目がダブルクリックされた時の処理の行い

ここでは選択された項目を読み取り他のビュ-に渡すデ-タを確保してからビュ-切り替え番号指定してメインフレ-ムに指示を送ります

IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
	ON_WM_CREATE()
	ON_COMMAND_RANGE(ID_VIEW_APPLOOK_WIN_2000, ID_VIEW_APPLOOK_WINDOWS_7, &CMainFrame::OnApplicationLook)
	ON_UPDATE_COMMAND_UI_RANGE(ID_VIEW_APPLOOK_WIN_2000, ID_VIEW_APPLOOK_WINDOWS_7, &CMainFrame::OnUpdateApplicationLook)
//======オリジナルコマンドでビューからこのメインフレームにメッセージを発行する方法です=====
	ON_MESSAGE(ID_MENU_VIEW_CHNGE, OneVewChenger)//ビュ-切り替えコマンドを受けた
END_MESSAGE_MAP()

ID_MENU_VIEW_CHNGE, OneVewChengerが実行される

ビュ-切り替え処理を行い、正常終了ならTRUEを返します

正常に終了出来たら、次に新しく起動されたビュ-にアップデ-ト

起動されたビュ-はその指示でOnInitialUpdate();を実行します

もう一度見て下さい、特に切り替えた後の処理が重要です

ここでは右側のペインを対象にしてビュ-を切り替えています、切り替えたあとpMyDoc->UpdateAllViews(NULL, IDS_Vew5_update, this);ビュ-を指定し(此処ではVew5)初期化させています。此処はこれから処理が増加して行きます、正確に手順を踏まないと例外で停止します。

OnDrawItem()の中は

リスト表示方法は下記の様にやります!最短時間で処理は終わらす

リストコントロ-ルにはデータは含ませては成らない、必ず外(ドキュメント・クラス内に)に保持します

表示は必ず行単位で行う必要がる、nItemはWindowsから渡される

上記はBMPファイルを読み出し別の場所へ複製する

3枚目の画像を作り始めた、デバッグモ-ドでバグを見っけました!

デバッグモードではメッセ-ジハンドラ-が上手く伝わらず、リリ-スバ-ジョンでは問題は無しです。例えばDrawItemでトリガ-が掛からず原因不明で悩んでいましたが、「たまたま」リリ-ス・バ-ジョンで起動したら問題が無い、皆さん注意して下さい。

バグが酷い、使えないと判断する画面にリストを配置しただけでダメ

残念だけどこれじゃ~信頼性が無い、諦めようと思うVc++2005に戻ろう(いままで、こんな事は絶対になかった)、ま!取り合えず回答を待つ。マイクロソフトも、ずいぶんいい加減になったと思う。

プログラム中は試行錯誤が連続で起きる。

今回私が経験した事は作業途中でも何か変だと感じていました、それはメッセ-ジハンドラ-が上手く機能しない、例えばコントロ-ルを追加している時に急にDrawItemが呼ばれなくなり何回も確認したが正常に機能しない、そこで気休めの積もりでリリ-スバージョンで起動した時点で正常になる本来は逆なんです、そこで又リストコントロ-ルを追加して行くが、又再度DrawItemが呼ばれなくなりまたもや問題が起きる、勿論バグには最新の注意を計り作業しているし間違いは無い、これで私は諦めた!今後更にプログラムが複雑になる事が予想される為にこのような状況で疑心暗鬼に陥ると怖いです。誠に残念ですが、この2022MFCは信頼性に欠けると私は判断した。MFC2005に戻る事にする!私はこんな事は!今までには絶対にないし経験した事もない。残念です。

他のHPを見るとかなり問題が多そうですね!私は2005年の正規のVC++に戻しました。こんな不安定な物使う気が無くなりました!私は信頼性が最重要だと思います。

この問題は100%同じ作業後に発生する、逃げようが無い箇所でどうする事も出来ず理由も不明でバグと言うしかない!

MFC VC++ 2005 仕方なく戻しました

残念ですがMFC 2022には信頼性が掛けている、やはり無料ではこの程度でしょうか?マイクロソフトの権威と信頼性は過去の様に戻らないのか?

もっとシンプルに。MFC-2022では色々と問題が起きた精神的に悪い

本当にひどい目に合いました、納期が近くなってからでは普通パニックになります。もう!イヤダ矢張り信頼性が最重要です、矢張り無料ではこんなもんなんですね!いい経験をした、皆さん気を付けて作業して下さい。

セルに入力中

この状態でセルに入力します、そう複雑では有りません。

下記がコードです

此処ではセルの位置情報を取得後にセル内部にエディツトコントロ-ルを上乗せして表示します

入力を行います、改行で取り込みエディツトコントロ-ルOFFします

//==============================================================
s_ClickAfter ms_ClickAfter1;////検索条件 IDC_ListCtrl1 の履歴

typedef struct CLICK_AFTER {
int nmId;
int nitem;
int subItem;
int OldnmId;
int Oldnitem;
int OldsubItem;
BOOL Click;
BOOL Delate;
BOOL DbleClick;
BOOL RightClick;
}s_ClickAfter;

上記がセルの履歴を管理します、セルの反転とか色々と使います。

上記は検索ボタンが押されて、メッセ-ジをVew2が受け取つた事を表している

検索ボタンはVew1(左側の画面)にあるが右側のVew2へ検索指示を出すには下記の図を見て下さい。

まず現在のビュ-がVew2であれば切り替える必要は無く、そもままVew2へメッセ-ジを発行するが他のビュ-であればVewchengerの指示を発行して切り替えが正常に行われTRUEが返却されればこんどはVew2へ指示を発行する、この世に処理を行う事をハンドシェイクすると言う。

Vew1(左側の画面)のスイッチのハンドラ-でよく見て貰えば理解できるでしょう?

こういう事を行えるのもコントロ-ルにデータを一切持たせず別に外部で持たせているからです。

大きいCharタイプをCString型へキャストしたい時が良くあります

下記の画面を見て下さい、この様にやればCString型へ組み替える事が出来ます。

ReadDeta = (CAtlStringW)(buffer);がその箇所です、buffer[]は大きいですファイルはゲツチで読み出してそれをcharにキャストしています。char型のままだと使いにくいのでCString型へ変更しています。

此処でもう一度セルの入力箇所の方法をご覧ください

コードを」よく見ればおおよそ理解は出来ると思いますが、コントロ-ルとは単にウインドウズである点に注目して下さい、そう!単なるウインドウズなのです

だからこそ、どの様な何でも制御も可能なのです。極めて単純です

手間暇を掛ければエクセルの様な制御も出来ます、何でも可能です。ただサンプルが無い!だから皆さんも苦労しているのでしょう!是非私のサンプルを見て研究をし応用して欲しいと心からそう思います。動きは全てが時分割で動いています早く言えば疑似タスクと言われています、だからこそ全ての処理がWindowsから呼ばれて操作権限を貴方が取得して速やかに操作権限を返却するのだ!と言う基本概念が重要なのです、どんなに高級言語を使ったとしても、私の様なプログラムは出来ませんこれこそがMFCなんです、時代遅れでも何でもない唯一のMFCなんです!デルファイとか似た物は有りますが全然別物です、MFCは高度で非常に難しいC++言語とも違う別物なんです。

OneVewChengerの内容です

此処では各ビュ-から送られるビュ-コードによりビュ-を切り替えて、各ビュ-に

pMyDoc->UpdateAllViews(NULL,IDS_VEW3_UPDATE);

アップデ-ト指示を発行しています、とりあえず良くコ-ドを観察

このコ-ド-は皆さんの良いツル-になりますよ、搭載箇所は勿論メイン・フォ-ムです、私は能書きは極力抑えて皆さんが直ぐに使ってみる事が出来る様にしています。コードを記載する時は見やすく記載します何しろこのコ-ドが売り物なんですから、皆さん!コ-ドの記載は見やすくが重要なんです。

//=========================================================
//=========================================================
CDocument* CMainFrame::EkGetActiveDocument()
{
CWnd* pWnd = AfxGetMainWnd();
if (pWnd == NULL) return(NULL);

ASSERT_VALID(pWnd);
ASSERT_KINDOF(CFrameWnd, pWnd);
CFrameWnd* pMainFrame = static_cast<CFrameWnd*>(pWnd);
CFrameWnd* pActiveFrame = pMainFrame->GetActiveFrame();

if (pActiveFrame == NULL) return(NULL);
return(pActiveFrame->GetActiveDocument());

}

上記の関数はメインフォームからドキュメント・クラスにアクセスする事が出来る

現在の画面デザイン

食材の検索関数、注目点

CArray<CString,CString> mStock;」に注目して下さい、CString 配列名[100]を省略しています、配列数を固定せずに使う事が出来ます。いくらでも動的に増加減できます。又使用する変数はドキュメント・クラスの物を使う様にしています!