VC++プログラミング


この講座はMFC VC++である代表的なファンデ-ションクラスを実際に使いシングルドキュメント方式アプリケーションを構築しその都度色々なCONTROLを組み込み更にはビュ-の切り替えも行いブレ-クポイントを要所要所に設定してプログラムの流れがどの様に流れて行くのかを見てみましょう。

MFC VCプラスプラスは多種多様なファンデーションクラスから構成されていますが今回扱うシングルドキュメント、アプリケーションは下記のクラスで基本的に構成されています。
1: アプリケーションクラス
2: ドキュメントクラス
3: メインフレームクラス
4: ビユ-クラス(必要枚数が追加されて行きますが紙芝居の差し替えの絵と同じです)。

シングルドキュメント、アプリケーションは上記の四つの基本クラスから構成されています。これらのクラスはお互いに同期をとりながらウインドウズから送られて来る指令に従い動作します。

それぞれのクラスはお互いに隔離されています、各クラスへの情報の共有は ドキュメントクラスを中心にして参照します。

このアプリケーションが扱う基本的なデータはドキュメントクラスが総合的に管理を行いながらアプリケーションの全体的なシナリヲは進行して行きます、各クラスはこのドキュメントクラスの保持するデータを基本データとして協調動作を行います。

各クラスは単独で機能しています。但し自分のクラスに送られた指示に対しては即時に指示された処理を開始します。

それでは代表的なクラス定義(ヘッダ-ファイル)を見てみましょう。
Visual Studio内のソリューションエックスプロラーウインドウを見て下さい、ヘッダ-ファイル項目フォルダ-です。

現在使用している重要なクラスのヘッダ-ファイルリストです。
1: ControlPractice.h ::アプリケーションクラス
2: ControlPracticeDoc.h ::ドキュメントクラス
3: MainFrm.h ;;メインフレームクラス
4: ControlPracticeView.h::フォームビュ-クラス
5: LeftFormVew.h ::フォームビュ-クラス
6: RightFormVew.h ::フォームビュ-クラス

上記のヘッダ-ファイルを使用しています。

ドキュメントクラスヘッダ-ファイルの上部に下記の項目を記載して行きます::

#define ID_VEW_CHENGER (WM_USER + 100)
#define ID_FORM_LEFT_UPDATE_ID_OK_DIS  (WM_USER + 101)
#define ID_FORM_RIGHT_UPDATE_ID_OK_DIS (WM_USER + 102)
#define ID_FORM_LEFT_UPDATE_ID_CANCEL_DIS (WM_USER + 103)
#define ID_FORM_RIGHTUPDATE_ID_CANCSL_DIS (WM_USER + 104)
#define ID_FORM_CONTROL_PRAVEW_ID_OK_DIS    (WM_USER + 105)
$define ID_FORM_CONTROL_PRAVEWID_CANCSL_DIS (WM_USER + 106)

この編集されたドキュメントヘッダ-ファイルはアプリケ-ションクラスを除き全てのクラスにインクロ-ドされて利用されます。このIDを使えば自分のクラス以外で他のクラスに情報伝達の指示を与えたり、更には他のクラスから発行されたメッセ-ジを受け取る事が可能になる非常に重要なコマンドID定義になります。更にこのコマンド定義の数には上限は有りませんので必要な数を追加する事が許可されます。

ドキュメントクラスの実装

// ControlPracticeDoc.h : CControlPracticeDoc クラスのインターフェイス
 //
 pragma once
 define ID_VEW_CHENGER (WM_USER + 100)
 /////////////////////////////////////////////////////////////////////////////
 define ID_FORM_LEFT_UPDATE_ID_OK_DIS  (WM_USER + 101)
 define ID_FORM_RIGHT_UPDATE_ID_OK_DIS (WM_USER + 102)
 /////////////////////////////////////////////////////////////////////////////
 define ID_FORM_LEFT_UPDATE_ID_CANCEL_DIS (WM_USER + 103)
 define ID_FORM_RIGHTUPDATE_ID_CANCSL_DIS (WM_USER + 104)
 /////////////////////////////////////////////////////////////////////////////
 define ID_FORM_CONTROL_PRAVEW_ID_OK_DIS    (WM_USER + 105)
 define ID_FORM_CONTROL_PRAVEWID_CANCSL_DIS (WM_USER + 106)
 /////////////////////////////////////////////////////////////////////////////
 define LINE_COLOR       RGB(195,195,202)
 define LINE_BLACK_COLOR RGB(0,0,0)
 /////////////////////////////////////////////////////////////////////////////
 static _TCHAR* ControlPracticeColumnLabel[]={_T("------"),_T("マーク"),_T("マーク")}; 
 static  int    ControlPracticeWidth[]={1313+2,134+2,13*4};
 static  int      ControlPracticeFmt[]={LVCFMT_CENTER,LVCFMT_CENTER,LVCFMT_CENTER};
 /////////////////////////////////////////////////////////////////////////////
 static _TCHAR* LeftFormColumnLabel[]={_T("------"),_T("マーク"),_T("マーク")}; 
 static  int    LeftFormWidth[]={1313+2,134+2,13*4};
 static  int      LeftFormFmt[]={LVCFMT_CENTER,LVCFMT_CENTER,LVCFMT_CENTER};
 /////////////////////////////////////////////////////////////////////////////
 static _TCHAR* RightFormColumnLabel[]={_T("------"),_T("マーク"),_T("マーク")}; 
 static  int    RightFormWidth[]={1313+2,134+2,13*4};
 static  int      RightFormFmt[]={LVCFMT_CENTER,LVCFMT_CENTER,LVCFMT_CENTER};
 /////////////////////////////////////////////////////////////////////////////
 //////////////////リストコントロ-ル様に領域を確保////////////////////////////
 ////////////////// 型 Char                      ////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 static _TCHAR ControlPracticeView_buffDim[100][8][MAX_PATH];
 static _TCHAR LeftFormVew_buffDim[100][8][MAX_PATH] ;
 static _TCHAR RightFormVew_buffDim[100][8][MAX_PATH];
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 typedef struct TreeControl{
     HTREEITEM   hItem;
     CString       val;
     CString   FilName;
     CString   VeryKind;
     CString   Categori;
     CString   CharLine;
     int HierarchicalNumber;//階層番号
 }s_TreeControl;
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 class CControlPracticeDoc : public CDocument
 {
 protected: // シリアル化からのみ作成します。
     CControlPracticeDoc();
     DECLARE_DYNCREATE(CControlPracticeDoc)
 // 属性
 public:
 // 操作
 public:
     int FormVewNmcer;
 // オーバーライド
 public:
     virtual BOOL OnNewDocument();
     virtual void Serialize(CArchive& ar);
 // 実装
 public:
     virtual ~CControlPracticeDoc();
 ifdef _DEBUG
 virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const;
 endif
 protected:
 // 生成された、メッセージ割り当て関数
 protected:
     DECLARE_MESSAGE_MAP()
 };
