アルゴリズムテストプラットフォーム構築共通コードバックアップ

9935 ワード

最近windowsプラットフォームの下で1つの簡単なアルゴリズムのテストプラットフォームを構築してアルゴリズムのテストを行います(またwindowsの下のアルゴリズムの開発をします~)
そこで、よく使われるMFCコードのコードを以下にまとめます.
  • パス選択ダイアログ
  • void CMuraDetectDlg::OnMenuChoosePath()
    {
        // TODO:              
        wchar_t szPath[MAX_PATH] = {0};
    
        BROWSEINFO bi;
        bi.hwndOwner = m_hWnd;
        bi.pidlRoot  = NULL;
        bi.lpszTitle = _T("          :");
        bi.ulFlags   = 0;
        bi.lpfn      = NULL;
        bi.lParam    = 0;
        bi.iImage    = 0;
        bi.pszDisplayName = szPath;
    
        //         
        LPITEMIDLIST lp = SHBrowseForFolder(&bi);
        if (lp && SHGetPathFromIDList(lp, szPath))
        {
            CString str;
            str.Format(_T("       %s"), szPath);
            AfxMessageBox(str);
        }
        else
        {
            AfxMessageBox(_T("     ,     "));
        }
    
        m_file_path = m_util.UnicodeToANSI(szPath);
    }
  • MFCにおける各種符号化フォーマットの変換
  • // ANSI to Unicode
    wstring CUtil::ANSIToUnicode(const string& str)
    {
        int  len = 0;
        len = str.length();
        int  unicodeLen = ::MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, NULL, 0);
        wchar_t *  pUnicode;
        pUnicode = new  wchar_t[unicodeLen + 1];
        memset(pUnicode, 0, (unicodeLen + 1)*sizeof(wchar_t));
        ::MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, (LPWSTR)pUnicode, unicodeLen);
        wstring  rt;
        rt = (wchar_t*)pUnicode;
        delete  pUnicode;
    
        return  rt;
    }
    
    //Unicode to ANSI
    string CUtil::UnicodeToANSI(const wstring& str)
    {
        char*     pElementText;
        int    iTextLen;
        // wide char to multi char
        iTextLen = WideCharToMultiByte(CP_ACP,
            0,
            str.c_str(),
            -1,
            NULL,
            0,
            NULL,
            NULL);
        pElementText = new char[iTextLen + 1];
        memset((void*)pElementText, 0, sizeof(char)* (iTextLen + 1));
        ::WideCharToMultiByte(CP_ACP,
            0,
            str.c_str(),
            -1,
            pElementText,
            iTextLen,
            NULL,
            NULL);
        string strText;
        strText = pElementText;
        delete[] pElementText;
        return strText;
    }
    
    // UTF - 8 to Unicode
    wstring CUtil::UTF8ToUnicode(const string& str)
    {
        int  len = 0;
        len = str.length();
        int  unicodeLen = ::MultiByteToWideChar(CP_UTF8,
            0,
            str.c_str(),
            -1,
            NULL,
            0);
        wchar_t *  pUnicode;
        pUnicode = new  wchar_t[unicodeLen + 1];
        memset(pUnicode, 0, (unicodeLen + 1)*sizeof(wchar_t));
        ::MultiByteToWideChar(CP_UTF8,
            0,
            str.c_str(),
            -1,
            (LPWSTR)pUnicode,
            unicodeLen);
        wstring  rt;
        rt = (wchar_t*)pUnicode;
        delete  pUnicode;
    
        return  rt;
    }
    
    // Unicode to UTF - 8
    string CUtil::UnicodeToUTF8(const wstring& str)
    {
        char*     pElementText;
        int    iTextLen;
        // wide char to multi char
        iTextLen = WideCharToMultiByte(CP_UTF8,
            0,
            str.c_str(),
            -1,
            NULL,
            0,
            NULL,
            NULL);
        pElementText = new char[iTextLen + 1];
        memset((void*)pElementText, 0, sizeof(char)* (iTextLen + 1));
        ::WideCharToMultiByte(CP_UTF8,
            0,
            str.c_str(),
            -1,
            pElementText,
            iTextLen,
            NULL,
            NULL);
        string strText;
        strText = pElementText;
        delete[] pElementText;
        return strText;
    }
    
  • 指定フォルダの下のすべての指定フォーマットのファイルを取得ここでboostを使って、サーバーの开発をしてboostを使ってから、离れられなくて、どんな机能も直接boostを使いたいと思って、やはり毒があります!!
  • int CUtil::get_path_allfiles(const std::string& dir, const std::string fmt, bool mult_layer, std::vector<std::string>& filenames)
    {
        filesystem::path path(dir);
        if (!filesystem::exists(path))
        {
            return -1;
        }
    
        filesystem::directory_iterator end_iter;
        for (filesystem::directory_iterator iter(path); iter != end_iter; ++iter)
        {
            if (filesystem::is_regular_file(iter->status()))
            {
                string tmp_name = iter->path().string();
                if (tmp_name.size() < 4)
                {
                    continue;
                }
                tmp_name = tmp_name.substr(tmp_name.size() - 4, 4);
                if (tmp_name.compare(fmt) == 0)
                {
                    filenames.push_back(iter->path().string());
                }
            }
    
            if (filesystem::is_directory(iter->status()))
            {
                if (mult_layer)
                {
                    get_path_allfiles(iter->path().string(), fmt, mult_layer, filenames);
                }
            }
        }
    
        return (int)filenames.size();
    }

    4.