MFC VC++ コントロ-ルの使い方

// 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 IDS_TO_PRINT://印刷開始
ControlPracticeView::OnFilePrintPreview();
break;
//==============ビューが切り替わりが強要されました==========
case 0:
arrayDirectoryList.RemoveAll();//リセット
SearchFile(_T(“O:\SD I”)) ;
cunt=(int)arrayDirectoryList.GetCount();
break;
}
}
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////

BOOL ControlPracticeView::OnPreparePrinting(CPrintInfo* pInfo)
{
CControlPracticeDoc* pDoc = GetDocument();

pInfo->SetMaxPage(2); // the document is two pages long:
// the first page is the title page
// the second is the drawing
BOOL bRet = DoPreparePrinting(pInfo);// default preparation
pInfo->m_nNumPreviewPages =2; // Preview 2 pages at a time
return bRet;
}
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
void ControlPracticeView::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo)
{
//TODO: 印刷前の特別な初期化処理を追加してください。
CFormView::OnBeginPrinting(pDC, pInfo);
}
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
void ControlPracticeView::OnEndPrinting(CDC* pDC, CPrintInfo* pInfo)
{
// TODO: ここに特定なコードを追加するか、もしくは基本クラスを呼び出してください。
CFormView::OnEndPrinting(pDC, pInfo);
}

