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

模拟服务器

开发平台:

C/C++

  1. /*****************************************************************************************
  2. // 界面窗口体系结构--容纳游戏对象的窗口
  3. // Copyright : Kingsoft 2002
  4. // Author :   Wooy(Wu yue)
  5. // CreateTime: 2002-9-25
  6. *****************************************************************************************/
  7. #include "KWin32.h"
  8. #include "KIniFile.h"
  9. #include "../Elem/WndMessage.h"
  10. #include "../elem/wnds.h"
  11. #include "WndObjContainer.h"
  12. #include "../Elem/MouseHover.h"
  13. #include "../../../core/src/CoreObjGenreDef.h"
  14. #include "../../../core/src/CoreShell.h"
  15. #include "../../../core/src/GameDataDef.h"
  16. #include "../../../Represent/iRepresent/iRepresentShell.h"
  17. #include "../../../Represent/iRepresent/KRepresentUnit.h"
  18. #include "../../../Engine/Src/Text.h"
  19. extern iCoreShell* g_pCoreShell;
  20. extern iRepresentShell* g_pRepresentShell;
  21. unsigned int l_BgColors[] =
  22. {
  23. 0x0a001e13, //IIEP_NORMAL 一般/正常/可用 0,30,19
  24. 0x0a2c0000, //IIEP_NOT_USEABLE 不可用/不可装配 44,0,0
  25. 0x0a654915, //IIEP_SPECIAL 特定的不同情况 101,73,21
  26. 0x0a000636, //mouse over 0,6,54
  27. 0x0a0000ff, //放下物品的位置的颜色
  28. };
  29. void WndObjContainerInit(KIniFile* pIni)
  30. {
  31. #define COLOR_SECTION "ObjContColor"
  32. if (pIni)
  33. {
  34. char Buff[16];
  35. int nAlpha;
  36. pIni->GetInteger(COLOR_SECTION, "Alpha", 0, &nAlpha);
  37. if (nAlpha < 0)
  38. nAlpha = 0;
  39. else if (nAlpha > 255)
  40. nAlpha = 255;
  41. nAlpha = ((nAlpha << 21) & 0xff000000);
  42. pIni->GetString(COLOR_SECTION, "NormalColor", "", Buff, sizeof(Buff));
  43. l_BgColors[0] = (GetColor(Buff) & 0xffffff) | nAlpha;
  44. pIni->GetString(COLOR_SECTION, "NotUseableColor", "", Buff, sizeof(Buff));
  45. l_BgColors[1] = (GetColor(Buff) & 0xffffff) | nAlpha;
  46. pIni->GetString(COLOR_SECTION, "SpecialColor", "", Buff, sizeof(Buff));
  47. l_BgColors[2] = (GetColor(Buff) & 0xffffff) | nAlpha;
  48. pIni->GetString(COLOR_SECTION, "MouseOverColor", "", Buff, sizeof(Buff));
  49. l_BgColors[3] = (GetColor(Buff) & 0xffffff) | nAlpha;
  50. pIni->GetString(COLOR_SECTION, "PutdownColor", "", Buff, sizeof(Buff));
  51. l_BgColors[4] = (GetColor(Buff) & 0xffffff) | nAlpha;
  52. }
  53. }
  54. //--------------------------------------------------------------------------
  55. // 功能:构造函数
  56. //--------------------------------------------------------------------------
  57. KWndObjectBox::KWndObjectBox()
  58. {
  59. m_uAcceptableGenre = CGOG_NOTHING;
  60. m_Object.uGenre = CGOG_NOTHING;
  61. m_Object.DataX = 0;
  62. m_Object.DataY = 0;
  63. m_nContainerId = 0;
  64. }
  65. void KWndObjectBox::SetContainerId(int nId)
  66. {
  67. m_nContainerId = nId;
  68. }
  69. //--------------------------------------------------------------------------
  70. // 功能:设置可以容纳的对象的类型
  71. //--------------------------------------------------------------------------
  72. void KWndObjectBox::SetObjectGenre(unsigned int uGenre)
  73. {
  74. m_uAcceptableGenre = uGenre;
  75. }
  76. //--------------------------------------------------------------------------
  77. // 功能:清除对象物品
  78. //--------------------------------------------------------------------------
  79. void KWndObjectBox::Celar()
  80. {
  81. m_Object.uGenre = CGOG_NOTHING;
  82. }
  83. //--------------------------------------------------------------------------
  84. // 功能:获取容纳的对象信息
  85. //--------------------------------------------------------------------------
  86. int KWndObjectBox::GetObject(KUiDraggedObject& Obj) const
  87. {
  88. if ((Obj.uGenre = m_Object.uGenre) != CGOG_NOTHING)
  89. {
  90. Obj = m_Object;
  91. return true;
  92. }
  93. return false;
  94. }
  95. //--------------------------------------------------------------------------
  96. // 功能:设置容纳的对象
  97. //--------------------------------------------------------------------------
  98. void KWndObjectBox::HoldObject(unsigned int uGenre, unsigned int uId, int nDataW, int nDataH)
  99. {
  100. m_Object.uGenre = uGenre;
  101. m_Object.uId = uId;
  102. m_Object.DataW = nDataW;
  103. m_Object.DataH = nDataH;
  104. if (g_MouseOver.IsMoseHoverWndObj(this, 0))
  105. {
  106. if (m_Object.uGenre != CGOG_NOTHING)
  107. {
  108. int x, y;
  109. Wnd_GetCursorPos(&x, &y);
  110. SetMouseHoverObjectDesc(this, 0, m_Object.uGenre,
  111. m_Object.uId, m_nContainerId, x, y);
  112. }
  113. else
  114. {
  115. g_MouseOver.CancelMouseHoverInfo();
  116. }
  117. }
  118. }
  119. //--------------------------------------------------------------------------
  120. // 功能:窗体绘制
  121. //--------------------------------------------------------------------------
  122. void KWndObjectBox::PaintWindow()
  123. {
  124. KWndWindow::PaintWindow();
  125. if (m_Object.uGenre != CGOG_NOTHING && g_pRepresentShell)
  126. {
  127. KRUShadow Shadow;
  128. Shadow.Color.Color_dw = 0;
  129. if (m_Style & OBJCONT_F_MOUSE_HOVER)
  130. Shadow.Color.Color_dw = l_BgColors[3];
  131. else if (m_Style & OBJCONT_S_HAVEOBJBGCOLOR)
  132. {
  133. KUiObjAtContRegion Obj;
  134. Obj.Obj.uGenre = m_Object.uGenre;
  135. Obj.Obj.uId = m_Object.uId;
  136. Obj.Region.h = Obj.Region.v = 0;
  137. Obj.Region.Width = Obj.Region.Height = 0;
  138. Obj.nContainer = m_nContainerId;
  139. ITEM_IN_ENVIRO_PROP eProp = (ITEM_IN_ENVIRO_PROP)g_pCoreShell->
  140. GetGameData(GDI_ITEM_IN_ENVIRO_PROP, (unsigned int)&Obj, 0);
  141. if (eProp == IIEP_NORMAL)
  142. Shadow.Color.Color_dw = l_BgColors[0];
  143. else if (eProp == IIEP_NOT_USEABLE)
  144. Shadow.Color.Color_dw = l_BgColors[1];
  145. else if (eProp == IIEP_SPECIAL)
  146. Shadow.Color.Color_dw = l_BgColors[2];
  147. }
  148. if (Shadow.Color.Color_dw)
  149. {
  150. Shadow.oPosition.nX = m_nAbsoluteLeft;
  151. Shadow.oPosition.nY = m_nAbsoluteTop;
  152. Shadow.oEndPos.nX = m_nAbsoluteLeft + m_Width;
  153. Shadow.oEndPos.nY = m_nAbsoluteTop + m_Height;
  154. g_pRepresentShell->DrawPrimitives(1, &Shadow, RU_T_SHADOW, true);
  155. }
  156. g_pCoreShell->DrawGameObj(m_Object.uGenre, m_Object.uId,
  157. m_nAbsoluteLeft, m_nAbsoluteTop, m_Width, m_Height, 0);
  158. }
  159. }
  160. void KWndObjectBox::Clone(KWndObjectBox* pCopy)
  161. {
  162. if (pCopy)
  163. {
  164. KWndWindow::Clone(pCopy);
  165. pCopy->m_uAcceptableGenre = m_uAcceptableGenre;
  166. }
  167. }
  168. //初始化
  169. int KWndObjectBox::Init(KIniFile* pIniFile, const char* pSection)
  170. {
  171. if (KWndWindow::Init(pIniFile, pSection))
  172. {
  173. int nValue;
  174. pIniFile->GetInteger(pSection, "EnableClickEmpty", 0, &nValue);
  175. if (nValue)
  176. m_Style |= OBJCONT_S_ENABLE_CLICK_EMPTY;
  177. else
  178. m_Style &= ~OBJCONT_S_ENABLE_CLICK_EMPTY;
  179. pIniFile->GetInteger(pSection, "HaveBgColor", 1, &nValue);
  180. if (nValue)
  181. m_Style |= OBJCONT_S_HAVEOBJBGCOLOR;
  182. else
  183. m_Style &= ~OBJCONT_S_HAVEOBJBGCOLOR;
  184. return true;
  185. }
  186. return false;
  187. }
  188. void KWndObjectBox::EnablePickPut(bool bEnable)
  189. {
  190. if (bEnable == false)
  191. m_Style |= OBJCONT_S_DISABLE_PICKPUT;
  192. else
  193. m_Style &= ~OBJCONT_S_DISABLE_PICKPUT;
  194. }
  195. //--------------------------------------------------------------------------
  196. // 功能:窗口函数
  197. //--------------------------------------------------------------------------
  198. int KWndObjectBox::WndProc(unsigned int uMsg, unsigned int uParam, int nParam)
  199. {
  200. switch(uMsg)
  201. {
  202. case WM_LBUTTONDOWN:
  203. if (m_pParentWnd)
  204. {
  205. if ((m_Style & OBJCONT_S_DISABLE_PICKPUT) == 0)
  206. {
  207. if (Wnd_GetDragObj(NULL))
  208. {
  209. DropObject(false);
  210. }
  211. else if (m_Object.uGenre != CGOG_NOTHING)
  212. {
  213. ITEM_PICKDROP_PLACE Pick;
  214. Pick.pWnd = this;
  215. Pick.h = 0;
  216. Pick.v = 0;
  217. m_pParentWnd->WndProc(WND_N_ITEM_PICKDROP,
  218. (unsigned int)&Pick, NULL);
  219. }
  220. }
  221. else if (m_Object.uGenre != CGOG_NOTHING)
  222. {
  223. KUiDraggedObject Obj;
  224. Obj = m_Object;
  225. m_pParentWnd->WndProc(WND_N_LEFT_CLICK_ITEM,
  226. (unsigned int)&Obj, (int)(KWndWindow*)this);
  227. }
  228. else if (m_Style & OBJCONT_S_ENABLE_CLICK_EMPTY)
  229. {
  230. m_pParentWnd->WndProc(WND_N_LEFT_CLICK_ITEM,
  231. NULL, (int)(KWndWindow*)this);
  232. }
  233. }
  234. break;
  235. case WM_RBUTTONDOWN:
  236. if (m_pParentWnd)
  237. {
  238. if (m_Object.uGenre != CGOG_NOTHING)
  239. {
  240. KUiDraggedObject Obj;
  241. Obj = m_Object;
  242. m_pParentWnd->WndProc(WND_N_RIGHT_CLICK_ITEM,
  243. (unsigned int)&m_Object, (int)(KWndWindow*)this);
  244. }
  245. else if (m_Style & OBJCONT_S_ENABLE_CLICK_EMPTY)
  246. {
  247. m_pParentWnd->WndProc(WND_N_LEFT_CLICK_ITEM,
  248. NULL, (int)(KWndWindow*)this);
  249. }
  250. }
  251. break;
  252. case WM_MOUSEHOVER:
  253. case WM_MOUSEMOVE:
  254. m_Style |= OBJCONT_F_MOUSE_HOVER;
  255. if (m_Object.uGenre != CGOG_NOTHING && g_MouseOver.IsMoseHoverWndObj(this, 0) == 0)
  256. SetMouseHoverObjectDesc(this, 0, m_Object.uGenre,
  257. m_Object.uId, m_nContainerId, LOWORD(nParam), HIWORD(nParam));
  258. break;
  259. case WND_M_MOUSE_LEAVE:
  260. m_Style &= ~OBJCONT_F_MOUSE_HOVER;
  261. KWndWindow::WndProc(uMsg, uParam, nParam);
  262. break;
  263. default:
  264. return KWndWindow::WndProc(uMsg, uParam, nParam);
  265. }
  266. return 0;
  267. }
  268. //--------------------------------------------------------------------------
  269. // 功能:放置物品
  270. //--------------------------------------------------------------------------
  271. int KWndObjectBox::DropObject(bool bTestOnly)
  272. {
  273. KUiDraggedObject DragObj;
  274. Wnd_GetDragObj(&DragObj);
  275. if (m_uAcceptableGenre != CGOG_NOTHING)
  276. {
  277. if ((m_uAcceptableGenre != DragObj.uGenre) &&
  278. ((m_uAcceptableGenre & 0xFFFF) != (DragObj.uGenre & 0xFFFF)) || ((m_uAcceptableGenre & 0xFFFF0000) != 0))
  279. return false;
  280. }
  281. if (bTestOnly)
  282. return true;
  283. ITEM_PICKDROP_PLACE Pick, Drop;
  284. Drop.pWnd = this;
  285. Drop.h = Drop.v = 0;
  286. if (m_Object.uGenre == CGOG_NOTHING)
  287. m_pParentWnd->WndProc(WND_N_ITEM_PICKDROP, NULL, (int)&Drop);
  288. else
  289. {
  290. Pick.pWnd = this;
  291. Pick.h = 0;
  292. Pick.v = 0;
  293. m_pParentWnd->WndProc(WND_N_ITEM_PICKDROP, (unsigned int)&Pick, (int)&Drop);
  294. }
  295. return true;
  296. }
  297. #define NO_MATCHED_PUT_POS -761209
  298. #define REPLACE_ITEM_POS(iItem) (-(iItem) - 1)
  299. #define REPLACE_ITEM_INDEX(iPos) ((-iPos) - 1)
  300. //--------------------------------------------------------------------------
  301. // 功能:构造函数
  302. //--------------------------------------------------------------------------
  303. KWndObjectMatrix::KWndObjectMatrix()
  304. {
  305. m_nNumUnitHori = 1;
  306. m_nNUmUnitVert = 1;
  307. m_nUnitWidth = 1;
  308. m_nUnitHeight = 1;
  309. m_nNumObjects = 0;
  310. m_pObjects = NULL;
  311. m_nMouseOverObj = -1;
  312. m_nPutPosX = NO_MATCHED_PUT_POS;
  313. m_nContainerId = 0;
  314. }
  315. void KWndObjectMatrix::SetContainerId(int nId)
  316. {
  317. m_nContainerId = nId;
  318. }
  319. KWndObjectMatrix::~KWndObjectMatrix()
  320. {
  321. Clear();
  322. }
  323. void KWndObjectMatrix::Clone(KWndObjectMatrix* pCopy)
  324. {
  325. if (pCopy)
  326. {
  327. KWndWindow::Clone(pCopy);
  328. pCopy->m_nNumUnitHori = m_nNumUnitHori;
  329. pCopy->m_nNUmUnitVert = m_nNUmUnitVert;
  330. pCopy->m_nUnitWidth  = m_nUnitWidth;
  331. pCopy->m_nUnitHeight = m_nUnitHeight;
  332. }
  333. }
  334. // -------------------------------------------------------------------------
  335. // 功能:初始化窗口
  336. // -------------------------------------------------------------------------
  337. int KWndObjectMatrix::Init(KIniFile* pIniFile, const char* pSection)
  338. {
  339. if (KWndWindow::Init(pIniFile, pSection))
  340. {
  341. pIniFile->GetInteger(pSection, "HUnits", 1, &m_nNumUnitHori);
  342. pIniFile->GetInteger(pSection, "VUnits", 1, &m_nNUmUnitVert);
  343. if (m_nNumUnitHori < 1)
  344. m_nNumUnitHori = 1;
  345. if (m_nNUmUnitVert < 1)
  346. m_nNUmUnitVert = 1;
  347. m_nUnitWidth = m_Width / m_nNumUnitHori;
  348. if (m_nUnitWidth < 1)
  349. m_nUnitWidth = 1;
  350. m_nUnitHeight = m_Height / m_nNUmUnitVert;
  351. if (m_nUnitHeight < 1)
  352. m_nUnitHeight = 1;
  353. int nValue;
  354. pIniFile->GetInteger(pSection, "HaveBgColor", 1, &nValue);
  355. if (nValue)
  356. m_Style |= OBJCONT_S_HAVEOBJBGCOLOR;
  357. else
  358. m_Style &= ~OBJCONT_S_HAVEOBJBGCOLOR;
  359. pIniFile->GetInteger(pSection, "AcceptFree", 0, &nValue);
  360. if (nValue)
  361. m_Style |= OBJCONT_S_ACCEPT_FREE;
  362. else
  363. m_Style &= ~OBJCONT_S_ACCEPT_FREE;
  364. pIniFile->GetInteger(pSection, "UnitBorder", 0, &m_nUnitBorder);
  365. if (m_nUnitBorder >= m_nUnitWidth)
  366. m_nUnitBorder = m_nUnitWidth - 1;
  367. if (m_nUnitBorder >= m_nUnitHeight)
  368. m_nUnitBorder = m_nUnitHeight - 1;
  369. if (m_nUnitBorder < 0)
  370. m_nUnitBorder = 0;
  371. m_nPutPosX = NO_MATCHED_PUT_POS;
  372. return true;
  373. }
  374. return false;
  375. }
  376. // -------------------------------------------------------------------------
  377. // 功能 : 窗体绘制
  378. // -------------------------------------------------------------------------
  379. void KWndObjectMatrix::PaintWindow()
  380. {
  381. KWndWindow::PaintWindow();
  382. KRUShadow Shadow;
  383. for (int i = 0; i < m_nNumObjects; i++)
  384. {
  385. KUiDraggedObject* pObj = &m_pObjects[i];
  386. Shadow.Color.Color_dw = 0;
  387. if (i == REPLACE_ITEM_INDEX(m_nPutPosX))
  388. Shadow.Color.Color_dw = l_BgColors[4];
  389. else if ((m_Style & OBJCONT_F_MOUSE_HOVER) && m_nMouseOverObj == i)
  390. Shadow.Color.Color_dw = l_BgColors[3];
  391. else if (m_Style & OBJCONT_S_HAVEOBJBGCOLOR)
  392. {
  393. KUiObjAtContRegion Obj;
  394. Obj.Obj.uGenre = pObj->uGenre;
  395. Obj.Obj.uId = pObj->uId;
  396. Obj.Region.h = Obj.Region.v = 0;
  397. Obj.Region.Width = Obj.Region.Height = 0;
  398. Obj.nContainer = m_nContainerId;
  399. ITEM_IN_ENVIRO_PROP eProp = (ITEM_IN_ENVIRO_PROP)g_pCoreShell->
  400. GetGameData(GDI_ITEM_IN_ENVIRO_PROP, (unsigned int)&Obj, 0);
  401. if (eProp == IIEP_NORMAL)
  402. Shadow.Color.Color_dw = l_BgColors[0];
  403. else if (eProp == IIEP_NOT_USEABLE)
  404. Shadow.Color.Color_dw = l_BgColors[1];
  405. else if (eProp == IIEP_SPECIAL)
  406. Shadow.Color.Color_dw = l_BgColors[2];
  407. }
  408. int width = m_nUnitWidth * pObj->DataW - m_nUnitBorder * 2;
  409. int height = m_nUnitHeight * pObj->DataH - m_nUnitBorder * 2;
  410. Shadow.oPosition.nX = m_nAbsoluteLeft + m_nUnitWidth * pObj->DataX + m_nUnitBorder;
  411. Shadow.oPosition.nY = m_nAbsoluteTop + m_nUnitHeight * pObj->DataY + m_nUnitBorder;
  412. if (Shadow.Color.Color_dw)
  413. {
  414. Shadow.oEndPos.nX = Shadow.oPosition.nX + width;
  415. Shadow.oEndPos.nY = Shadow.oPosition.nY + height;
  416. g_pRepresentShell->DrawPrimitives(1, &Shadow, RU_T_SHADOW, true);
  417. }
  418. g_pCoreShell->DrawGameObj(pObj->uGenre, pObj->uId,
  419. Shadow.oPosition.nX, Shadow.oPosition.nY, width, height, 0);
  420. }
  421. if (m_nPutPosX >= 0)
  422. {
  423. Shadow.oPosition.nX = m_nAbsoluteLeft + m_nUnitWidth * m_nPutPosX + m_nUnitBorder;
  424. Shadow.oPosition.nY = m_nAbsoluteTop + m_nUnitHeight * m_nPutPosY + m_nUnitBorder;
  425. Shadow.oEndPos.nX = Shadow.oPosition.nX + m_nUnitWidth * m_nPutWidth - m_nUnitBorder * 2;
  426. Shadow.oEndPos.nY = Shadow.oPosition.nY + m_nUnitHeight * m_nPutHeight - m_nUnitBorder * 2;
  427. Shadow.Color.Color_dw = l_BgColors[4];
  428. g_pRepresentShell->DrawPrimitives(1, &Shadow, RU_T_SHADOW, true);
  429. }
  430. }
  431. // -------------------------------------------------------------------------
  432. // 功能 : 增加一个对象物品
  433. // -------------------------------------------------------------------------
  434. int KWndObjectMatrix::AddObject(KUiDraggedObject* pObject, int nCount)
  435. {
  436. if (pObject && nCount > 0)
  437. {
  438. int i, nValidCount = 0;
  439. for (i = 0; i < nCount; i++)
  440. {
  441. if (pObject[i].uGenre)
  442. nValidCount++;
  443. }
  444. if (nValidCount)
  445. {
  446. KUiDraggedObject* pNewList = (KUiDraggedObject*)realloc(m_pObjects, sizeof(KUiDraggedObject) * (m_nNumObjects + nValidCount));
  447. if (pNewList)
  448. {
  449. m_pObjects = pNewList;
  450. for (i = 0; i < nCount; i++)
  451. {
  452. if (pObject[i].uGenre)
  453. {
  454. m_pObjects[m_nNumObjects] = pObject[i];
  455. m_nNumObjects ++;
  456. }
  457. }
  458. }
  459. m_nPutPosX = NO_MATCHED_PUT_POS;
  460. return true;
  461. }
  462. }
  463. return false;
  464. }
  465. // -------------------------------------------------------------------------
  466. // 功能 : 减少一个对象物品
  467. // -------------------------------------------------------------------------
  468. int KWndObjectMatrix::RemoveObject(KUiDraggedObject* pObject)
  469. {
  470. if (pObject)
  471. {
  472. m_nPutPosX = NO_MATCHED_PUT_POS;
  473. m_nMouseOverObj = -1;
  474. for (int i = 0; i < m_nNumObjects; i++)
  475. {
  476. KUiDraggedObject* pHolded = &m_pObjects[i];
  477. if (pHolded->DataX == pObject->DataX &&
  478. pHolded->DataY == pObject->DataY)
  479. {
  480. if (g_MouseOver.IsMoseHoverWndObj(this, i))
  481. g_MouseOver.CancelMouseHoverInfo();
  482. m_nNumObjects --;
  483. for (; i < m_nNumObjects; i++)
  484. m_pObjects[i] = m_pObjects[i + 1];
  485. return true;
  486. }
  487. }
  488. }
  489. return false;
  490. }
  491. // -------------------------------------------------------------------------
  492. // 功能 : 获取容纳的某个对象信息
  493. // 返回:对象的数目
  494. // -------------------------------------------------------------------------
  495. int KWndObjectMatrix::GetObject(KUiDraggedObject& Obj, int x, int y) const
  496. {
  497. for (int i = 0; i < m_nNumObjects; i++)
  498. {
  499. KUiDraggedObject* pHolded = &m_pObjects[i];
  500. if (x == pHolded->DataX && y == pHolded->DataY)
  501. {
  502. Obj = *pHolded;
  503. return true;
  504. }
  505. }
  506. return false;
  507. }
  508. // -------------------------------------------------------------------------
  509. // 功能 : 获取容纳的对象信息
  510. // 返回:对象的数目
  511. // -------------------------------------------------------------------------
  512. /*int KWndObjectMatrix::GetObjects(KUiGameObject* pObjects, int nCount) const
  513. {
  514. if (m_nNumObjects <= nCount)
  515. {
  516. for (int i = 0; i < m_nNumObjects; i++)
  517. {
  518. pObjects[i].uGenre = m_pObjects[i].uGenre;
  519. pObjects[i].uId = m_pObjects[i].uId;
  520. }
  521. return m_nNumObjects;
  522. }
  523. return m_nNumObjects;
  524. }*/
  525. //--------------------------------------------------------------------------
  526. // 功能:清除全部的对象物品
  527. //--------------------------------------------------------------------------
  528. void KWndObjectMatrix::Clear()
  529. {
  530. m_nNumObjects = 0;
  531. m_nMouseOverObj = -1;
  532. if (m_pObjects)
  533. {
  534. free(m_pObjects);
  535. m_pObjects = NULL;
  536. }
  537. }
  538. //--------------------------------------------------------------------------
  539. // 功能:窗口函数
  540. //--------------------------------------------------------------------------
  541. int KWndObjectMatrix::WndProc(unsigned int uMsg, unsigned int uParam, int nParam)
  542. {
  543. switch(uMsg)
  544. {
  545. case WM_LBUTTONDOWN:
  546. if ((m_Style & OBJCONT_S_DISABLE_PICKPUT)== 0)
  547. {
  548. if (Wnd_GetDragObj(NULL))
  549. DropObject(LOWORD(nParam), HIWORD(nParam), false);
  550. else
  551. PickUpObjectAt(LOWORD(nParam), HIWORD(nParam));
  552. }
  553. else if (m_pParentWnd)
  554. {
  555. m_nPutPosX = NO_MATCHED_PUT_POS;
  556. int nObj = GetObjectAt(LOWORD(nParam), HIWORD(nParam));
  557. if (nObj >= 0)
  558. {
  559. KUiDraggedObject Obj;
  560. Obj = m_pObjects[nObj];
  561. m_pParentWnd->WndProc(WND_N_LEFT_CLICK_ITEM,
  562. (unsigned int)&Obj, (int)(KWndWindow*)this);
  563. }
  564. }
  565. break;
  566. case WM_RBUTTONDOWN:
  567. m_nPutPosX = NO_MATCHED_PUT_POS;
  568. if (m_pParentWnd)
  569. {
  570. int nObj = GetObjectAt(LOWORD(nParam), HIWORD(nParam));
  571. if (nObj >= 0)
  572. {
  573. KUiDraggedObject Obj;
  574. Obj = m_pObjects[nObj];
  575. m_pParentWnd->WndProc(WND_N_RIGHT_CLICK_ITEM,
  576. (unsigned int)&Obj, (int)(KWndWindow*)this);
  577. }
  578. }
  579. break;
  580. case WM_MOUSEHOVER:
  581. case WM_MOUSEMOVE:
  582. m_Style |= OBJCONT_F_MOUSE_HOVER;
  583. {
  584. int x = LOWORD(nParam);
  585. int y = HIWORD(nParam);
  586. int nObj = GetObjectAt(x, y);
  587. m_nMouseOverObj = nObj;
  588. if (nObj >= 0)
  589. {
  590. if (g_MouseOver.IsMoseHoverWndObj(this, nObj) == 0)
  591. {
  592. SetMouseHoverObjectDesc(this, nObj, m_pObjects[nObj].uGenre,
  593. m_pObjects[nObj].uId, m_nContainerId, x, y);
  594. }
  595. }
  596. else
  597. g_MouseOver.CancelMouseHoverInfo();
  598. if ((m_Style & OBJCONT_S_TRACE_PUT_POS) && Wnd_GetDragObj(NULL))
  599. {
  600. DropObject(LOWORD(nParam), HIWORD(nParam), true);
  601. }
  602. }
  603. break;
  604. case WND_M_MOUSE_LEAVE:
  605. m_nPutPosX = NO_MATCHED_PUT_POS;
  606. m_Style &= ~OBJCONT_F_MOUSE_HOVER;
  607. KWndWindow::WndProc(uMsg, uParam, nParam);
  608. break;
  609. default:
  610. return KWndWindow::WndProc(uMsg, uParam, nParam);
  611. }
  612. return 0;
  613. }
  614. //--------------------------------------------------------------------------
  615. // 功能:获得某个位置上的物品
  616. //--------------------------------------------------------------------------
  617. int KWndObjectMatrix::GetObjectAt(int x, int y)
  618. {
  619. x = (x - m_nAbsoluteLeft) / m_nUnitWidth;
  620. y = (y - m_nAbsoluteTop) / m_nUnitHeight;
  621. for (int i = 0; i < m_nNumObjects; i++)
  622. {
  623. KUiDraggedObject* pHolded = &m_pObjects[i];
  624. if (x < pHolded->DataX || y < pHolded->DataY ||
  625. x >= pHolded->DataX + pHolded->DataW ||
  626. y >= pHolded->DataY + pHolded->DataH)
  627. continue;
  628. return i;
  629. }
  630. return -1;
  631. }
  632. //--------------------------------------------------------------------------
  633. // 功能:捡起某个位置上的对象
  634. //--------------------------------------------------------------------------
  635. int KWndObjectMatrix::PickUpObjectAt(int x, int y)
  636. {
  637. int nPicked = GetObjectAt(x, y);
  638. if (nPicked >= 0)
  639. {
  640. ITEM_PICKDROP_PLACE Pick;
  641. Pick.pWnd = this;
  642. Pick.h = m_pObjects[nPicked].DataX;
  643. Pick.v = m_pObjects[nPicked].DataY;
  644. m_pParentWnd->WndProc(WND_N_ITEM_PICKDROP, (unsigned int)&Pick, NULL);
  645. return true;
  646. }
  647. return false;
  648. }
  649. //--------------------------------------------------------------------------
  650. // 功能:放置物品
  651. //--------------------------------------------------------------------------
  652. int KWndObjectMatrix::DropObject(int x, int y, bool bTestOnly)
  653. {
  654. KUiDraggedObject DragObj;
  655. m_nPutPosX = NO_MATCHED_PUT_POS;
  656. if (m_Style & OBJCONT_S_ACCEPT_FREE)
  657. {
  658. if (bTestOnly == false)
  659. DropObject(x, y, (KUiDraggedObject*)NULL);
  660. return true;
  661. }
  662. Wnd_GetDragObj(&DragObj);
  663. if (DragObj.DataW > m_nNumUnitHori || DragObj.DataH > m_nNUmUnitVert)
  664. return false;
  665. //转换成格子坐标
  666. RECT or;
  667. KUiDraggedObject* pOverlaped = NULL;
  668. x = (x - m_nAbsoluteLeft) / m_nUnitWidth;
  669. y = (y - m_nAbsoluteTop) / m_nUnitHeight;
  670. if ((or.right = x + (DragObj.DataW + 1) / 2) > m_nNumUnitHori)
  671. or.right = m_nNumUnitHori;
  672. if ((or.bottom = y + (DragObj.DataH + 1) / 2) > m_nNUmUnitVert)
  673. or.bottom = m_nNUmUnitVert;
  674. if (or.right >= DragObj.DataW)
  675. or.left = or.right - DragObj.DataW;
  676. else
  677. {
  678. or.left = 0;
  679. or.right = DragObj.DataW;
  680. }
  681. if (or.bottom >= DragObj.DataH)
  682. or.top = or.bottom - DragObj.DataH;
  683. else
  684. {
  685. or.top = 0;
  686. or.bottom = DragObj.DataH;
  687. }
  688. if (TryDropObjAtPos(or, pOverlaped))
  689. {
  690. if (bTestOnly == false)
  691. DropObject(or.left, or.top, pOverlaped);
  692. else if (pOverlaped)
  693. {
  694. m_nPutPosX = REPLACE_ITEM_POS(pOverlaped - m_pObjects);
  695. }
  696. else
  697. {
  698. m_nPutPosX = or.left;
  699. m_nPutPosY = or.top;
  700. m_nPutWidth = DragObj.DataW;
  701. m_nPutHeight = DragObj.DataH;
  702. }
  703. return true;
  704. }
  705. if (DragObj.DataW == 1 && DragObj.DataH == 1)
  706. return false;
  707. RECT Try;
  708. Try.right = x;
  709. Try.bottom = y;
  710. if ((Try.left = x - DragObj.DataW + 1) < 0)
  711. Try.left = 0;
  712. if ((Try.top = y - DragObj.DataH + 1) < 0)
  713. Try.top = 0;
  714. for (or.left = Try.left; or.left <= Try.right; or.left ++)
  715. {
  716. or.right = or.left + DragObj.DataW;
  717. for (or.top = Try.top; or.top <= Try.bottom; or.top ++)
  718. {
  719. or.bottom = or.top + DragObj.DataH;
  720. if (TryDropObjAtPos(or, pOverlaped))
  721. {
  722. if (bTestOnly == false)
  723. DropObject(or.left, or.top, pOverlaped);
  724. return true;
  725. }
  726. }
  727. }
  728. return false;
  729. }
  730. //--------------------------------------------------------------------------
  731. // 功能:尝试放置物品
  732. //--------------------------------------------------------------------------
  733. int KWndObjectMatrix::TryDropObjAtPos(const RECT& dor, KUiDraggedObject*& pOverlaped)
  734. {
  735. pOverlaped = NULL;
  736. for (int i = 0; i < m_nNumObjects; i++)
  737. {
  738. KUiDraggedObject* pHolded = &m_pObjects[i];
  739. if (pHolded->DataX >= dor.right || pHolded->DataY >= dor.bottom ||
  740. pHolded->DataX + pHolded->DataW <= dor.left ||
  741. pHolded->DataY + pHolded->DataH <= dor.top)
  742. continue;
  743. if (pOverlaped)
  744. break;
  745. pOverlaped = pHolded;
  746. }
  747. return (i == m_nNumObjects);
  748. }
  749. //--------------------------------------------------------------------------
  750. // 功能:放下物品
  751. //--------------------------------------------------------------------------
  752. void KWndObjectMatrix::DropObject(int x, int y, KUiDraggedObject* pToPickUpObj)
  753. {
  754. ITEM_PICKDROP_PLACE Drop;
  755. Drop.pWnd = this;
  756. Drop.h = x;
  757. Drop.v = y;
  758. if (pToPickUpObj)
  759. {
  760. ITEM_PICKDROP_PLACE Pick;
  761. Pick.pWnd = this;
  762. Pick.h = pToPickUpObj->DataX;
  763. Pick.v = pToPickUpObj->DataY;
  764. m_pParentWnd->WndProc(WND_N_ITEM_PICKDROP, (unsigned int)&Pick, (int)&Drop);
  765. }
  766. else
  767. m_pParentWnd->WndProc(WND_N_ITEM_PICKDROP, NULL, (int)&Drop);
  768. }
  769. void KWndObjectMatrix::EnableTracePutPos(bool bEnable)
  770. {
  771. if (bEnable)
  772. m_Style |= OBJCONT_S_TRACE_PUT_POS;
  773. else
  774. m_Style &= ~OBJCONT_S_TRACE_PUT_POS;
  775. }
  776. void KWndObjectMatrix::EnablePickPut(bool bEnable)
  777. {
  778. if (bEnable == false)
  779. m_Style |= OBJCONT_S_DISABLE_PICKPUT;
  780. else
  781. m_Style &= ~OBJCONT_S_DISABLE_PICKPUT;
  782. }