⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 msdspprj.cpp

📁 一个完整的编辑器的代码(很值得参考
💻 CPP
字号:

#include "stdafx.h"
#include "editcmd.h"
#include "resource.h"
#include "msdspprj.h"
#include "filesup.h"
	
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#pragma warning ( disable : 4711 )
/////////////////////////////////////////////////////////////////////////////

IMPLEMENT_DYNAMIC (CMsDspProject, CProject)

CMsDspProject::CMsDspProject ()
  {
  }

bool freadln (FILE *fp, LPTSTR pszLine, size_t nSize)
  {
    while (pszLine[_tcslen (pszLine) - 1] != _T ('\n'))
      {
        _fgetts (pszLine, nSize, fp);
        if (feof (fp))
          {
            fclose (fp);
            return false;
          }
      }
    return true;
  }

#define BEGIN_PROJECT _T ("# Begin Project")
#define BEGIN_PROJECT_LEN 15
#define BEGIN_GROUP _T ("# Begin Group")
#define BEGIN_GROUP_LEN 13
#define BEGIN_FILE _T ("# Begin Source File")
#define BEGIN_FILE_LEN 19
#define END_PROJECT _T ("# End Project")
#define END_PROJECT_LEN 13
#define END_GROUP _T ("# End Group")
#define END_GROUP_LEN 11
#define END_FILE _T ("# End Source File")
#define END_FILE_LEN 17
#define SOURCE _T ("SOURCE=")
#define SOURCE_LEN 7

bool CMsDspProject::OpenDsp (CProject *pProject, CProjectItem *pCurrent, LPCTSTR pszPath, LPCTSTR pszMidPath)
  {
    CWaitCursor wait;

    if (!FileExist (pszPath))
      return false;

    FILE *fp = _tfopen (pszPath, _T ("rt"));
    if (!fp)
      return false;

    TCHAR szLine[256], *pszLine;
    int nLine;
    bool bEoln;

    for (;;)
      {
        _fgetts (szLine, sizeof (szLine), fp);
        nLine = _tcslen (szLine);
        bEoln = szLine[nLine - 1] == _T ('\n');
        if (bEoln)
          szLine[nLine-- - 1] = _T ('\0');
        if (feof (fp) || !_tcsnicmp (szLine, END_PROJECT, END_PROJECT_LEN))
          {
            fclose (fp);
            return false;
          }
        if (!_tcsnicmp (szLine, BEGIN_PROJECT, BEGIN_PROJECT_LEN))
          break;
        if (!bEoln && !freadln (fp, szLine, sizeof (szLine)) || feof (fp))
          return false;
      }

    CProjectItemList lstTree;
    CProjectItem *pNew;

    lstTree.AddTail (pCurrent);
    for (;;)
      {
        _fgetts (szLine, sizeof (szLine), fp);
        nLine = _tcslen (szLine);
        bEoln = szLine[nLine - 1] == _T ('\n');
        if (bEoln)
          szLine[nLine-- - 1] = _T ('\0');
        if (feof (fp) || !_tcsnicmp (szLine, END_PROJECT, END_PROJECT_LEN))
          break;
        if (!_tcsnicmp (szLine, END_GROUP, END_GROUP_LEN))
          {
            if (!lstTree.IsEmpty ())
              lstTree.RemoveTail ();
            pCurrent = lstTree.IsEmpty () ? NULL : lstTree.GetTail ();
          }
        else if (!_tcsnicmp (szLine, BEGIN_GROUP, BEGIN_GROUP_LEN))
          {
            pNew = new CProjectItem;
            szLine[nLine - 1] = _T ('\0');
            pNew->sPath = szLine + BEGIN_GROUP_LEN + 2;
            pNew->sMidPath = pszMidPath;
            pNew->dwType = pCurrent ? PI_GROUP : PI_GROUP|PI_ROOT;
            if (pCurrent)
              pCurrent->lstItems.AddTail (pNew);
            pProject->lstItems.AddTail (pNew);
            lstTree.AddTail (pNew);
            pCurrent = pNew;
          }
        else if (!_tcsnicmp (szLine, BEGIN_FILE, BEGIN_FILE_LEN))
          {
            if (!bEoln && !freadln (fp, szLine, sizeof (szLine)) || feof (fp))
              break;
            bool bEoln2;
            for (;;)
              {
                _fgetts (szLine, sizeof (szLine), fp);
                nLine = _tcslen (szLine);
                bEoln2 = szLine[nLine - 1] == _T ('\n');
                if (bEoln2)
                  szLine[nLine-- - 1] = _T ('\0');
                if (feof (fp) || !_tcsnicmp (szLine, END_PROJECT, END_PROJECT_LEN) || !_tcsnicmp (szLine, END_FILE, END_FILE_LEN))
                  break;
                if (!_tcsnicmp (szLine, END_GROUP, END_GROUP_LEN))
                  {
                    if (!lstTree.IsEmpty ())
                      lstTree.RemoveTail ();
                    pCurrent = lstTree.IsEmpty () ? NULL : lstTree.GetTail ();
                    break;
                  }
                if (!_tcsnicmp (szLine, SOURCE, SOURCE_LEN))
                  {
                    pNew = new CProjectItem;
                    pszLine = szLine + SOURCE_LEN;
                    pszLine = _tcsncmp (pszLine, _T (".\\"), 2) ? pszLine : pszLine + 2;
                    pNew->sPath = pszLine;
                    pNew->sMidPath = pszMidPath;
                    pNew->dwType = pCurrent ? PI_FILE : PI_FILE|PI_ROOT;
                    if (pCurrent)
                      pCurrent->lstItems.AddTail (pNew);
                    pProject->lstItems.AddTail (pNew);
                  }
                if (!bEoln2 && !freadln (fp, szLine, sizeof (szLine)) || feof (fp))
                  break;
              }
          }
        if (!bEoln && !freadln (fp, szLine, sizeof (szLine)) || feof (fp))
          break;
      }

    fclose (fp);
    return true;
  }

bool CMsDspProject::Open (LPCTSTR pszPath)
  {
    if (OpenDsp (this, NULL, pszPath, _T ("")))
      {
        sPath = pszPath;
        return true;
      }
    return false;
  }

bool CMsDspProject::Save (LPCTSTR pszPath)
  {
    AfxMessageBox (_T ("Not implemented yet."));
    return false;
  }

/////////////////////////////////////////////////////////////////////////////
#pragma warning ( default : 4711 )

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -