VC++解析CADメニュー

9469 ワード

.H
// CadMenuParserDlg.h :    
//


#pragma once




// CCadMenuParserDlg    
class CCadMenuParserDlg : public CDialog
{
//   
public:
CCadMenuParserDlg(CWnd* pParent = NULL);//       


//      
enum { IDD = IDD_CADMENUPARSER_DIALOG };


protected:
virtual void DoDataExchange(CDataExchange* pDX);// DDX/DDV   
void FindFiles(CTreeCtrl* m_Tree,HTREEITEM root,HTREEITEM parent,CString strPath,int deep);

void AddChildItems(CTreeCtrl* m_Tree,POSITION& position,HTREEITEM parent);
void AddRootChild(CTreeCtrl* m_Tree,POSITION position,HTREEITEM root);
bool MenuItemHasChild(const CString& ItemStr);
bool ContainSubStr(const CString& str,const CString& subStr);
void ExtractMenuCtn(CString& menuItemStr);
void FiltNodesHasChild(POSITION& position);
//=============


void GetParentItemStr(CTreeCtrl* tree,HTREEITEM item,CString& path);
CString m_buffer;
CStringList m_nodeLst;
//   
protected:
HICON m_hIcon;


//          
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClickedBtnfiledlg();
afx_msg void OnBnClickedBtndirdlg();
afx_msg void OnTvnSelchangedTreenodes(NMHDR *pNMHDR, LRESULT *pResult);
afx_msg void OnNMDblclkTreenodes(NMHDR *pNMHDR, LRESULT *pResult);
};

.CPP

// CadMenuParserDlg.cpp :     
//


#include "stdafx.h"
#include "CadMenuParser.h"
#include "CadMenuParserDlg.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#endif




// CCadMenuParserDlg    








CCadMenuParserDlg::CCadMenuParserDlg(CWnd* pParent /*=NULL*/)
: CDialog(CCadMenuParserDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}


void CCadMenuParserDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}


BEGIN_MESSAGE_MAP(CCadMenuParserDlg, CDialog)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_BTNFILEDLG, &CCadMenuParserDlg::OnBnClickedBtnfiledlg)
ON_BN_CLICKED(IDC_BTNDIRDLG, &CCadMenuParserDlg::OnBnClickedBtndirdlg)
ON_NOTIFY(TVN_SELCHANGED, IDC_TREENODES, &CCadMenuParserDlg::OnTvnSelchangedTreenodes)
ON_NOTIFY(NM_DBLCLK, IDC_TREENODES, &CCadMenuParserDlg::OnNMDblclkTreenodes)
END_MESSAGE_MAP()




// CCadMenuParserDlg       


BOOL CCadMenuParserDlg::OnInitDialog()
{
CDialog::OnInitDialog();


//          。              ,     
//       
SetIcon(m_hIcon, TRUE);//      
SetIcon(m_hIcon, FALSE);//      


// TODO:             





return TRUE;  //           ,     TRUE
}


//              ,        
//        。      /      MFC     ,
//           。


void CCadMenuParserDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); //           


SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0);


//             
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;


//     
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}


//                      
//  。
HCURSOR CCadMenuParserDlg::OnQueryDragIcon()
{
return static_cast(m_hIcon);
}




////  CAD  ================================================


bool CCadMenuParserDlg::ContainSubStr(const CString& str,const CString& subStr){
return str.Find(subStr) != -1;
}


void CCadMenuParserDlg::ExtractMenuCtn(CString& menuItemStr){
CString s;
bool save = false;
for(int i = 0;i < menuItemStr.GetLength();i ++){

wchar_t chr= menuItemStr.GetAt(i);


if(']' == chr){
menuItemStr = s;
return;
}
if('[' == chr){
save  = true;
continue;
}
if(save){
s.AppendChar(menuItemStr.GetAt(i));
}
}
}


