SpecialFuncs.cpp
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:4k
源码类别:

模拟服务器

开发平台:

C/C++

  1. /*****************************************************************************************
  2. // 特别功能的一些基础函数
  3. // Copyright : Kingsoft 2003
  4. // Author :   Wooy(Wu yue)
  5. // CreateTime: 2003-7-26
  6. *****************************************************************************************/
  7. #include "KWin32.h"
  8. #include "KEngine.h"
  9. #include "Shlobj.h"
  10. #include <time.h>
  11. #include "../../../Engine/Src/Text.h"
  12. #include "SpecialFuncs.h"
  13. extern iRepresentShell* g_pRepresentShell;
  14. #define SCREEN_PIC_SAVE_PATH "\UserData\PrintScreen\"
  15. static char szScrPicPath[MAX_PATH] = "";
  16. //输出包含tab分格的字符串,可以是多行,返回值表示输出内容共几行
  17. //不支持字符串串中的单行字符宽度,超出限定行宽的情况
  18. //nLineWidth 的单位是屏幕像素点
  19. int OutputTabSplitText(const char* pBuffer, int nCount,
  20. int nLineWidth, int nFontId,
  21. KOutputTextParam* pParam)
  22. {
  23. if (pBuffer == NULL || nCount < 0 || g_pRepresentShell == NULL || nFontId <= 0)
  24. return 0;
  25. int nOldX = pParam->nX;
  26. int nOldY = pParam->nY;
  27. int nOutputLineCount = 0;
  28. int nCurrentPos = 0;
  29. pParam->nSkipLine = 0;
  30. int nMaxLineCount = pParam->nNumLine;
  31. pParam->nNumLine = 1;
  32. while(nCurrentPos < nCount && nOutputLineCount < nMaxLineCount)
  33. {
  34. int nLineEndPos = TFindSpecialCtrlInEncodedText(pBuffer, nCount, nCurrentPos, KTC_ENTER);
  35. int nTabPos = TFindSpecialCtrlInEncodedText(pBuffer, nCount, nCurrentPos, KTC_TAB);
  36. int nLen;
  37. //====输出tab前的部分,靠左对齐===
  38. if (nTabPos >= 0)
  39. nLen = nTabPos - nCurrentPos;
  40. else if (nLineEndPos >= 0)
  41. nLen = nLineEndPos - nCurrentPos;
  42. else
  43. nLen = nCount - nCurrentPos;
  44. g_pRepresentShell->OutputRichText(nFontId, pParam, pBuffer + nCurrentPos, nLen);
  45. //====输出tab后的部分,靠右对齐===
  46. nCurrentPos += nLen;
  47. if (nTabPos >= 0)
  48. {
  49. nCurrentPos ++;
  50. if (nLineEndPos >= 0)
  51. nLen = nLineEndPos - nCurrentPos;
  52. else
  53. nLen = nCount - nCurrentPos;
  54. if (nLen > 0)
  55. {
  56. int nOutputLen;
  57. TGetEncodedTextLineCount(pBuffer + nCurrentPos, nLen, 0, nOutputLen, nFontId);
  58. pParam->nX += nLineWidth - nOutputLen * nFontId / 2;
  59. g_pRepresentShell->OutputRichText(nFontId, pParam, pBuffer + nCurrentPos, nLen);
  60. pParam->nX = nOldX;
  61. }
  62. nCurrentPos += nLen;
  63. }
  64. pParam->nY += nFontId + 1;
  65. nOutputLineCount++;
  66. }
  67. pParam->nY = nOldY;
  68. return nOutputLineCount;
  69. }
  70. bool SetScrPicPath(const char* szPath)
  71. {
  72. if(!szPath || !szPath[0] || strlen(szPath) >= MAX_PATH)
  73. {
  74. if(!SHGetSpecialFolderPath(NULL, szScrPicPath, CSIDL_DESKTOPDIRECTORY , false))
  75. return false;
  76. strcat(szScrPicPath,"\剑侠截图\");
  77. }
  78. else
  79. {
  80. int nLen = strlen(szPath);
  81. memcpy(szScrPicPath, szPath, nLen);
  82. if (szPath[nLen - 1] == '\')
  83. szScrPicPath[nLen] = 0;
  84. else
  85. {
  86. szScrPicPath[nLen] = '\';
  87. szScrPicPath[nLen + 1] = 0;
  88. }
  89. }
  90. return true;
  91. }
  92. //根据时间构造截屏文件名
  93. bool GetAPrintScreenFileName(char *buf, int nBufLen)
  94. {
  95. if(nBufLen < 128)
  96. return false;
  97. time_t ltime;
  98.     struct tm *today;
  99. time( &ltime );
  100. today = localtime( &ltime );
  101. strftime( buf, 128, "%Y-%m-%d_%H-%M-%S", today );
  102. return true;
  103. }
  104. void SaveScreenToFile(ScreenFileType eType, unsigned int nQuality)
  105. {
  106. if(!szScrPicPath[0] && !SetScrPicPath(NULL))
  107. return;
  108. // 字符串长度不能小于128
  109. char szFile[256];
  110. int nLen;
  111. nLen = sprintf(szFile, "%s", szScrPicPath);
  112. if(GetAPrintScreenFileName(&szFile[nLen], sizeof(szFile) - nLen))
  113. {
  114. g_CreatePath(szScrPicPath);
  115. if(eType == SCRFILETYPE_BMP)
  116. strcat(szFile, ".bmp");
  117. else
  118. strcat(szFile, ".jpg");
  119. g_pRepresentShell->SaveScreenToFile(szFile, eType, nQuality);
  120. }
  121. }