// ControlPracticeDoc.cpp : CControlPracticeDoc クラスの実装
 //
 include "stdafx.h"
 include "ControlPractice.h"
 include "ControlPracticeDoc.h"
 ifdef _DEBUG
 define new DEBUG_NEW
 endif
 // CControlPracticeDoc
 IMPLEMENT_DYNCREATE(CControlPracticeDoc, CDocument)
 BEGIN_MESSAGE_MAP(CControlPracticeDoc, CDocument)
 END_MESSAGE_MAP()
 // CControlPracticeDoc コンストラクション/デストラクション
 CControlPracticeDoc::CControlPracticeDoc()
 {
     FormVewNmcer=0;
 }
 CControlPracticeDoc::~CControlPracticeDoc()
 {
 }
 BOOL CControlPracticeDoc::OnNewDocument()
 {
     if (!CDocument::OnNewDocument())
         return FALSE;
 // TODO: この位置に再初期化処理を追加してください。 // (SDI ドキュメントはこのドキュメントを再利用します。) return TRUE;
 }
 // CControlPracticeDoc シリアル化
 void CControlPracticeDoc::Serialize(CArchive& ar)
 {
     if (ar.IsStoring())
     {
         // TODO: 格納するコードをここに追加してください。
     }
     else
     {
         // TODO: 読み込むコードをここに追加してください。
     }
 }
 // CControlPracticeDoc 診断
 ifdef _DEBUG
 void CControlPracticeDoc::AssertValid() const
 {
     CDocument::AssertValid();
 }
 void CControlPracticeDoc::Dump(CDumpContext& dc) const
 {
     CDocument::Dump(dc);
 }
 endif //_DEBUG
 // CControlPracticeDoc コマンド

メインフレ-ムの実装

// MainFrm.h : CMainFrame クラスのインターフェイス
 //
 pragma once
 class CMainFrame : public CFrameWnd
 {
 protected: // シリアル化からのみ作成します。
     CMainFrame();
     DECLARE_DYNCREATE(CMainFrame)
 // 属性
 public:
     CSplitterWnd m_wndSplitter;
     CSplitterWnd m_wnd2Splitter;
 CDocument* EkGetActiveDocument();
 // 操作
 public:
 // オーバーライド
 public:
     virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext);
     virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
 // 実装
 public:
     virtual ~CMainFrame();
 ifdef _DEBUG
 virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const;
 endif
 protected:  // コントロール バー用メンバ
     CStatusBar  m_wndStatusBar;
     CToolBar    m_wndToolBar;
 // 生成された、メッセージ割り当て関数
 protected:
     afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
     afx_msg LRESULT OneVewChenger(WPARAM wParam, LPARAM lParam);
 DECLARE_MESSAGE_MAP()
 };
