XTPVC50Helpers.h
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:22k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // XTPVC50Helpers.h : Visual C++ 5.0 helpers
  2. //
  3. // This file is a part of the XTREME TOOLKIT PRO MFC class library.
  4. // (c)1998-2008 Codejock Software, All Rights Reserved.
  5. //
  6. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  7. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  8. // CONSENT OF CODEJOCK SOFTWARE.
  9. //
  10. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  11. // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  12. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  13. // SINGLE COMPUTER.
  14. //
  15. // CONTACT INFORMATION:
  16. // support@codejock.com
  17. // http://www.codejock.com
  18. //
  19. /////////////////////////////////////////////////////////////////////////////
  20. //{{AFX_CODEJOCK_PRIVATE
  21. #if !defined(__XTPVC50HELPERS_H__)
  22. #define __XTPVC50HELPERS_H__
  23. #if (_MSC_VER >= 1000)
  24. #pragma once
  25. #endif // _MSC_VER >= 1000
  26. class CXTPPushRoutingFrame
  27. {
  28. protected:
  29. CFrameWnd* pOldRoutingFrame;
  30. _AFX_THREAD_STATE* pThreadState;
  31. public:
  32. CXTPPushRoutingFrame(CFrameWnd* pNewRoutingFrame)
  33. {
  34. pThreadState = AfxGetThreadState();
  35. pOldRoutingFrame = pThreadState->m_pRoutingFrame;
  36. pThreadState->m_pRoutingFrame = pNewRoutingFrame;
  37. }
  38. ~CXTPPushRoutingFrame()
  39. {
  40. pThreadState->m_pRoutingFrame = pOldRoutingFrame;
  41. }
  42. };
  43. #if (_MSC_VER <= 1100)
  44. class CXTPStringHelper
  45. {
  46. class CXTPString : public CString {
  47. friend class CXTPStringHelper;
  48. };
  49. public:
  50. static int Remove(CString& strRemove, TCHAR chRemove)
  51. {
  52. CXTPString& str = (CXTPString&) strRemove;
  53. str.CopyBeforeWrite();
  54. LPTSTR pstrSource = str.m_pchData;
  55. LPTSTR pstrDest = str.m_pchData;
  56. LPTSTR pstrEnd = str.m_pchData + str.GetData()->nDataLength;
  57. while (pstrSource < pstrEnd)
  58. {
  59. if (*pstrSource != chRemove)
  60. {
  61. *pstrDest = *pstrSource;
  62. pstrDest = _tcsinc(pstrDest);
  63. }
  64. pstrSource = _tcsinc(pstrSource);
  65. }
  66. *pstrDest = '';
  67. int nCount = pstrSource - pstrDest;
  68. str.GetData()->nDataLength -= nCount;
  69. return nCount;
  70. }
  71. static int Find(const CString& strFind, LPCTSTR lpszSub, int nStart)
  72. {
  73. CXTPString& str = (CXTPString&) strFind;
  74. ASSERT(AfxIsValidString(lpszSub));
  75. int nLength = str.GetData()->nDataLength;
  76. if (nStart > nLength)
  77. return -1;
  78. // find first matching substring
  79. LPTSTR lpsz = _tcsstr(str.m_pchData + nStart, lpszSub);
  80. // return -1 for not found, distance from beginning otherwise
  81. return (lpsz == NULL) ? -1 : (int)(lpsz - str.m_pchData);
  82. }
  83. static int Find(const CString& strFind, TCHAR ch, int nStart)
  84. {
  85. CXTPString& str = (CXTPString&) strFind;
  86. int nLength = str.GetData()->nDataLength;
  87. if (nStart >= nLength)
  88. return -1;
  89. // find first single character
  90. LPTSTR lpsz = _tcschr(str.m_pchData + nStart, (_TUCHAR)ch);
  91. // return -1 if not found and index otherwise
  92. return (lpsz == NULL) ? -1 : (int)(lpsz - str.m_pchData);
  93. }
  94. static int Replace(CString& strReplace, TCHAR chOld, TCHAR chNew)
  95. {
  96. CXTPString& str = (CXTPString&) strReplace;
  97. int nCount = 0;
  98. // short-circuit the nop case
  99. if (chOld != chNew)
  100. {
  101. // otherwise modify each character that matches in the string
  102. str.CopyBeforeWrite();
  103. LPTSTR psz = str.m_pchData;
  104. LPTSTR pszEnd = psz + str.GetData()->nDataLength;
  105. while (psz < pszEnd)
  106. {
  107. // replace instances of the specified character only
  108. if (*psz == chOld)
  109. {
  110. *psz = chNew;
  111. nCount++;
  112. }
  113. psz = _tcsinc(psz);
  114. }
  115. }
  116. return nCount;
  117. }
  118. static int Replace(CString& strReplace, LPCTSTR lpszOld, LPCTSTR lpszNew)
  119. {
  120. CXTPString& str = (CXTPString&) strReplace;
  121. // can't have empty or NULL lpszOld
  122. int nSourceLen = str.SafeStrlen(lpszOld);
  123. if (nSourceLen == 0)
  124. return 0;
  125. int nReplacementLen = str.SafeStrlen(lpszNew);
  126. // loop once to figure out the size of the result string
  127. int nCount = 0;
  128. LPTSTR lpszStart = str.m_pchData;
  129. LPTSTR lpszEnd = str.m_pchData + str.GetData()->nDataLength;
  130. LPTSTR lpszTarget;
  131. while (lpszStart < lpszEnd)
  132. {
  133. while ((lpszTarget = _tcsstr(lpszStart, lpszOld)) != NULL)
  134. {
  135. nCount++;
  136. lpszStart = lpszTarget + nSourceLen;
  137. }
  138. lpszStart += lstrlen(lpszStart) + 1;
  139. }
  140. // if any changes were made, make them
  141. if (nCount > 0)
  142. {
  143. str.CopyBeforeWrite();
  144. // if the buffer is too small, just
  145. //   allocate a new buffer (slow but sure)
  146. int nOldLength = str.GetData()->nDataLength;
  147. int nNewLength =  nOldLength + (nReplacementLen-nSourceLen)*nCount;
  148. if (str.GetData()->nAllocLength < nNewLength || str.GetData()->nRefs > 1)
  149. {
  150. CStringData* pOldData = str.GetData();
  151. LPTSTR pstr = str.m_pchData;
  152. str.AllocBuffer(nNewLength);
  153. memcpy(str.m_pchData, pstr, pOldData->nDataLength*sizeof(TCHAR));
  154. CXTPString::Release(pOldData);
  155. }
  156. // else, we just do it in-place
  157. lpszStart = str.m_pchData;
  158. lpszEnd = str.m_pchData + str.GetData()->nDataLength;
  159. // loop again to actually do the work
  160. while (lpszStart < lpszEnd)
  161. {
  162. while ((lpszTarget = _tcsstr(lpszStart, lpszOld)) != NULL)
  163. {
  164. int nBalance = nOldLength - (lpszTarget - str.m_pchData + nSourceLen);
  165. memmove(lpszTarget + nReplacementLen, lpszTarget + nSourceLen,
  166. nBalance * sizeof(TCHAR));
  167. memcpy(lpszTarget, lpszNew, nReplacementLen*sizeof(TCHAR));
  168. lpszStart = lpszTarget + nReplacementLen;
  169. lpszStart[nBalance] = '';
  170. nOldLength += (nReplacementLen - nSourceLen);
  171. }
  172. lpszStart += lstrlen(lpszStart) + 1;
  173. }
  174. ASSERT(str.m_pchData[nNewLength] == '');
  175. str.GetData()->nDataLength = nNewLength;
  176. }
  177. return nCount;
  178. }
  179. static int Delete(CString& strSource, int nIndex, int nCount)
  180. {
  181. CXTPString& str = (CXTPString&) strSource;
  182. if (nIndex < 0)
  183. nIndex = 0;
  184. int nNewLength = str.GetData()->nDataLength;
  185. if (nCount > 0 && nIndex < nNewLength)
  186. {
  187. str.CopyBeforeWrite();
  188. int nBytesToCopy = nNewLength - (nIndex + nCount) + 1;
  189. memcpy(str.m_pchData + nIndex,
  190. str.m_pchData + nIndex + nCount, nBytesToCopy * sizeof(TCHAR));
  191. str.GetData()->nDataLength = nNewLength - nCount;
  192. }
  193. return nNewLength;
  194. }
  195. static int Insert(CString& strSource, int nIndex, LPCTSTR pstr)
  196. {
  197. if (nIndex < 0)
  198. nIndex = 0;
  199. CXTPString& str = (CXTPString&) strSource;
  200. int nInsertLength = str.SafeStrlen(pstr);
  201. int nNewLength = str.GetData()->nDataLength;
  202. if (nInsertLength > 0)
  203. {
  204. str.CopyBeforeWrite();
  205. if (nIndex > nNewLength)
  206. nIndex = nNewLength;
  207. nNewLength += nInsertLength;
  208. if (str.GetData()->nAllocLength < nNewLength)
  209. {
  210. CStringData* pOldData = str.GetData();
  211. LPTSTR pstr = str.m_pchData;
  212. str.AllocBuffer(nNewLength);
  213. memcpy(str.m_pchData, pstr, (pOldData->nDataLength+1)*sizeof(TCHAR));
  214. CXTPString::Release(pOldData);
  215. }
  216. // move existing bytes down
  217. memmove(str.m_pchData + nIndex + nInsertLength,
  218. str.m_pchData + nIndex,
  219. (nNewLength-nIndex-nInsertLength+1)*sizeof(TCHAR));
  220. memmove(str.m_pchData + nIndex,
  221. pstr, nInsertLength*sizeof(TCHAR));
  222. str.GetData()->nDataLength = nNewLength;
  223. }
  224. return nNewLength;
  225. }
  226. static void TrimRight(CString& strSource, LPCTSTR lpszTargetList)
  227. {
  228. // find beginning of trailing matches
  229. // by starting at beginning (DBCS aware)
  230. CXTPString& str = (CXTPString&) strSource;
  231. str.CopyBeforeWrite();
  232. LPTSTR lpsz = str.m_pchData;
  233. LPTSTR lpszLast = NULL;
  234. while (*lpsz != '')
  235. {
  236. if (_tcschr(lpszTargetList, *lpsz) != NULL)
  237. {
  238. if (lpszLast == NULL)
  239. lpszLast = lpsz;
  240. }
  241. else
  242. lpszLast = NULL;
  243. lpsz = _tcsinc(lpsz);
  244. }
  245. if (lpszLast != NULL)
  246. {
  247. // truncate at left-most matching character
  248. *lpszLast = '';
  249. str.GetData()->nDataLength = lpszLast - str.m_pchData;
  250. }
  251. }
  252. static void TrimLeft(CString& strSource, LPCTSTR lpszTargets)
  253. {
  254. CXTPString& str = (CXTPString&) strSource;
  255. // if we're not trimming anything, we're not doing any work
  256. if (!lpszTargets || lpszTargets[0] == 0)
  257. return;
  258. str.CopyBeforeWrite();
  259. LPCTSTR lpsz = str.m_pchData;
  260. while (*lpsz != '')
  261. {
  262. if (_tcschr(lpszTargets, *lpsz) == NULL)
  263. break;
  264. lpsz = _tcsinc(lpsz);
  265. }
  266. if (lpsz != str.m_pchData)
  267. {
  268. // fix up data and length
  269. int nDataLength = str.GetData()->nDataLength - (lpsz - str.m_pchData);
  270. memmove(str.m_pchData, lpsz, (nDataLength+1)*sizeof(TCHAR));
  271. str.GetData()->nDataLength = nDataLength;
  272. }
  273. }
  274. };
  275. #endif
  276. #define XTP_VC50_HALF_SECOND (1.0/172800.0)
  277. #include <math.h>
  278. class CXTPDateTimeHelper
  279. {
  280. public:
  281. #if (_MSC_VER <= 1200) // Using Visual C++ 5.0, 6.0
  282. static BOOL TmFromOleDate(DATE dtSrc, struct tm& tmDest)
  283. {
  284. const DATE MIN_DATE =               (-657434L);  // about year 100
  285. const DATE MAX_DATE =               2958465L;    // about year 9999
  286. static int nMonthDays[13] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365};
  287. // The legal range does not actually span year 0 to 9999.
  288. if (dtSrc > MAX_DATE || dtSrc < MIN_DATE) // about year 100 to about 9999
  289. return FALSE;
  290. long nDays;             // Number of days since Dec. 30, 1899
  291. long nDaysAbsolute;     // Number of days since 1/1/0
  292. long nSecsInDay;        // Time in seconds since midnight
  293. long nMinutesInDay;     // Minutes in day
  294. long n400Years;         // Number of 400 year increments since 1/1/0
  295. long n400Century;       // Century within 400 year block (0, 1, 2 or 3)
  296. long n4Years;           // Number of 4 year increments since 1/1/0
  297. long n4Day;             // Day within 4 year block
  298. //  (0 is 1/1/yr1, 1460 is 12/31/yr4)
  299. long n4Yr;              // Year within 4 year block (0, 1, 2 or 3)
  300. BOOL bLeap4 = TRUE;     // TRUE if 4 year block includes leap year
  301. double dblDate = dtSrc; // temporary serial date
  302. // If a valid date, then this conversion should not overflow
  303. nDays = (long)dblDate;
  304. // Round to the second
  305. dblDate += ((dtSrc > 0.0) ? XTP_VC50_HALF_SECOND : -XTP_VC50_HALF_SECOND);
  306. nDaysAbsolute = (long)dblDate + 693959L; // Add days from 1/1/0 to 12/30/1899
  307. dblDate = fabs(dblDate);
  308. nSecsInDay = (long)((dblDate - floor(dblDate)) * 86400.);
  309. // Calculate the day of week (sun = 1, mon = 2...)
  310. // -1 because 1/1/0 is Sat. +1 because we want 1-based
  311. tmDest.tm_wday = (int)((nDaysAbsolute - 1) % 7L) + 1;
  312. // Leap years every 4 yrs except centuries not multiples of 400.
  313. n400Years = (long)(nDaysAbsolute / 146097L);
  314. // Set nDaysAbsolute to day within 400-year block
  315. nDaysAbsolute %= 146097L;
  316. // -1 because first century has extra day
  317. n400Century = (long)((nDaysAbsolute - 1) / 36524L);
  318. // Non-leap century
  319. if (n400Century != 0)
  320. {
  321. // Set nDaysAbsolute to day within century
  322. nDaysAbsolute = (nDaysAbsolute - 1) % 36524L;
  323. // +1 because 1st 4 year increment has 1460 days
  324. n4Years = (long)((nDaysAbsolute + 1) / 1461L);
  325. if (n4Years != 0)
  326. n4Day = (long)((nDaysAbsolute + 1) % 1461L);
  327. else
  328. {
  329. bLeap4 = FALSE;
  330. n4Day = (long)nDaysAbsolute;
  331. }
  332. }
  333. else
  334. {
  335. // Leap century - not special case!
  336. n4Years = (long)(nDaysAbsolute / 1461L);
  337. n4Day = (long)(nDaysAbsolute % 1461L);
  338. }
  339. if (bLeap4)
  340. {
  341. // -1 because first year has 366 days
  342. n4Yr = (n4Day - 1) / 365;
  343. if (n4Yr != 0)
  344. n4Day = (n4Day - 1) % 365;
  345. }
  346. else
  347. {
  348. n4Yr = n4Day / 365;
  349. n4Day %= 365;
  350. }
  351. // n4Day is now 0-based day of year. Save 1-based day of year, year number
  352. tmDest.tm_yday = (int)n4Day + 1;
  353. tmDest.tm_year = n400Years * 400 + n400Century * 100 + n4Years * 4 + n4Yr;
  354. // Handle leap year: before, on, and after Feb. 29.
  355. if (n4Yr == 0 && bLeap4)
  356. {
  357. // Leap Year
  358. if (n4Day == 59)
  359. {
  360. /* Feb. 29 */
  361. tmDest.tm_mon = 2;
  362. tmDest.tm_mday = 29;
  363. goto DoTime;
  364. }
  365. // Pretend it's not a leap year for month/day comp.
  366. if (n4Day >= 60)
  367. --n4Day;
  368. }
  369. // Make n4DaY a 1-based day of non-leap year and compute
  370. //  month/day for everything but Feb. 29.
  371. ++n4Day;
  372. // Month number always >= n/32, so save some loop time */
  373. for (tmDest.tm_mon = (n4Day >> 5) + 1;
  374. n4Day > nMonthDays[tmDest.tm_mon]; tmDest.tm_mon++);
  375. tmDest.tm_mday = (int)(n4Day - nMonthDays[tmDest.tm_mon-1]);
  376. DoTime:
  377. if (nSecsInDay == 0)
  378. tmDest.tm_hour = tmDest.tm_min = tmDest.tm_sec = 0;
  379. else
  380. {
  381. tmDest.tm_sec = (int)nSecsInDay % 60L;
  382. nMinutesInDay = nSecsInDay / 60L;
  383. tmDest.tm_min = (int)nMinutesInDay % 60;
  384. tmDest.tm_hour = (int)nMinutesInDay / 60;
  385. }
  386. return TRUE;
  387. }
  388. static BOOL GetAsSystemTime(const COleDateTime& dtTime, SYSTEMTIME& sysTime)
  389. {
  390. if (dtTime.GetStatus() != COleDateTime::valid)
  391. return FALSE;
  392. struct tm tmTemp;
  393. if (!TmFromOleDate(dtTime, tmTemp))
  394. return FALSE;
  395. sysTime.wYear = (WORD)tmTemp.tm_year;
  396. sysTime.wMonth = (WORD)tmTemp.tm_mon;
  397. sysTime.wDayOfWeek = (WORD)(tmTemp.tm_wday - 1);
  398. sysTime.wDay = (WORD)tmTemp.tm_mday;
  399. sysTime.wHour = (WORD)tmTemp.tm_hour;
  400. sysTime.wMinute = (WORD)tmTemp.tm_min;
  401. sysTime.wSecond = (WORD)tmTemp.tm_sec;
  402. sysTime.wMilliseconds = 0;
  403. return TRUE;
  404. };
  405. AFX_INLINE static LONG GetTotalDays(const COleDateTimeSpan& spSpan)
  406. {
  407. double dSpan = _RoundTime(spSpan);
  408. return  LONG(dSpan);
  409. };
  410. AFX_INLINE static LONG GetTotalHours(const COleDateTimeSpan& spSpan)
  411. {
  412. double dSpan = _RoundTime(spSpan);
  413. LONG nHours = LONG(dSpan * 24);
  414. return nHours;
  415. };
  416. static BOOL AFX_CDECL GetDateTimeCtrlTime(HWND hWnd, COleDateTime& timeDest)
  417. {
  418. SYSTEMTIME sysTime;
  419. BOOL bRetVal = TRUE;
  420. LRESULT result = ::SendMessage(hWnd, DTM_GETSYSTEMTIME, 0, (LPARAM) &sysTime);
  421. if (result == GDT_VALID)
  422. {
  423. timeDest = COleDateTime(sysTime);
  424. bRetVal = TRUE;
  425. ASSERT(timeDest.GetStatus() == COleDateTime::valid);
  426. }
  427. else if (result == GDT_NONE)
  428. {
  429. timeDest.SetStatus(COleDateTime::null);
  430. bRetVal = TRUE;
  431. }
  432. else
  433. timeDest.SetStatus(COleDateTime::invalid);
  434. return bRetVal;
  435. }
  436. static BOOL AFX_CDECL SetDateTimeCtrlTime(HWND hWnd, const COleDateTime& timeNew)
  437. {
  438. BOOL bRetVal = FALSE;
  439. // make sure the time isn't invalid
  440. ASSERT(timeNew.GetStatus() != COleDateTime::invalid);
  441. ASSERT(::IsWindow(hWnd));
  442. SYSTEMTIME sysTime;
  443. WPARAM wParam = GDT_NONE;
  444. if (timeNew.GetStatus() == COleDateTime::valid &&
  445. GetAsSystemTime(timeNew, sysTime))
  446. {
  447. wParam = GDT_VALID;
  448. }
  449. bRetVal = (BOOL) ::SendMessage(hWnd,
  450. DTM_SETSYSTEMTIME, wParam, (LPARAM) &sysTime);
  451. return bRetVal;
  452. }
  453. #endif
  454. AFX_INLINE static LONG GetTotalMinutes(const COleDateTimeSpan& spSpan)
  455. {
  456. double dSpan = _RoundTime(spSpan);
  457. double dMinutes = dSpan * 24 * 60;
  458. LONG nMinutes = _DoubleToLONG(dMinutes);
  459. return nMinutes;
  460. };
  461. AFX_INLINE static LONG GetTotalSeconds(const COleDateTimeSpan& spSpan)
  462. {
  463. double dSpan = _RoundTime(spSpan);
  464. double dSeconds= dSpan * 24 * 60 * 60;
  465. LONG nSeconds = _DoubleToLONG(dSeconds);
  466. return nSeconds;
  467. };
  468. protected:
  469. AFX_INLINE static double _RoundTime(double dTime)
  470. {
  471. dTime += dTime < 0 ? -XTP_VC50_HALF_SECOND : XTP_VC50_HALF_SECOND;
  472. return dTime;
  473. };
  474. AFX_INLINE static LONG _DoubleToLONG(double dValue)
  475. {
  476. return LONG(dValue > 0 ? min(dValue, double(LONG_MAX)) : max(dValue, double(LONG_MIN)) );
  477. };
  478. };
  479. AFX_INLINE CString CONSTRUCT_S(LPCSTR lpsz, int nLength) {
  480. #if (_MSC_VER <= 1100) && defined(_UNICODE) // Using Visual C++ 5.0
  481. CString str;
  482. if (nLength != 0)
  483. {
  484. LPTSTR lpzsData = str.GetBuffer(nLength);
  485. int n = ::MultiByteToWideChar(CP_ACP, 0, lpsz, nLength, lpzsData, nLength + 1);
  486. str.ReleaseBuffer(n >= 0 ? n : -1);
  487. }
  488. return str;
  489. #else
  490. return CString(lpsz, nLength);
  491. #endif
  492. }
  493. AFX_INLINE CString CONSTRUCT_S(LPCWSTR lpsz, int nLength) {
  494. #if (_MSC_VER <= 1100) && !defined(_UNICODE) // Using Visual C++ 5.0
  495. CString str;
  496. if (nLength != 0)
  497. {
  498. LPTSTR lpzsData = str.GetBuffer(nLength*2);
  499. int n = ::WideCharToMultiByte(CP_ACP, 0, lpsz, nLength, lpzsData,
  500. (nLength*2)+1, NULL, NULL);
  501. str.ReleaseBuffer(n >= 0 ? n : -1);
  502. }
  503. return str;
  504. #else
  505. return CString(lpsz, nLength);
  506. #endif
  507. }
  508. AFX_INLINE int REPLACE_S(CString& str, LPCTSTR lpszOld, LPCTSTR lpszNew) {
  509. #if (_MSC_VER <= 1100) // Using Visual C++ 5.0
  510. return CXTPStringHelper::Replace(str, lpszOld, lpszNew);
  511. #else
  512. return str.Replace(lpszOld, lpszNew);
  513. #endif
  514. }
  515. AFX_INLINE int REPLACE_S(CString& str, TCHAR chOld, TCHAR chNew) {
  516. #if (_MSC_VER <= 1100) // Using Visual C++ 5.0
  517. return CXTPStringHelper::Replace(str, chOld, chNew);
  518. #else
  519. return str.Replace(chOld, chNew);
  520. #endif
  521. }
  522. AFX_INLINE int FIND_S(const CString& str, LPCTSTR lpszSub, int nStart) {
  523. #if (_MSC_VER <= 1100) // Using Visual C++ 5.0
  524. return CXTPStringHelper::Find(str, lpszSub, nStart);
  525. #else
  526. return str.Find(lpszSub, nStart);
  527. #endif
  528. }
  529. AFX_INLINE int FIND_S(const CString& str, TCHAR ch, int nStart) {
  530. #if (_MSC_VER <= 1100) // Using Visual C++ 5.0
  531. return CXTPStringHelper::Find(str, ch, nStart);
  532. #else
  533. return str.Find(ch, nStart);
  534. #endif
  535. }
  536. AFX_INLINE int REMOVE_S(CString& str, TCHAR chRemove) {
  537. #if (_MSC_VER <= 1100) // Using Visual C++ 5.0
  538. return CXTPStringHelper::Remove(str, chRemove);
  539. #else
  540. return str.Remove(chRemove);
  541. #endif
  542. }
  543. AFX_INLINE int INSERT_S(CString& str, int nIndex, LPCTSTR pstr) {
  544. #if (_MSC_VER <= 1100) // Using Visual C++ 5.0
  545. return CXTPStringHelper::Insert(str, nIndex, pstr);
  546. #else
  547. return str.Insert(nIndex, pstr);
  548. #endif
  549. }
  550. AFX_INLINE int DELETE_S(CString& str, int nIndex, int nCount = 1) {
  551. #if (_MSC_VER <= 1100) // Using Visual C++ 5.0
  552. return CXTPStringHelper::Delete(str, nIndex, nCount);
  553. #else
  554. return str.Delete(nIndex, nCount);
  555. #endif
  556. }
  557. AFX_INLINE void TRIMRIGHT_S(CString& str, LPCTSTR lpszTargetList) {
  558. #if (_MSC_VER <= 1100) // Using Visual C++ 5.0
  559. CXTPStringHelper::TrimRight(str, lpszTargetList);
  560. #else
  561. str.TrimRight(lpszTargetList);
  562. #endif
  563. }
  564. AFX_INLINE void TRIMLEFT_S(CString& str, LPCTSTR lpszTargetList) {
  565. #if (_MSC_VER <= 1100) // Using Visual C++ 5.0
  566. CXTPStringHelper::TrimLeft(str, lpszTargetList);
  567. #else
  568. str.TrimLeft(lpszTargetList);
  569. #endif
  570. }
  571. AFX_INLINE BOOL GETASSYSTEMTIME_DT(const COleDateTime& dtTime, SYSTEMTIME& sysTime) {
  572. #if (_MSC_VER <= 1100) // Using Visual C++ 5.0
  573. return CXTPDateTimeHelper::GetAsSystemTime(dtTime, sysTime);
  574. #else
  575. ::ZeroMemory(&sysTime, sizeof(sysTime));
  576. return dtTime.GetAsSystemTime(sysTime);
  577. #endif
  578. }
  579. AFX_INLINE LONG GETTOTAL_DAYS_DTS(const COleDateTimeSpan& spSpan) {
  580. #if (_MSC_VER <= 1200) // Using Visual C++ 5.0, 6.0
  581. return CXTPDateTimeHelper::GetTotalDays(spSpan);
  582. #else
  583. return (LONG)spSpan.GetTotalDays();
  584. #endif
  585. }
  586. AFX_INLINE LONG GETTOTAL_HOURS_DTS(const COleDateTimeSpan& spSpan) {
  587. #if (_MSC_VER <= 1200) // Using Visual C++ 5.0, 6.0
  588. return CXTPDateTimeHelper::GetTotalHours(spSpan);
  589. #else
  590. return (LONG)spSpan.GetTotalHours();
  591. #endif
  592. }
  593. AFX_INLINE HRESULT VARCMP_S(LPVARIANT pvarLeft, LPVARIANT pvarRight, LCID lcid, ULONG dwFlags)
  594. {
  595. #if (_MSC_VER <= 1100) // Using Visual C++ 5.0
  596. HINSTANCE hModule = GetModuleHandle(_T("OLEAUT32.DLL"));
  597. if (!hModule)
  598. return E_FAIL;
  599. typedef HRESULT (STDAPICALLTYPE * PFNVARCMP)(LPVARIANT pvarLeft, LPVARIANT pvarRight, LCID lcid, ULONG dwFlags);
  600. PFNVARCMP pfnVarCmp = (PFNVARCMP)GetProcAddress(hModule, "VarCmp");
  601. if (!pfnVarCmp)
  602. return E_FAIL;
  603. return (*pfnVarCmp)(pvarLeft, pvarRight, lcid, dwFlags);
  604. #else
  605. return VarCmp(pvarLeft, pvarRight, lcid, dwFlags);
  606. #endif
  607. }
  608. AFX_INLINE LONG GETTOTAL_MINUTES_DTS(const COleDateTimeSpan& spSpan) {
  609. return CXTPDateTimeHelper::GetTotalMinutes(spSpan);
  610. }
  611. AFX_INLINE LONG GETTOTAL_SECONDS_DTS(const COleDateTimeSpan& spSpan) {
  612. return CXTPDateTimeHelper::GetTotalSeconds(spSpan);
  613. }
  614. #if (_MSC_VER <= 1100)
  615. AFX_INLINE LONG AFXAPI AfxDelRegTreeHelper(HKEY hParentKey, const CString& strKeyName)
  616. {
  617. TCHAR   szSubKeyName[256];
  618. HKEY    hCurrentKey;
  619. DWORD   dwResult;
  620. if ((dwResult = RegOpenKey(hParentKey, strKeyName, &hCurrentKey)) ==
  621. ERROR_SUCCESS)
  622. {
  623. // Remove all subkeys of the key to delete
  624. while ((dwResult = RegEnumKey(hCurrentKey, 0, szSubKeyName, 255)) ==
  625. ERROR_SUCCESS)
  626. {
  627. if ((dwResult = AfxDelRegTreeHelper(hCurrentKey, szSubKeyName)) != ERROR_SUCCESS)
  628. break;
  629. }
  630. // If all went well, we should now be able to delete the requested key
  631. if ((dwResult == ERROR_NO_MORE_ITEMS) || (dwResult == ERROR_BADKEY))
  632. {
  633. dwResult = RegDeleteKey(hParentKey, strKeyName);
  634. }
  635. }
  636. RegCloseKey(hCurrentKey);
  637. return dwResult;
  638. }
  639. #endif
  640. AFX_INLINE BOOL IMAGELISTDRAWINDIRECT_S(CImageList* pImageList, CDC* pDC, int nImage, POINT pt,
  641. SIZE sz, POINT ptOrigin = CPoint(0, 0), UINT fStyle = ILD_NORMAL,
  642. DWORD dwRop  = SRCCOPY, COLORREF rgbBack = CLR_DEFAULT,
  643. COLORREF rgbFore = CLR_DEFAULT)
  644. {
  645. #if (_MSC_VER <= 1100)
  646. ASSERT_POINTER(pDC, CDC);
  647. ASSERT(pDC->m_hDC != NULL);
  648. IMAGELISTDRAWPARAMS drawing;
  649. drawing.cbSize = sizeof(IMAGELISTDRAWPARAMS);
  650. drawing.himl = pImageList->m_hImageList;
  651. drawing.i = nImage;
  652. drawing.hdcDst = pDC->GetSafeHdc();
  653. drawing.x = pt.x;
  654. drawing.y = pt.y;
  655. drawing.cx = sz.cx;
  656. drawing.cy = sz.cy;
  657. drawing.xBitmap = ptOrigin.x;
  658. drawing.yBitmap = ptOrigin.y;
  659. drawing.rgbBk = rgbBack;
  660. drawing.rgbFg = rgbFore;
  661. drawing.fStyle = fStyle;
  662. drawing.dwRop = dwRop;
  663. return ImageList_DrawIndirect(&drawing);
  664. #else
  665. return pImageList->DrawIndirect(pDC, nImage, pt, sz, ptOrigin, fStyle, dwRop, rgbBack, rgbFore);
  666. #endif
  667. }
  668. //}}AFX_CODEJOCK_PRIVATE
  669. //////////////////////////////////////////////////////////////////////
  670. #endif // #if !defined(__XTPVC50HELPERS_H__)