2017年11月26日 星期日

[ Windows | MFC ] easy way to convert string between UNICODE <-> ANSI

easy way to convert between UNICODE <-> ANSI (wchar_t* <-> char*);
simply use CStringA & CStringW;

>>
char* char_ansi="ansi";
CStringA cs_ansi(char_ansi);

wchar_t* char_unicode=_T("unicode");
CStringW cs_unicode(char_unicode);

than run function below.

CStringA Utility::convertCStringW2A(CStringW wString)
{
     CStringA aString = CW2A(wString);
     return aString;
}

CStringW Utility::convertCStringA2W(CStringA aString)
{
     CStringW wString = CA2W(aString);
     return wString;
}


[ Windows | MFC ] ini file operations ( read/write )

bool ClassName::isFullPath(CString cs)
{
     if (cs.Find(_T(":")) != -1)
         return true;
     else
         return false;
}

CString ClassName::getAppExePath()
{
     CString path;
     GetModuleFileName(NULL, path.GetBufferSetLength(MAX_PATH + 1), MAX_PATH);
     path.ReleaseBuffer();
     int nPos = path.ReverseFind('\\');
     return path.Left(nPos + 1);
}

bool ClassName::iniWrite_String(CString sectionName, CString keyName, CString keyValue, CString iniFileName)
{
     CString iniFullFilePath;
     if (isFullPath(iniFileName))
         iniFullFilePath = iniFileName;
     else
         iniFullFilePath = getAppExePath() + iniFileName;

     int res = WritePrivateProfileString(sectionName, keyName, keyValue, iniFullFilePath);
     if (res == 0)
     {
         TRACE(_T("%s:%d, WritePrivateProfileString fail:0x%x\n"), __FUNCTIONW__, __LINE__, GetLastError());
         return false;
     }
     else
     {
         return true;
     }
}

bool ClassName::iniWrite_Int(CString sectionName, CString keyName, int keyValue, CString iniFileName)
{
     CString csTemp;
     csTemp.Format(_T("%d"), keyValue);

     CString iniFullFilePath;
     if (isFullPath(iniFileName))
         iniFullFilePath = iniFileName;
     else
         iniFullFilePath = getAppExePath() + iniFileName;

     int res = WritePrivateProfileString(sectionName, keyName, csTemp, iniFullFilePath);
     if (res == 0)
     {
         TRACE(_T("%s:%d, WritePrivateProfileString fail:0x%x\n"), __FUNCTIONW__, __LINE__, GetLastError());
         return false;
     }
     else
     {
         return true;
     }
}

bool ClassName::iniWrite_Double(CString sectionName, CString keyName, double keyValue, CString iniFileName)
{
     CString csTemp;
     csTemp.Format(_T("%lf"), keyValue);

     CString iniFullFilePath;
     if (isFullPath(iniFileName))
         iniFullFilePath = iniFileName;
     else
         iniFullFilePath = getAppExePath() + iniFileName;

     int res = WritePrivateProfileString(sectionName, keyName, csTemp, iniFullFilePath);
     if (res == 0)
     {
         TRACE(_T("%s:%d, WritePrivateProfileString fail:0x%x\n"), __FUNCTIONW__, __LINE__, GetLastError());
         return false;
     }
     else
     {
         return true;
     }
}

CString ClassName::iniRead_String(CString sectionName, CString keyName, CString iniFileName)
{
     CString csTemp;

     CString iniFullFilePath;
     if (isFullPath(iniFileName))
         iniFullFilePath = iniFileName;
     else
         iniFullFilePath = getAppExePath() + iniFileName;

     GetPrivateProfileString(sectionName, keyName, _T(""), csTemp.GetBuffer(MAX_PATH), MAX_PATH, iniFullFilePath);
     csTemp.ReleaseBuffer();
     return csTemp;
}

int ClassName::iniRead_Int(CString sectionName, CString keyName, CString iniFileName)
{
     CString iniFullFilePath;
     if (isFullPath(iniFileName))
         iniFullFilePath = iniFileName;
     else
         iniFullFilePath = getAppExePath() + iniFileName;

     return GetPrivateProfileInt(sectionName, keyName, 0, iniFullFilePath);
}

bool ClassName::iniRead_Bool(CString sectionName, CString keyName, CString iniFileName)
{
     CString iniFullFilePath;
     if (isFullPath(iniFileName))
         iniFullFilePath = iniFileName;
     else
         iniFullFilePath = getAppExePath() + iniFileName;

     return GetPrivateProfileInt(sectionName, keyName, 0, iniFullFilePath) ? true : false;
}

double ClassName::iniRead_Double(CString sectionName, CString keyName, CString iniFileName)
{
     CString csTemp;
     csTemp.Format(_T("%lf"), 0.0);

     CString iniFullFilePath;
     if (isFullPath(iniFileName))
         iniFullFilePath = iniFileName;
     else
         iniFullFilePath = getAppExePath() + iniFileName;

     GetPrivateProfileString(sectionName, keyName, csTemp, csTemp.GetBuffer(MAX_PATH), MAX_PATH, iniFullFilePath);
     csTemp.ReleaseBuffer();
     return _ttof(csTemp);
}


[ Windows | MFC ] Split CString

void ClassName::stringSplit(CStringArray & outStringArray, CString inputString, CString seperator)
{
     int index = 0;
     int indexStart = 0;
     int seperatorLen = seperator.GetLength();

     do
     {
         index = inputString.Find(seperator, indexStart);
         if (index != -1)
         {
              // means found
              //TRACE(_T("%s:%d, index:%d\n"), __FUNCTIONW__, __LINE__, index);
              outStringArray.Add(inputString.Mid(indexStart, index - indexStart));
              indexStart = index + seperatorLen;
         }
     } while (index != -1);

     // last part
     outStringArray.Add(inputString.Mid(indexStart, inputString.GetLength()));
}


[ Windows | MFC ] convert CString to int/double

int ClassName::string2int(CString s)
{
     return _ttoi(s);
}

double ClassName::string2Double(CString s)
{
     return _ttof(s);
}

long ClassName::hexString2int(CString hexString)
{
     return _tcstol(hexString, NULL, 16);
}