// MainFrm.cpp : CMainFrame クラスの実装
 //
 include "stdafx.h"
 //============================================================
 //============================================================
 include "ControlPracticeDoc.h"
 //============================================================
 //============================================================
 include "ControlPractice.h"
 include "ControlPracticeView.h"
 include "LeftFormVew.h"
 include "RightFormVew.h"
 //============================================================
 //============================================================
 include "MainFrm.h"
 //============================================================
 //============================================================
 ifdef _DEBUG
 define new DEBUG_NEW
 endif
 // CMainFrame
 IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)
 BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
     ON_WM_CREATE()
     ON_MESSAGE(ID_VEW_CHENGER,OneVewChenger)//VEWを切り替えます
 END_MESSAGE_MAP()
 static UINT indicators[] =
 {
     ID_SEPARATOR,           // ステータス ライン インジケータ
     ID_INDICATOR_CAPS,
     ID_INDICATOR_NUM,
     ID_INDICATOR_SCRL,
 };
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 // CMainFrame コンストラクション/デストラクション
 CMainFrame::CMainFrame()
 {
     // TODO: メンバ初期化コードをここに追加してください。
 }
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 CMainFrame::~CMainFrame()
 {
 }
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
 {
     if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
         return -1;
 if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP     | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ) {     TRACE0("ツール バーの作成に失敗しました。\n");     return -1;      // 作成できませんでした。 } if (!m_wndStatusBar.Create(this) ||     !m_wndStatusBar.SetIndicators(indicators,       sizeof(indicators)/sizeof(UINT))) {     TRACE0("ステータス バーの作成に失敗しました。\n");     return -1;      // 作成できませんでした。 } // TODO: ツール バーをドッキング可能にしない場合は、これらの 3 行を削除してください。 m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndToolBar); return 0;
 }
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
 {
     if( !CFrameWnd::PreCreateWindow(cs) )
         return FALSE;
     // TODO: この位置で CREATESTRUCT cs を修正して Window クラスまたはスタイルを
     //  修正してください。
 return TRUE;
 }
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 // CMainFrame 診断
 ifdef _DEBUG
 void CMainFrame::AssertValid() const
 {
     CFrameWnd::AssertValid();
 }
 void CMainFrame::Dump(CDumpContext& dc) const
 {
     CFrameWnd::Dump(dc);
 }
 endif //_DEBUG
 // CMainFrame メッセージ ハンドラ
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 CDocument* CMainFrame::EkGetActiveDocument()
 {
 CWnd* pWnd=AfxGetMainWnd();
 if (pWnd==NULL) return(NULL);
 ASSERT_VALID(pWnd);
 ASSERT_KINDOF(CFrameWnd,pWnd);
 CFrameWnd* pMainFrame=static_cast>(pWnd); CFrameWnd pActiveFrame=pMainFrame->GetActiveFrame();
 if (pActiveFrame==NULL) return(NULL);
 return(pActiveFrame->GetActiveDocument());
 }
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 // MainFrame メッセージ ハンドラ
 BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT /lpcs/,CCreateContext* pContext)
 {
     CRect FramSize;
     GetClientRect(FramSize);
 //--------------------- if (!m_wndSplitter.CreateStatic(this,1,2))//メイン画面は1行2列     {         TRACE0("Failed to create nested splitter\n");         return FALSE;     } //--------------------- if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(ControlPracticeView),CSize(300,FramSize.bottom), pContext)) {     TRACE0("Failed to create third pane\n");     return FALSE; } //--------------------- if (!m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(RightFormVew),CSize(980,FramSize.bottom), pContext)) {     TRACE0("Failed to create third pane\n");     return FALSE; } return TRUE;
 }
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////       Vewを切り替えます     ///////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 LRESULT CMainFrame::OneVewChenger(WPARAM wParam, LPARAM lParam)
 {
     CDocument* pActiveDoc=EkGetActiveDocument();
     CControlPracticeDoc* pMyDoc;
 //====================================================================================== if (pActiveDoc==NULL)         {         if(pActiveDoc->IsKindOf(RUNTIME_CLASS(CControlPracticeDoc))){                     pMyDoc=static_cast<CControlPracticeDoc*>(pActiveDoc);                     }         } //====================================================================================== else if(pActiveDoc->IsKindOf(RUNTIME_CLASS(CControlPracticeDoc))){         pMyDoc=static_cast<CControlPracticeDoc*>(pActiveDoc);         } //====================================================================================== if((pMyDoc->FormVewNmcer & 0x11)==0x11) {         pMyDoc->FormVewNmcer&=0xee;pMyDoc->UpdateAllViews(NULL,ID_FORM_LEFT_UPDATE_ID_OK_DIS  ,this)  ;}//リセット 0x11 if((pMyDoc->FormVewNmcer & 0x12)==0x12) {         pMyDoc->FormVewNmcer&=0xed;pMyDoc->UpdateAllViews(NULL,ID_FORM_LEFT_UPDATE_ID_CANCEL_DIS,this);}//リセット 0x12 //====================================================================================== if((pMyDoc->FormVewNmcer & 0x21)==0x21) {         pMyDoc->FormVewNmcer&=0xde;pMyDoc->UpdateAllViews(NULL,ID_FORM_RIGHT_UPDATE_ID_OK_DIS  ,this) ;}//リセット 0x21 if((pMyDoc->FormVewNmcer & 0x22)==0x22) {         pMyDoc->FormVewNmcer&=0xdd;pMyDoc->UpdateAllViews(NULL,ID_FORM_RIGHTUPDATE_ID_CANCSL_DIS,this);}//リセット 0x2211 //====================================================================================== return TRUE;
 }

フォームビュ-クラス実装

// RightFormVew.h : RightFormVew クラスのインターフェイス
 //
 pragma once
 include "afxcmn.h"
 include "afxwin.h"
 class RightFormVew : public CFormView
 {
 protected: // シリアル化からのみ作成します。
     RightFormVew();
     DECLARE_DYNCREATE(RightFormVew)
 public:
     enum{ IDD = IDD_RIGHT_Vew };
 // 属性
 public:
     CControlPracticeDoc* GetDocument() const;
     ////////////////////////////////////////////////////////////////
     void CStringDataMoveToStaticEriyaReset();
     void CStringDataMoveToStaticEriya(CString vs,int item,int isub);
     ////////////////////////////////////////////////////////////////
 // 操作
 public:
 // オーバーライド
 public:
     virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
 protected:
     virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV サポート
     virtual void OnInitialUpdate(); // 構築後に初めて呼び出されます。
 // 実装
 public:
     virtual ~RightFormVew();
     void List1RowListControl(CDC* pDC,int nItem);
 ifdef _DEBUG
 virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const;
 endif
 protected:
         virtual void OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint);
         virtual BOOL PreTranslateMessage(MSG* pMsg);
     // 生成された、メッセージ割り当て関数
 protected:
     DECLARE_MESSAGE_MAP()
 public:
     CListCtrl CtlistControl1;
     afx_msg void OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct);
     afx_msg void OnBnClickedOk();
     afx_msg void OnBnClickedCancel();
     CButton ctITOK;
     CButton cfITCANCEL;
 };
 ifndef _DEBUG  // RightFormVew.cpp のデバッグ バージョン
 inline CControlPracticeDoc* RightFormVew::GetDocument() const
    { return reinterpret_cast(m_pDocument); }
 endif