/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
void ControlPracticeView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo)
{
CControlPracticeDoc* pDoc = GetDocument();

if(pDC->IsPrinting()) {// Is the DC a printer DC.
CFormView::OnPrepareDC(pDC, pInfo);
pDC->SetMapMode(MM_ISOTROPIC ) ;
CSize sizeDoc = pDoc->GetDocSize();
pDC->SetWindowExt(sizeDoc) ;
}
}
/////////////////////////////////////////////////////////////////////////////
/////////////////////     縦ページ    ///////////////////////////////
/////////////////////////////////////////////////////////////////////////////
void ControlPracticeView::MyPrinteDrwTypeV(CDC* pDC, CPrintInfo* pInfo)
{
CControlPracticeDoc* pDoc = GetDocument();

int startPos=pInfo->m_rectDraw.top;
int hight=0;
//———————————
TEXTMETRIC textMetric;
LOGFONT lf;
CFont hFont,* pOldFont ;
//———————————
pDoc->MakeLogFont(&lf,2,2,18);
hFont.CreateFontIndirect(&lf);
pOldFont = pDC->SelectObject(&hFont);
pDC->GetTextMetrics(&textMetric);
hight=(int)textMetric.tmHeight ;
pDC->SetTextAlign(TA_LEFT) ;

int span=15;
pDC->TextOut(40 ,span,_T(“1人当たりの摂取・栄養素合計”));

span-=hight+(hight/2);
}
/////////////////////////////////////////////////////////////////////////////
//////////////////////  縦2ページ~ /////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
void ControlPracticeView::MyPrinteDrwTypeSecoundV(CDC* pDC, CPrintInfo* pInfo)
{
CControlPracticeDoc* pDoc = GetDocument();

int startPos=pInfo->m_rectDraw.top;
int hight=0;

//———————————
TEXTMETRIC textMetric;
LOGFONT lf;
CFont hFont,* pOldFont ;
//———————————
pDoc->MakeLogFont(&lf,2,2,18);
hFont.CreateFontIndirect(&lf);
pOldFont = pDC->SelectObject(&hFont);
pDC->GetTextMetrics(&textMetric);
hight=(int)textMetric.tmHeight ;
pDC->SetTextAlign(TA_LEFT) ;

int span=15 ;
int bottomMax=(int)pInfo->m_rectDraw.bottom;
CString val=_T(“”);
ctRecipiMem.GetWindowTextW(val);
int count=0;
int cs=pInfo->m_rectDraw.right-(textMetric.tmAveCharWidth2); } ///////////////////////////////////////////////////////////////////////////// /////////////////////////   横ページ  ////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// void ControlPracticeView::MyPrinteDrwTypeH(CDC pDC, CPrintInfo* pInfo)
{
CControlPracticeDoc* pDoc = GetDocument();

int startPos=pInfo->m_rectDraw.top;
int hight=0;

//———————————
TEXTMETRIC textMetric;
LOGFONT lf;
CFont hFont,* pOldFont ;
//———————————
pDoc->MakeLogFont(&lf,2,2,18);
hFont.CreateFontIndirect(&lf);
pOldFont = pDC->SelectObject(&hFont);
pDC->GetTextMetrics(&textMetric);
hight=(int)textMetric.tmHeight ;
pDC->SetTextAlign(TA_LEFT) ;

}
/////////////////////////////////////////////////////////////////////////////
//////////////////////  横2ページ~ /////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
void ControlPracticeView::MyPrinteDrwTypeSecoundH(CDC* pDC, CPrintInfo* pInfo)
{
CControlPracticeDoc* pDoc = GetDocument();

int startPos=pInfo->m_rectDraw.top;
int hight=0;

//———————————
TEXTMETRIC textMetric;
LOGFONT lf;
CFont hFont,* pOldFont;
//———————————
pDoc->MakeLogFont(&lf,2,2,18);
hFont.CreateFontIndirect(&lf);
pOldFont = pDC->SelectObject(&hFont);
pDC->GetTextMetrics(&textMetric);
hight=(int)textMetric.tmHeight ;
pDC->SetTextAlign(TA_LEFT) ;
}
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
void ControlPracticeView::OnPrint(CDC* pDC, CPrintInfo* pInfo)
{
if (pInfo != NULL && pInfo->m_bPreview){
CString strHeader=_T(“”);

        PrintPageHeader(pDC, pInfo, strHeader);
        pDC->SetWindowOrg(pInfo->m_rectDraw.left,-pInfo->m_rectDraw.top);
        //--------------------------------------
        //------------縦ページ印刷--------------
        if(pInfo->m_nCurPage==1){
                PeparEriaSize=pInfo->m_rectDraw;
                LPDEVMODE dm=pInfo->m_pPD->GetDevMode();
                // 現在は印刷する物は存在しない
                //TO DO if(dm->dmOrientation==1) MyPrinteDrwTypeV(pDC,pInfo);//縦方向
                //TO DO if(dm->dmOrientation==2) MyPrinteDrwTypeH(pDC,pInfo);//横方向
                return;
                }
        //-------------------------------------
        //------------横ページ印刷-------------
        if(1<pInfo->m_nCurPage){
                PeparEriaSize=pInfo->m_rectDraw;
                LPDEVMODE dm=pInfo->m_pPD->GetDevMode();
                // 現在は印刷する物は存在しない
                //TO DO if(dm->dmOrientation==1) MyPrinteDrwTypeSecoundV(pDC,pInfo);//縦方向
                //TO DO if(dm->dmOrientation==2) MyPrinteDrwTypeSecoundH(pDC,pInfo);//横方向
                return;
                }
        }

}
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
void ControlPracticeView::PrintPageHeader(CDC* pDC, CPrintInfo* pInfo,CString& strHeader)
{
CControlPracticeDoc* pDoc = GetDocument();

LOGFONT  lf;
CFont hFont,* pOldFont ;

pDoc->MakeLogFont(&lf,0,2,18);
hFont.CreateFontIndirect(&lf);
pOldFont = pDC->SelectObject(&hFont);

// Print a page header consisting of the name of
// the document and a horizontal line
// Draw a line across the page, below the header
TEXTMETRIC textMetric;
pDC->GetTextMetrics(&textMetric) ;
int y = -20 - textMetric.tmHeight;          // line 1/10th inch below text
pDC->MoveTo(0, y);                          // from left margin
pDC->LineTo(pInfo->m_rectDraw.right, y);    // to right margin

// Subtract out from the drawing rectange the space used by the header.
y -= 25;    // space 1/4 inch below (top of) line
pInfo->m_rectDraw.top += y  ;
pDC->SelectObject(pOldFont);

}
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
void ControlPracticeView::SetPageSize(CSize size)
{
}
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
void ControlPracticeView::OnDraw(CDC* /pDC/)
{
// TODO: ここに特定なコードを追加するか、もしくは基本クラスを呼び出してください。
}
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
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();
}
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////