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

模拟服务器

开发平台:

C/C++

  1. /*****************************************************************************************
  2. // 鼠标指针窗口
  3. // Copyright : Kingsoft 2002
  4. // Author :   Wooy(Wu yue)
  5. // CreateTime: 2002-8-17
  6. *****************************************************************************************/
  7. #include "KWin32.h"
  8. #include "KFile.h"
  9. #include "KPakFile.h"
  10. #include "UiCursor.h"
  11. #include "string.h"
  12. #include "../../../Represent/iRepresent/iRepresentShell.h"
  13. #include "../../../Represent/iRepresent/iRepresentShell.h"
  14. extern iRepresentShell* g_pRepresentShell;
  15. //--------------------------------------------------------------------------
  16. // 功能:构造函数
  17. //--------------------------------------------------------------------------
  18. KUiCursor::KUiCursor()
  19. {
  20. m_bShow = true;
  21. m_nCurImage  = 0;
  22.     m_nPositionH = 0;
  23. m_nPositionV = 0;
  24.     #ifdef  KUI_USE_HARDWARE_MOUSE
  25. {
  26. for (int i = 0; i < MAX_CURSOR_IMAGE; i++)
  27.     m_CursorImages[i] = NULL;
  28. }
  29. #else   // KUI_USE_HARDWARE_MOUSE
  30. {
  31. m_nHotspotH = 0;
  32. m_nHotspotV = 0;
  33. for (int i = 0; i < MAX_CURSOR_IMAGE; i++)
  34. {
  35. IR_InitUiImageRef(m_CursorImages[i]);
  36. m_CursorImages[i].nType = ISI_T_SPR;
  37. }
  38.     SetCursor(NULL);
  39. }
  40. #endif
  41. }
  42. //清空全部资源
  43. void KUiCursor::Cleanup()
  44. {
  45.     #ifdef  KUI_USE_HARDWARE_MOUSE
  46. {
  47. ::SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW)));
  48. for (int i = 0; i < MAX_CURSOR_IMAGE; i++)
  49. m_CursorImages[i] = NULL;
  50. }
  51.     #else
  52. {
  53. if (g_pRepresentShell)
  54. {
  55. for (int i = 0; i < MAX_CURSOR_IMAGE; i++)
  56. {
  57. if (m_CursorImages[i].uImage)
  58. {
  59. g_pRepresentShell->FreeImage(m_CursorImages[i].szImage);
  60. m_CursorImages[i].uImage = 0;
  61. m_CursorImages[i].szImage[0] = 0;
  62. }
  63. }
  64. }
  65. }
  66. #endif
  67. }
  68. //--------------------------------------------------------------------------
  69. // 功能:析构函数
  70. //--------------------------------------------------------------------------
  71. KUiCursor::~KUiCursor()
  72. {
  73. Cleanup();
  74. }
  75. //--------------------------------------------------------------------------
  76. // 功能:设置鼠标指针位置
  77. //--------------------------------------------------------------------------
  78. void KUiCursor::SetPosition(int h, int v)
  79. {
  80. m_nPositionH = h;
  81. m_nPositionV = v;
  82. }
  83. //--------------------------------------------------------------------------
  84. // 功能:获取鼠标指针位置
  85. //--------------------------------------------------------------------------
  86. void KUiCursor::GetPosition(int& h, int& v)
  87. {
  88. h = m_nPositionH;
  89. v = m_nPositionV;
  90. }
  91. //--------------------------------------------------------------------------
  92. // 功能:载入鼠标指针图形
  93. //--------------------------------------------------------------------------
  94. // Engine KPakFile
  95. // Add by Freeway Chen in 2003.7.2
  96. int KUiLoadCursor(const char* pszImgFile, HCURSOR &rhRetCursor)
  97. {
  98.     int nResult = false;
  99.     int nRetCode = false;
  100.     char szTempPath[MAX_PATH] = "";
  101.     char szTempFileName[MAX_PATH] = "";
  102.     unsigned char TempBuffer[4096];
  103.     int nProcessSize = 0;
  104.     KPakFile    SrcCursorFile;
  105.     int         nSrcCursorFileOpenFlag = false;
  106.     int         nSrcFileSize = 0;
  107.     
  108.     KFile       DstCursorFile;
  109.     int         nDstCursorFileOpenFlag = false;
  110.     rhRetCursor = NULL;
  111.     if (!pszImgFile)
  112.         goto Exit0;
  113.     nRetCode = GetTempPath(MAX_PATH, szTempPath);
  114.     if (0 == nRetCode)
  115.         goto Exit0;
  116.     
  117.     nRetCode = GetTempFileName(szTempPath, "KSG_", 0, szTempFileName);
  118.     if (0 == nRetCode)
  119.         goto Exit0;
  120.     nRetCode = DstCursorFile.Create(szTempFileName);
  121.     if (!nRetCode)
  122.         goto Exit0;
  123.     nDstCursorFileOpenFlag = true;
  124.     nRetCode = SrcCursorFile.Open((char *)pszImgFile);
  125.     if (!nRetCode)
  126.         goto Exit0;
  127.     nSrcCursorFileOpenFlag = true;
  128.     nSrcFileSize = SrcCursorFile.Size();
  129.     while (nSrcFileSize > 0)
  130.     {
  131.         nProcessSize = SrcCursorFile.Read(TempBuffer, 4096);
  132.         if (nProcessSize == 0)
  133.             break;
  134.         DstCursorFile.Write(TempBuffer, nProcessSize);
  135.         nSrcFileSize -= nProcessSize;
  136.     }
  137.     if (nSrcCursorFileOpenFlag)
  138.     {
  139.         SrcCursorFile.Close();
  140.         nSrcCursorFileOpenFlag = false;
  141.     }
  142.     if (nDstCursorFileOpenFlag)
  143.     {
  144.         DstCursorFile.Close();
  145.         nDstCursorFileOpenFlag = false;
  146.     }
  147.     rhRetCursor = LoadCursorFromFile(szTempFileName);
  148.     if (!rhRetCursor)
  149.         goto Exit0;
  150.     nResult = true;
  151. Exit0:
  152.     if (nSrcCursorFileOpenFlag)
  153.     {
  154.         SrcCursorFile.Close();
  155.         nSrcCursorFileOpenFlag = false;
  156.     }
  157.     if (nDstCursorFileOpenFlag)
  158.     {
  159.         DstCursorFile.Close();
  160.         nDstCursorFileOpenFlag = false;
  161.     }
  162.     if (szTempFileName[0])
  163.     {
  164.         DeleteFile(szTempFileName);
  165.         szTempFileName[0] = '';
  166.     }
  167.     return nResult;
  168. }
  169. void KUiCursor::SetImage(int nIndex, const char* pImgFile)
  170. {
  171.     #ifdef  KUI_USE_HARDWARE_MOUSE
  172. {
  173. if (nIndex >= 0 && nIndex < MAX_CURSOR_IMAGE && pImgFile)
  174. {
  175. KUiLoadCursor(pImgFile, m_CursorImages[nIndex]);
  176. if (m_nCurImage == nIndex)
  177. SetCursor(m_CursorImages[m_nCurImage]);
  178. }
  179.     }
  180.     #else   // KUI_USE_HARDWARE_MOUSE
  181. {
  182.     if (nIndex >= 0 && nIndex < MAX_CURSOR_IMAGE && pImgFile)
  183. {
  184. KUiImageRef* pCurrentImg = &m_CursorImages[nIndex];
  185. pCurrentImg->nFlipTime = 0;
  186. pCurrentImg->nInterval = 0;
  187. pCurrentImg->nNumFrames = 0;
  188. strncpy(pCurrentImg->szImage, pImgFile, sizeof(pCurrentImg->szImage));
  189. pCurrentImg->szImage[sizeof(pCurrentImg->szImage) - 1] = 0;
  190. pCurrentImg->bRenderFlag = RUIMAGE_RENDER_FLAG_REF_SPOT;
  191. KImageParam Param;
  192. Param.nReferenceSpotX = 0;
  193. Param.nReferenceSpotY = 0;
  194. g_pRepresentShell->GetImageParam(pCurrentImg->szImage, &Param, pCurrentImg->nType);
  195. m_nHotspotH = Param.nReferenceSpotX;
  196. m_nHotspotV = Param.nReferenceSpotY;
  197. }
  198. }
  199.     #endif
  200. }
  201. //--------------------------------------------------------------------------
  202. // 功能:切换当前鼠标指针图形
  203. //--------------------------------------------------------------------------
  204. int KUiCursor::SwitchImage(int nIndex)
  205. {
  206.     #ifdef  KUI_USE_HARDWARE_MOUSE 
  207. {
  208.         if (nIndex >= 0 && nIndex < MAX_CURSOR_IMAGE)
  209. {
  210. m_nCurImage = nIndex;
  211. if (m_CursorImages[m_nCurImage])
  212. {
  213. SetCursor(m_CursorImages[m_nCurImage]);
  214. }
  215. else
  216. {
  217. SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW)));
  218. }
  219. }
  220. else
  221. {
  222. SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW)));
  223. }
  224. return m_nCurImage;
  225. }
  226.     #else   // KUI_USE_HARDWARE_MOUSE
  227. {
  228. if (nIndex >= 0 && nIndex < MAX_CURSOR_IMAGE)
  229. m_nCurImage = nIndex;
  230. return m_nCurImage;
  231. }    
  232.     #endif
  233. }
  234. //--------------------------------------------------------------------------
  235. // 功能:重新激活鼠标
  236. //--------------------------------------------------------------------------
  237. void KUiCursor::RestoreCursor()
  238. {
  239.     SwitchImage(m_nCurImage);
  240. }
  241. //--------------------------------------------------------------------------
  242. // 功能:绘制鼠标指针
  243. //--------------------------------------------------------------------------
  244. void KUiCursor::Paint()
  245. {
  246. #ifdef  KUI_USE_HARDWARE_MOUSE 
  247. {
  248.     NULL;
  249. }
  250.     #else   // KUI_USE_HARDWARE_MOUSE
  251. {
  252.     if (m_bShow && g_pRepresentShell)
  253. {
  254. m_CursorImages[m_nCurImage].oPosition.nX = m_nPositionH - m_nHotspotH;
  255. m_CursorImages[m_nCurImage].oPosition.nY = m_nPositionV - m_nHotspotV;
  256.     
  257. g_pRepresentShell->DrawPrimitives(1, &m_CursorImages[m_nCurImage], RU_T_IMAGE, true);
  258. IR_NextFrame(m_CursorImages[m_nCurImage]);
  259. }
  260. }
  261.     #endif
  262. }
  263. //设置鼠标指针的显示状态
  264. void KUiCursor::Show(int bShow)
  265. {
  266. m_bShow = bShow;
  267. #ifdef  KUI_USE_HARDWARE_MOUSE
  268. ShowCursor(m_bShow);
  269.     #endif
  270. }