// RightFormVew.cpp : RightFormVew クラスの実装
 //
 include "stdafx.h"
 include "ControlPractice.h"
 include "ControlPracticeDoc.h"
 include "RightFormVew.h"
 ifdef _DEBUG
 define new DEBUG_NEW
 endif
 // RightFormVew
 IMPLEMENT_DYNCREATE(RightFormVew, CFormView)
 BEGIN_MESSAGE_MAP(RightFormVew, CFormView)
     ON_WM_SIZE()
     ON_WM_DRAWITEM()
     ON_WM_MEASUREITEM()
     ON_BN_CLICKED(IDOK, &RightFormVew::OnBnClickedOk)
     ON_BN_CLICKED(IDCANCEL, &RightFormVew::OnBnClickedCancel)
 END_MESSAGE_MAP()
 // RightFormVew コンストラクション/デストラクション
 RightFormVew::RightFormVew()
     : CFormView(RightFormVew::IDD)
 {
     // TODO: 構築コードをここに追加します。
 }
 RightFormVew::~RightFormVew()
 {
 }
 void RightFormVew::DoDataExchange(CDataExchange* pDX)
 {
     CFormView::DoDataExchange(pDX);
     DDX_Control(pDX, IDC_LIST1, CtlistControl1);
     DDX_Control(pDX, IDCANCEL, cfITCANCEL);
     DDX_Control(pDX, IDOK, ctITOK);
 }
 BOOL RightFormVew::PreCreateWindow(CREATESTRUCT& cs)
 {
     // TODO: この位置で CREATESTRUCT cs を修正して Window クラスまたはスタイルを
     //  修正してください。
 return CFormView::PreCreateWindow(cs);
 }
 //============================================================
 //============================================================
 //============================================================
 void RightFormVew::OnInitialUpdate()
 {
     CFormView::OnInitialUpdate();
     GetParentFrame()->RecalcLayout();
     ResizeParentToFit();
 //============================================================ //============================================================ //============================================================ LV_COLUMN  lvc; lvc.mask = LVCF_FMT  | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; //============================================================ for (int i=0;i<3;i++){         lvc.iSubItem= i;         lvc.pszText=RightFormColumnLabel[i];         lvc.cx     =(int)(RightFormWidth[i]);         lvc.fmt    =RightFormFmt[i];         CtlistControl1.InsertColumn(i,&lvc);         } //============================================================ //============================================================ //============================================================ LV_ITEM     lvi; lvi.mask = LVIF_TEXT | LVIF_IMAGE |LVIF_PARAM ;  lvi.iSubItem =0; for(int i=0;i<5;i++){        lvi.iItem    =i;        lvi.pszText =RightFormVew_buffDim[i][0];        CtlistControl1.InsertItem(&lvi);        } CtlistControl1.ShowWindow(SW_SHOW) ;
 }
 // RightFormVew 診断
 ifdef _DEBUG
 void RightFormVew::AssertValid() const
 {
     CFormView::AssertValid();
 }
 void RightFormVew::Dump(CDumpContext& dc) const
 {
     CFormView::Dump(dc);
 }
 CControlPracticeDoc* RightFormVew::GetDocument() const // デバッグ以外のバージョンはインラインです。
 {
     ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CControlPracticeDoc)));
     return (CControlPracticeDoc*)m_pDocument;
 }
 endif //_DEBUG
 // RightFormVew メッセージ ハンドラ
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 BOOL RightFormVew::PreTranslateMessage(MSG* pMsg)
 {
     CControlPracticeDoc* pDoc = GetDocument();
 //========================================================= CString sval=_T(""); //========================================================= if(pMsg->message==WM_KEYDOWN){         //===============================         switch(pMsg->wParam){                case VK_RETURN  :break;                case VK_CONTROL :break;                case VK_ESCAPE  :break;                case VK_F1      :break;                case VK_F2      :break;                case VK_F3      :break;                case VK_F4      :break;                case VK_F5      :break;                case VK_F6      :break;                case VK_F7      :break;                case VK_F8      :break;                case VK_F9      :break;                case VK_F10     :break;                case VK_UP      :break;                case VK_LEFT    :break;                case VK_DOWN    :break;                case VK_RIGHT   :break;                case VK_DELETE  :break;                case VK_INSERT  :break;                 }         } return CFormView::PreTranslateMessage(pMsg);
 }
 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// MeikingDish メッセージ ハンドラ
 void RightFormVew::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
 {
     int test=0;
     CControlPracticeDoc* pDoc = GetDocument();
     //========================================================
     switch(lHint){
         case ID_FORM_RIGHT_UPDATE_ID_OK_DIS:
              test=0;
              break;
         case ID_FORM_RIGHTUPDATE_ID_CANCSL_DIS:
              test=0;
              break;
         //==================ビューが切り替わりが強要さ====================
         case 0:
              test=0;
              break;
         }
 }
 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
 void RightFormVew::CStringDataMoveToStaticEriyaReset()
 {
     CString vs=_T("    ");
 try{
     for(int item=0;item<100;item++){
         for(int isub=0;isub<8;isub++){
                 _tcsncpy_s(RightFormVew_buffDim[item][isub],MAX_PATH,(LPCTSTR)vs,_TRUNCATE);
                 }
         }
     }catch(CMemoryException e){
             e.ReportError();
             e.Delete()     ;
             }
 }
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
 void RightFormVew::CStringDataMoveToStaticEriya(CString vs,int item,int isub)
 {
 try{
     _tcsncpy_s(RightFormVew_buffDim[item][isub],MAX_PATH,(LPCTSTR)vs,_TRUNCATE);
     }catch(CMemoryException e){
             e.ReportError();
             e.Delete()     ;
             }
 }
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
 void RightFormVew::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
 {
     CControlPracticeDoc* pDoc = GetDocument();
 //======================================================== CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC); CRect rcItem(lpDrawItemStruct->rcItem); int nItem = lpDrawItemStruct->itemID  ; //============================================= LV_ITEM     lvi; switch(lpDrawItemStruct->CtlID) {         case IDC_LIST1:                         lvi.mask = LVIF_TEXT | LVIF_IMAGE |LVIF_PARAM ;                          lvi.iSubItem =0;                         //=========================================                         lvi.iItem    =nItem;                         lvi.pszText =LeftFormVew_buffDim[nItem][0];                         CtlistControl1.SetItem(&lvi);                         for(int sub=0;sub<7;sub++){                                     CString sb=CtlistControl1.GetItemText(nItem,sub);                                     if(sb!=(CString)RightFormVew_buffDim[nItem][sub]){                                                 CtlistControl1.SetItemText(nItem,sub,RightFormVew_buffDim[nItem][sub]);                                                 }                                     }                         //=========================================                         List1RowListControl(pDC,nItem);                         break;         }
 }
 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 void RightFormVew::List1RowListControl(CDC* pDC,int nItem)
 {
     CControlPracticeDoc* pDoc = GetDocument();
 //========================================================= COLORREF clrTextSave =pDC->SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT)); COLORREF clrBkSave = pDC->SetBkColor(::GetSysColor(COLOR_HIGHLIGHT)); //==================ブラシの初期化=========================     CBrush cbrA,cbrB; //RGB(255,241,0)  RGB(243,152,0) RGB(233,83,131)  //RGB(143,195,31) RGB(0,153,217) RGB(237,109,70)  cbrA.CreateSolidBrush(RGB(233, 83,131)); cbrB.CreateSolidBrush(RGB(255,255,255)); //========================================================= CPen      pen; CPen* pOldPen; pen.CreatePen(PS_SOLID,1,LINE_COLOR); pOldPen=pDC->SelectObject(&pen); //========================================================= CRect rcAllLabels; CtlistControl1.GetItemRect(nItem, rcAllLabels, LVIR_BOUNDS); //========================================================= CRect lRect,rc; pDC->SetTextColor(RGB(0,0,0)); //========================================================= int topIndex=CtlistControl1.GetTopIndex();            //表示の先頭nItem int nLast = topIndex+CtlistControl1.GetCountPerPage();//表示の後端nItem //======================列幅は3個です======================
 for(int i=0; i<3; i++){         //=====================================        
 pDC->SelectObject(&pen);             //=====================================         CtlistControl1.GetSubItemRect(nItem,i,LVIR_BOUNDS,lRect);         //================縦線===============         pDC->MoveTo(lRect.left,lRect.top)    ;         pDC->LineTo(lRect.left,lRect.bottom) ;         //================横線===============         pDC->MoveTo(lRect.left ,lRect.bottom);         pDC->LineTo(lRect.right,lRect.bottom);         //================文字を表示します==========         lRect.right=CtlistControl1.GetColumnWidth(i);         lRect.top+=1; lRect.bottom-=1;         pDC->SetTextColor(RGB(0,0,0));         //==========================================         CString vt=_T("");         vt.Format(_T("文字列=%s"),CtlistControl1.GetItemText(nItem,i));             pDC->DrawText(vt,-1,lRect,DT_LEFT | DT_SINGLELINE | DT_VCENTER);         }
 }
 ///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
 void RightFormVew::OnBnClickedOk()
 {
     CControlPracticeDoc* pDoc = GetDocument();
     pDoc->FormVewNmcer |=0x21  ;//ID OK   を設定 
     CWnd* pWnd=AfxGetMainWnd() ;
     pWnd->SendMessage(ID_VEW_CHENGER);//メインフレ-ムへ指示を発信
 }
 ///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
 void RightFormVew::OnBnClickedCancel()
 {
     CControlPracticeDoc* pDoc = GetDocument();
     pDoc->FormVewNmcer |=0x22  ;//ID CANCEL を設定  
     CWnd* pWnd=AfxGetMainWnd() ;
     pWnd->SendMessage(ID_VEW_CHENGER);//メインフレ-ムへ指示を発信
 }

さていよいよメッセィ-ジの応答を確認して見たいと思います、実行画面をご覧ください,赤い枠内にOKとキャンセル・ボタンが配置してあります。OKボタンが押された時メインフレ-ムのVEWchengerを起動させる場合どの様にすれば良いのか貴方は解りますか?メインフレ-ムに存在するVEWchengerには直接アクセスは出来ません!でもアプリケ-ションではその様な処理が必要かも知れません、さ!貴方はどうしますか?、条件としてアイコンボタンは配置して居りません。

呼び出されたVEWchengerにはOKボタンが押されたと情報を伝えないと行けません。又VEWchengerは多数のフレ-ムを管理しなくてはいけないのですから当然の事として呼びだしたフレ-ムが何処の誰が要求を発信したのか?知る必要が有ります、どの様に情報を伝えたら良いのでしょうか。

ツリ-コントロ-ルのソ-ス

// ControlPracticeView.h : ControlPracticeView クラスのインターフェイス
 //
 pragma once
 include "afxcmn.h"
 class ControlPracticeView : public CFormView
 {
 protected: // シリアル化からのみ作成します。
     ControlPracticeView();
     DECLARE_DYNCREATE(ControlPracticeView)
 public:
     enum{ IDD = IDD_CONTROLPRACTICE_FORM };
     ////////////////////////////////////////////////////////////////
     CArray arrayPassDirHandl;
 // 属性
 public:
     CControlPracticeDoc* GetDocument() const;
     ////////////////////////////////////////////////////////////////
     void CStringDataMoveToStaticEriyaReset();
     void CStringDataMoveToStaticEriya(CString vs,int item,int isub);
     ////////////////////////////////////////////////////////////////
     CArray arrayDirectoryList;//ツリ-コントロ-ルに表示する項目を保存
 // 操作
 public:
     ////////////////////////////////////////////////////////////////
     CString SearchFile(CString strFolder);
     bool    TreeMenberChck(CString vn);
     ////////////////////////////////////////////////////////////////
 // オーバーライド
 public:
     virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
 protected:
     virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV サポート
     virtual void OnInitialUpdate(); // 構築後に初めて呼び出されます。
 // 実装
 public:
     virtual ~ControlPracticeView();
     void List1RowListControl(CDC* pDC,int nItem);
 ifdef _DEBUG
 virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const;
 endif
 protected:
         virtual void OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint);
         virtual BOOL PreTranslateMessage(MSG* pMsg);
 // 生成された、メッセージ割り当て関数
 protected:
     DECLARE_MESSAGE_MAP()
 public:
     CListCtrl CtlistControl1;
 public:
     afx_msg void OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct);
     CTreeCtrl ctTreeCtr1;
     afx_msg void OnBnClickedNo();
     afx_msg void OnBnClickedOk();
 };
 ifndef _DEBUG  // ControlPracticeView.cpp のデバッグ バージョン
 inline CControlPracticeDoc* ControlPracticeView::GetDocument() const
    { return reinterpret_cast(m_pDocument); }
 endif