////     
void CCadMenuParserDlg::AddChildItems(CTreeCtrl* m_Tree,POSITION& position,HTREEITEM parent){


CString strNode;
while (position != NULL)
{


   strNode = m_nodeLst.GetNext(position);
   HTREEITEM current = m_Tree->InsertItem(strNode,NULL,NULL,parent);


   if(this->MenuItemHasChild(strNode)){
//POSITION p = position;
  this->AddChildItems(m_Tree,position,current);
   }


   if(this->ContainSubStr(strNode,_T("ContainSubStr(strNode,_T("***POP"))){


   return;
   }
   
   HTREEITEM current = m_Tree->InsertItem(strNode,NULL,NULL,root);
   if(MenuItemHasChild(strNode)){


this->AddChildItems(m_Tree,position,current);
   }
}


}




////           
bool CCadMenuParserDlg::MenuItemHasChild(const CString& itemStr){
return itemStr.Find(_T("->")) != -1;
}




void CCadMenuParserDlg::OnBnClickedBtnfiledlg()
{
// TODO:               


CFileDialog dlg(TRUE, NULL, NULL,
       OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
       NULL);




    if(dlg.DoModal() == IDOK)
    {


////    
CString szFilename = dlg.GetPathName();
CFile f;
f.Open(szFilename,CFile::modeReadWrite);


////    
char* buf = new char[f.GetLength() + 1];
buf[f.GetLength()] = 0;


f.Read(buf,f.GetLength());
f.Close();
m_buffer = CString(buf);


////  LIST
CString str;
bool read = false;


for(int i = 0;i < m_buffer.GetLength();i++){

if(m_buffer.GetAt(i) == '
'){ if(this->ContainSubStr(str,_T("***POP500"))){ break; } if(this->ContainSubStr(str,_T("***POP"))){ m_nodeLst.AddTail(str); str.Empty(); read = true; continue; } if(read && this->ContainSubStr(str,_T("ID_")) ){ //// this->ExtractMenuCtn(str); m_nodeLst.AddTail(str); str.Empty(); continue; } str.Empty(); } str.AppendChar(m_buffer.GetAt(i)); } CTreeCtrl* m_Tree = (CTreeCtrl*)GetDlgItem(IDC_TREENODES); m_Tree->DeleteAllItems(); //// m_Tree->ModifyStyle(NULL,TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT); //HTREEITEM root = m_Tree->InsertItem(szPath,NULL,NULL);///root POSITION rPos; rPos = m_nodeLst.GetHeadPosition(); CString strNode; while (rPos != NULL) { strNode = m_nodeLst.GetNext(rPos); if(this->ContainSubStr(strNode,_T("***POP"))){ strNode = m_nodeLst.GetNext(rPos); HTREEITEM root = m_Tree->InsertItem(strNode,NULL,NULL);//// root this->AddRootChild(m_Tree,rPos,root); } } } } //// =============================================================== void CCadMenuParserDlg::FindFiles(CTreeCtrl* m_Tree,HTREEITEM root,HTREEITEM parent,CString strPath,int deep){ //// 10 if(deep > 10){ return; } CString strWildcard(strPath); strWildcard += _T("\\*.*"); CFileFind ff; BOOL bFind = ff.FindFile(strWildcard); while(bFind) { bFind = ff.FindNextFile(); if (ff.IsDots() || ff.IsSystem() || ff.IsHidden()) continue; if (ff.IsDirectory()) { CString dir = ff.GetFilePath(); HTREEITEM currentNode; if(parent==NULL){ currentNode = m_Tree->InsertItem(dir,NULL,NULL,root); } else{ currentNode = m_Tree->InsertItem(dir,NULL,NULL,parent); } this->FindFiles(m_Tree,root,currentNode,dir,++deep); } else { CString strFileName = ff.GetFilePath(); if(parent==NULL){ m_Tree->InsertItem(strFileName,NULL,NULL,root); } else{ m_Tree->InsertItem(strFileName,NULL,NULL,parent); } } } } void CCadMenuParserDlg::OnBnClickedBtndirdlg() { CString strP =_T(" "); int length = 1024; LPWSTR szPath = strP.GetBuffer(1024); // do something with the string that pwsz points to. strP.ReleaseBuffer(); CString str; BROWSEINFO bi; bi.hwndOwner = m_hWnd; bi.pidlRoot = NULL; bi.pszDisplayName = szPath; bi.lpszTitle = _T(" :"); bi.ulFlags = 0; bi.lpfn = NULL; bi.lParam = 0; bi.iImage = 0; // LPITEMIDLIST lp = SHBrowseForFolder(&bi); if(lp && SHGetPathFromIDList(lp,szPath)) { CTreeCtrl* m_Tree = (CTreeCtrl*)GetDlgItem(IDC_TREENODES); m_Tree->DeleteAllItems(); //// m_Tree->ModifyStyle(NULL,TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT); HTREEITEM root = m_Tree->InsertItem(szPath,NULL,NULL);///root this->FindFiles(m_Tree,root,NULL,szPath,0); } else { AfxMessageBox(_T(" , ")); } // TODO: } void CCadMenuParserDlg::OnTvnSelchangedTreenodes(NMHDR *pNMHDR, LRESULT *pResult) { LPNMTREEVIEW pNMTreeView = reinterpret_cast(pNMHDR); CTreeCtrl* m_Tree = (CTreeCtrl*)GetDlgItem(IDC_TREENODES); HTREEITEM item = m_Tree->GetSelectedItem(); CString itemTxt = m_Tree->GetItemText(item); CStatic* lbl = (CStatic*)GetDlgItem(IDC_LBLNODETEXT); lbl->SetWindowText(itemTxt); // TODO: *pResult = 0; } //======================================================= void CCadMenuParserDlg::GetParentItemStr(CTreeCtrl* tree,HTREEITEM item,CString& path){ } //// , void CCadMenuParserDlg::OnNMDblclkTreenodes(NMHDR *pNMHDR, LRESULT *pResult) { CTreeCtrl* m_Tree = (CTreeCtrl*)GetDlgItem(IDC_TREENODES); CString path; HTREEITEM item = m_Tree->GetSelectedItem(); path = m_Tree->GetItemText(item); if(this->ContainSubStr(path,_T(".txt"))){ CFile f; f.Open(path,CFile::modeReadWrite); char* buf = new char[f.GetLength() + 1]; buf[f.GetLength()] = 0; f.Read(buf,f.GetLength()); f.Close(); CString s(buf); CEdit* txt = (CEdit*)GetDlgItem(IDC_TXTDOC); txt->SetWindowText(s); } else{ AfxMessageBox(_T(" TXT , ")); } // TODO: *pResult = 0; }