// ControlPracticeView.cpp : ControlPracticeView クラスの実装
 //
 include "stdafx.h"
 include "ControlPractice.h"
 include "ControlPracticeDoc.h"
 include "ControlPracticeView.h"
 include "commctrl.h"
 ifdef _DEBUG
 define new DEBUG_NEW
 endif
 // ControlPracticeView
 IMPLEMENT_DYNCREATE(ControlPracticeView, CFormView)
 BEGIN_MESSAGE_MAP(ControlPracticeView, CFormView)
     ON_WM_SIZE()
     ON_WM_DRAWITEM()
     ON_WM_MEASUREITEM()
     ON_BN_CLICKED(IDNO, &ControlPracticeView::OnBnClickedNo)
     ON_BN_CLICKED(IDOK, &ControlPracticeView::OnBnClickedOk)
 END_MESSAGE_MAP()
 // ControlPracticeView コンストラクション/デストラクション
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 ControlPracticeView::ControlPracticeView()
     : CFormView(ControlPracticeView::IDD)
 {
     // TODO: 構築コードをここに追加します。
 }
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 ControlPracticeView::~ControlPracticeView()
 {
 }
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 void ControlPracticeView::DoDataExchange(CDataExchange* pDX)
 {
     CFormView::DoDataExchange(pDX);
     DDX_Control(pDX, IDC_LIST1, CtlistControl1);
     DDX_Control(pDX, IDC_TREE1, ctTreeCtr1);
 }
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 BOOL ControlPracticeView::PreCreateWindow(CREATESTRUCT& cs)
 {
     // TODO: この位置で CREATESTRUCT cs を修正して Window クラスまたはスタイルを
     //  修正してください。
 return CFormView::PreCreateWindow(cs);
 }
 //============================================================
 //============================================================
 //============================================================
 void ControlPracticeView::OnInitialUpdate()
 {
     CFormView::OnInitialUpdate();
     GetParentFrame()->RecalcLayout();
     ResizeParentToFit();
     //============================================================
     LV_COLUMN  lvc;
     lvc.mask = LVCF_FMT  | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
     //============================================================
     for (int i=0;i<3;i++){
             lvc.iSubItem= i;
             lvc.pszText=ControlPracticeColumnLabel[i];
             lvc.cx     =(int)(ControlPracticeWidth[i]);
             lvc.fmt    =ControlPracticeFmt[i];
             CtlistControl1.InsertColumn(i,&lvc);
             }
     //============================================================
     //============================================================
     //============================================================
     LV_ITEM     lvi;
     lvi.mask = LVIF_TEXT | LVIF_IMAGE |LVIF_PARAM ; 
     lvi.iSubItem =0;
     for(int i=0;i<5;i++){
            lvi.iItem    =i;
            lvi.pszText =ControlPracticeView_buffDim[i][0];
            CtlistControl1.InsertItem(&lvi);
            }
     //============================================================
     //======================ツリ-構築============================
     //============================================================
     int cunt=(int)arrayDirectoryList.GetCount();
     for(int i=0;i<cunt;i++){
             CString vl=arrayDirectoryList.GetAt(i);
             TreeMenberChck(vl);
             }
 ctTreeCtr1.MoveWindow(5,90,270,250); ctTreeCtr1.ShowWindow(SW_SHOW) ;
 }
 //============================================================
 //============================================================
 //============================================================
 // ControlPracticeView 診断
 ifdef _DEBUG
 void ControlPracticeView::AssertValid() const
 {
     CFormView::AssertValid();
 }
 void ControlPracticeView::Dump(CDumpContext& dc) const
 {
     CFormView::Dump(dc);
 }
 CControlPracticeDoc* ControlPracticeView::GetDocument() const // デバッグ以外のバージョンはインラインです。
 {
     ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CControlPracticeDoc)));
     return (CControlPracticeDoc*)m_pDocument;
 }
 endif //_DEBUG
 // ControlPracticeView メッセージ ハンドラ
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 BOOL ControlPracticeView::PreTranslateMessage(MSG* pMsg)
 {
     CControlPracticeDoc* pDoc = GetDocument();
 //========================================================= CString sval=_T(""); //========================================================= if(pMsg->message==WM_KEYDOWN){         //===============================         switch(pMsg->wParam){                case VK_RETURN  :break;                case VK_CONTROL :break;                case VK_ESCAPE  :break;                case VK_F1      :break;                case VK_F2      :break;                case VK_F3      :break;                case VK_F4      :break;                case VK_F5      :break;                case VK_F6      :break;                case VK_F7      :break;                case VK_F8      :break;                case VK_F9      :break;                case VK_F10     :break;                case VK_UP      :break;                case VK_LEFT    :break;                case VK_DOWN    :break;                case VK_RIGHT   :break;                case VK_DELETE  :break;                case VK_INSERT  :break;                 }         } return CFormView::PreTranslateMessage(pMsg);
 }
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 // MeikingDish メッセージ ハンドラ
 void ControlPracticeView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
 {
     int cunt=0;
     CControlPracticeDoc* pDoc = GetDocument();
     //========================================================
     switch(lHint){
         case ID_FORM_CONTROL_PRAVEW_ID_OK_DIS:
              cunt=1;//試験
              break ;
         case ID_FORM_CONTROL_PRAVEWID_CANCSL_DIS:
              cunt=1;//試験
              break;
     //==============ビューが切り替わりが強要されました==========
         case 0:
              arrayDirectoryList.RemoveAll();//リセット
              SearchFile(_T("O:\SD I"))    ;
              cunt=(int)arrayDirectoryList.GetCount();
              break;
         }
 }
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 void ControlPracticeView::CStringDataMoveToStaticEriyaReset()
 {
     CString vs=_T("    ");
 try{
     for(int item=0;item<100;item++){
         for(int isub=0;isub<8;isub++){
                 _tcsncpy_s(ControlPracticeView_buffDim[item][isub],MAX_PATH,(LPCTSTR)vs,_TRUNCATE);
                 }
         }
     }catch(CMemoryException e){
             e.ReportError();
             e.Delete()     ;
             }
 }
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 void ControlPracticeView::CStringDataMoveToStaticEriya(CString vs,int item,int isub)
 {
 try{
     _tcsncpy_s(ControlPracticeView_buffDim[item][isub],MAX_PATH,(LPCTSTR)vs,_TRUNCATE);
     }catch(CMemoryException e){
             e.ReportError();
             e.Delete()     ;
             }
 }
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 void ControlPracticeView::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
 {
     CControlPracticeDoc* pDoc = GetDocument();
 //======================================================== CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC); CRect rcItem(lpDrawItemStruct->rcItem); int nItem = lpDrawItemStruct->itemID  ; //============================================= LV_ITEM     lvi; switch(lpDrawItemStruct->CtlID) {         case IDC_LIST1:                         lvi.mask = LVIF_TEXT | LVIF_IMAGE |LVIF_PARAM ;                          lvi.iSubItem =0;                         //=========================================                         lvi.iItem    =nItem;                         lvi.pszText =ControlPracticeView_buffDim[nItem][0];                         CtlistControl1.SetItem(&lvi);                         for(int sub=0;sub<7;sub++){                                     CString sb=CtlistControl1.GetItemText(nItem,sub);                                     if(sb!=(CString)ControlPracticeView_buffDim[nItem][sub]){                                                 CtlistControl1.SetItemText(nItem,sub,ControlPracticeView_buffDim[nItem][sub]);                                                 }                                     }                         //=========================================                         List1RowListControl(pDC,nItem);                         break;         }
 }
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 void ControlPracticeView::List1RowListControl(CDC* pDC,int nItem)
 {
     CControlPracticeDoc* pDoc = GetDocument();
 //========================================================= COLORREF clrTextSave =pDC->SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT)); COLORREF clrBkSave = pDC->SetBkColor(::GetSysColor(COLOR_HIGHLIGHT)); //==================ブラシの初期化=========================     CBrush cbrA,cbrB; //RGB(255,241,0)  RGB(243,152,0) RGB(233,83,131)  //RGB(143,195,31) RGB(0,153,217) RGB(237,109,70)  cbrA.CreateSolidBrush(RGB(233, 83,131)); cbrB.CreateSolidBrush(RGB(255,255,255)); //========================================================= CPen      pen; CPen* pOldPen; pen.CreatePen(PS_SOLID,1,LINE_COLOR); pOldPen=pDC->SelectObject(&pen); //========================================================= CRect rcAllLabels; CtlistControl1.GetItemRect(nItem, rcAllLabels, LVIR_BOUNDS); //========================================================= CRect lRect,rc; pDC->SetTextColor(RGB(0,0,0)); //========================================================= int topIndex=CtlistControl1.GetTopIndex();            //表示の先頭nItem int nLast = topIndex+CtlistControl1.GetCountPerPage();//表示の後端nItem
 }
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////フォルダ-内部をを収集する//////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 CString ControlPracticeView::SearchFile(CString strFolder)
 {
     CControlPracticeDoc* pDoc = GetDocument();
     //======================================================================
     CFileFind FileFind    ;
     CString finFile=_T("");
     BOOL bContinue = TRUE ;
     //====================== すべてのファイルを検索=========================
     CString strSearchFile = strFolder + _T("\.");
     //======================================================================
     if(!FileFind.FindFile(strSearchFile)) return _T(""); 
     //======================================================================
     TRACE("%s\n",strFolder); 
     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 nestName;
                     nestName.Add(tkn)               ;
                     for(int i=0;i<arrayPassDirHandl.GetCount();i++){
                                 ms_Tr=arrayPassDirHandl.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=ctTreeCtr1.InsertItem(tkn,lhChildItem,TVI_LAST)  ;
                                 arrayPassDirHandl.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=ctTreeCtr1.InsertItem(tkn,ms_TreeControl.hItem,TVI_LAST);
                                         arrayPassDirHandl.Add(ms_TreeControl);  tkn=vn.Tokenize(_T("\"),count) ;
                                         }
                                 return TRUE;
                                 }
                     }
             }
     else{   //================TOP Rootの場合==============================
             HTREEITEM lhChildItem=ctTreeCtr1.GetChildItem(0)     ;
             CString tkn=vn.Tokenize(_T("\"),count),FilVal=_T("");
             ms_TreeControl.hItem=lhChildItem      ; arrayPassDirHandl.Add(ms_TreeControl);
             ms_TreeControl.val=vn                 ; ms_TreeControl.Categori=tkn   ;
             ms_TreeControl.HierarchicalNumber=Nest; FilVal=tkn+_T("\")           ;
             ms_TreeControl.hItem=ctTreeCtr1.InsertItem(tkn,lhChildItem,TVI_LAST)  ;
             arrayPassDirHandl.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=ctTreeCtr1.InsertItem(tkn,ms_TreeControl.hItem,TVI_LAST);
                     arrayPassDirHandl.Add(ms_TreeControl) ; tkn=vn.Tokenize(_T("\"),count) ;
                     }
             return TRUE;
             }
     return TRUE;
 }
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
 void ControlPracticeView::OnBnClickedNo()
 {
     CControlPracticeDoc* pDoc = GetDocument();
 }
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
 void ControlPracticeView::OnBnClickedOk()
 {
     CControlPracticeDoc* pDoc = GetDocument();
 }
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

フレームワークのメッセ-ジ

https://youtu.be/-8adm1E5SdA

初期化は正常だが表示関数が呼ばれない

https://youtu.be/6LJrR8dNze8

ツリ-コントロ-ルの動き


印刷機構を使うには

実はこのフォ-ムビュ-クラスに対しては印刷機構はサポ-としないと警告が出るんですが私はこちらの方が使いやすく大好きです(笑い)、他のビユ-だって変わらないんですがね!

印刷と言っても色々ありますよ!BMPの印刷とか画面のコピ-とか数多くの問題が山程有るんですが、話は違いますが絶対にロ-カルの変数にはそのフォ-ムからだけしかアクセスしては行けません例外発生で万歳しなければならない状況になると思います、必ずスタティク領域に配置してアクセスする様に忠告しておきます、多くの方がこれが原因でリリ-スバ-ジョンを諦める事が多いのですから。

まずはフォントから組み込ます

フォ-ム・ビュ-には印刷機構を組み込む必要が有りますが、これが又難しいのです。自動的にフォントサイズとか印刷用紙の選択を組み込んでいきます。でもまずはフォントの設定のやり方です。印刷イベントの処理を詳しく説明します。

コ-ドはドキュメントクラスへ追加

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

void DietRemedyDoc::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 ) {

//MSゴシック体の設定です(固定ピッチフォントで、モダン型です)
          case 0:  
               lf->lfPitchAndFamily =  FIXED_PITCH | FF_MODERN;
               lstrcpy(lf->lfFaceName,_T("MS ゴシック"));
               break;
//MS Pゴシックの設定です(可変ピッチフォントで、モダン型です)
           case 1:   
               lf->lfPitchAndFamily =  VARIABLE_PITCH | FF_MODERN;
               lstrcpy(lf->lfFaceName,_T("MS Pゴシック"));
               break;
//MS明朝の設定です(固定ピッチフォントで、ローマン型です)
           case 2:   
               lf->lfPitchAndFamily =  FIXED_PITCH | FF_ROMAN;
               lstrcpy(lf->lfFaceName,_T("MS 明朝"));
               break;
 //MS P明朝の設定です(可変ピッチフォントで、ローマン型です)
            case 3:   
               lf->lfPitchAndFamily =  VARIABLE_PITCH | FF_ROMAN;
               lstrcpy(lf->lfFaceName ,_T("MS P明朝"));
               break;
     }
     return;
 }

印刷用紙の選択まで

今までの上記にある全てのコ-ドを含みます、スクロ-ズせずにリストしていますハ-ドコピ-してご覧ください。


https://youtu.be/DDLIi4f_juQ

印刷機構を組み込む

つぎはフォ-ムビュ-に印刷機構を組み込んでデバックして見ましょうどの様に処理は流れるのでしょうか?見ものですね~、MFCではこのフォ-ムビュ-には印刷はサポ-としていませんが(笑い)此処でも重要なのはメッセ-ジの伝達です、印刷ボタンを配置しましたこのボタンが押されたら印刷処理が始まる様にプログラムします、さて!貴方はどの様に処理しますかアイコンはわざと組み込んではいません、非常にシンプルで皆さんが応用できるようにしたいと思います。まだビュ-の切り替えは早すぎますし何時でも出来ますから。

処理したいもの::

1:コピ-バッファからのBMP取得からの印刷

2:画面のハ-ドコピ-印刷

3;リストの印刷

4:印刷用紙を選択

5:フォントの切り替え

6:リストコントロ-ルにBMPを表示する

他にも沢山あります。

これからドンドンアプリケ-ションらしく成りますからお楽しみに、応用できる箇所も盛りだくさんです。勿論コ-ドも公開しますよ貴方の仕事に役立て貰えれば幸いです、友達にも教えてあげて下さい沢山の方に公開して上げたいのでお願いです。それが将来日本の為になる事だと私は認識していますし出し惜しみなんか全然私は考えていません。


まずは必要なハンドラを入れ込みます

結構沢山ありますよ!全て組み込んで行きます。

印刷プレビュ-

印刷ボタンを押して、適当ですが印刷プレビュ-を表示して見ましたのでご覧ください。

印刷の為に赤い部分を追加

IDS_TO_PRINTのIDはString Table項目で新しく追加してください。この部分は印刷ボタンが押された時にVewChenger()から呼び出されて来ます。

///////////////////////////////////////////////////////////////////////////
 /////////////////////////    印刷の実行   ////////////////////////////////
///////////////////////////////////////////////////////////////////////////
 void RightFormVew::OnBnClickedPrint()
 {
     CControlPracticeDoc* pDoc = GetDocument();
     pDoc->FormVewNmcer |=0x44  ;//ID CANCEL を設定  
     CWnd* pWnd=AfxGetMainWnd() ;
     pWnd->SendMessage(ID_VEW_CHENGER);//メインフレ-ムへ指示を発信
 }
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
 void ControlPracticeView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
 {
     int cunt=0;
     CControlPracticeDoc* pDoc = GetDocument();
     //========================================================
     switch(lHint){
         case ID_FORM_CONTROL_PRAVEW_ID_OK_DIS:
              cunt=1;//試験
              break ;
         case ID_FORM_CONTROL_PRAVEWID_CANCSL_DIS:
              cunt=1;//試験
              break;
         case IDS_TO_PRINT://印刷開始
              ControlPracticeView::OnFilePrintPreview();
              break;
     //==============ビューが切り替わりが強要されました==========
         case 0:
              arrayDirectoryList.RemoveAll();//リセット
              SearchFile(_T("O:\SD I"))    ;
              cunt=(int)arrayDirectoryList.GetCount();
              break;
         }
 }

VC++の仕事は結構増えていますね~皆さん頑張って基本を覚えましょ!


MFC コントロール(0) 構造体とファイルアクセス   リストコントロ-ルに画像を組み込む



VC++ MFCに印刷機構を組み込む手順の解説     リストコントロ-ルに画像を組み込む         Vewにツリ-コントロ-ルを追加(No5)