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

模拟服务器

开发平台:

C/C++

  1. /*****************************************************************************************
  2. // 弹出选择菜单
  3. // Copyright : Kingsoft 2003
  4. // Author :   Wooy(Wu yue)
  5. // CreateTime: 2003-2-21
  6. *****************************************************************************************/
  7. #include "KWin32.h"
  8. #include <Windows.h>
  9. #include <string.h>
  10. #include "KEngine.h"
  11. #include "KiniFile.h"
  12. #include "PopupMenu.h"
  13. #include "AutoLocateWnd.h"
  14. #include "WndWindow.h"
  15. #include "WndMessage.h"
  16. #include "Wnds.h"
  17. #include "SpecialFuncs.h"
  18. #include "../../../Represent/iRepresent/iRepresentShell.h"
  19. #include "../../../Represent/iRepresent/KRepresentUnit.h"
  20. extern iRepresentShell* g_pRepresentShell;
  21. #include "Text.h"
  22. KPopupMenuData* KPopupMenu::m_pMenu = NULL;
  23. KWndWindow* KPopupMenu::m_pCaller = NULL;
  24. unsigned int KPopupMenu::m_uCallerParam = 0;
  25. short KPopupMenu::m_nImgWidth = 0;
  26. short KPopupMenu::m_nImgHeight = 0;
  27. short KPopupMenu::m_nIndent = 0;
  28. short KPopupMenu::m_nFrame = 0;
  29. int KPopupMenu::m_nMenuHeight = 0;
  30. char KPopupMenu::m_szImage[128] = "";
  31. unsigned int KPopupMenu::m_uDefBorderLineColor = 0xff000000; //菜单的变框颜色,为0则无
  32. unsigned int KPopupMenu::m_uDefTextColor  = 0xffffffff; //菜单项的文字色
  33. unsigned int KPopupMenu::m_uDefTextBorderColor= 0xff000000; //菜单项的文字边缘色
  34. unsigned int KPopupMenu::m_uDefSelTextColor  = 0xffe0e0e0; //被选中菜单项的文字色
  35. unsigned int KPopupMenu::m_uDefSelTextBorderColor = 0xff000000; //被选中菜单项的文字边缘色
  36. unsigned int KPopupMenu::m_uDefItemBgColor  = 0x0a404040; //菜单项的背景色
  37. unsigned int KPopupMenu::m_uDefSelItemBgColor = 0x0a202020; //被选中菜单项的背景色
  38. #define SCHEME_INI "弹出说明文字.ini"
  39. void KPopupMenu::OnWndDelete(KWndWindow* pWnd)
  40. {
  41. if (pWnd == m_pCaller)
  42. Cancel();
  43. }
  44. void KPopupMenu::Popup(KPopupMenuData* pMenu, KWndWindow* pCaller, unsigned int uParam)
  45. {
  46. Cancel();
  47. if ((m_pMenu = pMenu) == NULL)
  48. {
  49. m_pCaller = NULL;
  50. return;
  51. }
  52. if (m_pMenu->nNumItem <= 0)
  53. {
  54. Cancel();
  55. return;
  56. }
  57. m_pCaller = pCaller;
  58. m_uCallerParam = uParam;
  59. //----处理头尾图形----
  60. if (m_szImage[0] == 0 || m_nImgWidth == 0)
  61. m_pMenu->usMenuFlag &= ~PM_F_HAVE_HEAD_TAIL_IMG;
  62. //----处理文字缩进----
  63. if (m_pMenu->nItemTitleIndent == MENU_ITEM_DEFAULT_INDENT)
  64. m_pMenu->nItemTitleIndent = m_nIndent;
  65. bool bCalcRightWidth = false;
  66. if (m_pMenu->nItemRightWidth < 0)
  67. {
  68. if ((m_pMenu->usMenuFlag & PM_F_TAB_SPLIT_ITEM_TEXT) == 0)
  69. m_pMenu->nItemRightWidth = 0;
  70. else
  71. bCalcRightWidth = true;
  72. }
  73. //----处理菜单横向宽度----
  74. //----处理菜单项的纵向高度----
  75. int nLenWid, nMaxItemWid = 0, nLenHei, nMaxItemHei = 0, nMaxRightLen = 0;
  76. for (int i = 0; i < m_pMenu->nNumItem; i++)
  77. {
  78. nLenHei = TGetEncodedTextLineCount(m_pMenu->Items[i].szData,
  79. m_pMenu->Items[i].uDataLen, -1, nLenWid, m_pMenu->byFontSize, 0, 1);
  80. if (nMaxItemWid < nLenWid)
  81. nMaxItemWid = nLenWid;
  82. if (nMaxItemHei < nLenHei)
  83. nMaxItemHei = nLenHei;
  84. if (bCalcRightWidth)
  85. {
  86. int nTabPos = TFindSpecialCtrlInEncodedText(m_pMenu->Items[i].szData,
  87. m_pMenu->Items[i].uDataLen, 0, KTC_TAB);
  88. if (nTabPos >= 0)
  89. {
  90. TGetEncodedTextLineCount(m_pMenu->Items[i].szData + nTabPos + 1,
  91. m_pMenu->Items[i].uDataLen - nTabPos - 1, 0, nLenWid, m_pMenu->byFontSize);
  92. if (nMaxRightLen < nLenWid)
  93. nMaxRightLen = nLenWid;
  94. }
  95. }
  96. }
  97. if (bCalcRightWidth)
  98. {
  99. m_pMenu->nItemRightWidth = nMaxRightLen * m_pMenu->byFontSize / 2;
  100. }
  101. if (m_pMenu->nItemWidth == MENU_ITEM_DEFAULT_WIDTH)
  102. {
  103. if ((m_pMenu->usMenuFlag & PM_F_TAB_SPLIT_ITEM_TEXT) == 0)
  104. {
  105. m_pMenu->nItemWidth = m_pMenu->byFontSize * nMaxItemWid / 2 +
  106. m_pMenu->nItemTitleIndent * 2 + m_pMenu->nItemRightWidth;
  107. }
  108. else
  109. {
  110. m_pMenu->nItemWidth = m_pMenu->byFontSize * (nMaxItemWid + 3) / 2 +
  111. m_pMenu->nItemTitleIndent * 2;
  112. }
  113. }
  114. if (m_pMenu->nItemHeight == MENU_ITEM_DEFAULT_HEIGHT)
  115. {
  116. m_pMenu->nItemHeight = m_pMenu->byFontSize * nMaxItemHei + 2 * m_pMenu->byItemTitleUpSpace;
  117. if (m_pMenu->usMenuFlag & PM_F_HAVE_ITEM_SEPARATOR)
  118. m_pMenu->nItemHeight += 1;
  119. }
  120. if (m_pMenu->nItemHeight < 1)
  121. m_pMenu->nItemHeight = 1;
  122. //----调整选中菜单项----
  123. if (m_pMenu->nSelectedItem >= m_pMenu->nNumItem)
  124. m_pMenu->nSelectedItem = -1;
  125. //----计算整个菜单的纵向高度----
  126. m_nMenuHeight = m_pMenu->nItemHeight * m_pMenu->nNumItem;
  127. if (m_pMenu->usMenuFlag & PM_F_HAVE_ITEM_SEPARATOR)
  128. m_nMenuHeight--;
  129. if (m_pMenu->usMenuFlag & PM_F_HAVE_HEAD_TAIL_IMG)
  130. m_nMenuHeight += 2 * m_nImgHeight;
  131. //----计算菜单窗口的位置----
  132. int x, y;
  133. if (m_pMenu->nX == MENU_DEFAULT_POS)
  134. {
  135. ALW_GetWndPosition(x, y, m_pMenu->nItemWidth, m_nMenuHeight, false, true);
  136. }
  137. else
  138. {
  139. x = m_pMenu->nX + m_pMenu->nItemWidth / 2;
  140. y = m_pMenu->nY;
  141. ALW_GetWndPosition(x, y, m_pMenu->nItemWidth, m_nMenuHeight, true, true);
  142. }
  143. m_pMenu->nXX = m_pMenu->nX;
  144. m_pMenu->nYY = m_pMenu->nY;
  145. m_pMenu->nX = x;
  146. m_pMenu->nY = y;
  147. }
  148. void KPopupMenu::PaintMenu()
  149. {
  150. if (m_pMenu == 0)
  151. return;
  152. KRUShadow Shadow;
  153. Shadow.oPosition.nX = m_pMenu->nX;
  154. Shadow.oEndPos.nX = Shadow.oPosition.nX + m_pMenu->nItemWidth;
  155. Shadow.oPosition.nY = m_pMenu->nY;
  156. Shadow.oEndPos.nY = Shadow.oPosition.nY + m_nMenuHeight;
  157. Shadow.oPosition.nZ = 0;
  158. //绘制上下边的图形
  159. if (m_pMenu->usMenuFlag & PM_F_HAVE_HEAD_TAIL_IMG)
  160. {
  161. Shadow.oPosition.nY += m_nImgHeight;
  162. Shadow.oEndPos.nY -= m_nImgHeight;
  163. KRUImagePart Image;
  164. Image.nType = ISI_T_SPR;
  165. Image.bRenderStyle = IMAGE_RENDER_STYLE_ALPHA;
  166. Image.uImage = 0;
  167. Image.nISPosition = 0;
  168. strcpy(Image.szImage, m_szImage);
  169. Image.Color.Color_b.a = 255;
  170. Image.bRenderFlag = 0;
  171. Image.nFrame = m_nFrame;
  172. Image.oPosition.nX = m_pMenu->nX;
  173. Image.oEndPos.nX = Image.oPosition.nX + m_nImgWidth;
  174. Image.oPosition.nZ = Image.oEndPos.nZ = 0;
  175. while(Image.oEndPos.nX < Shadow.oEndPos.nX)
  176. {
  177. Image.oPosition.nY = m_pMenu->nY;
  178. Image.oEndPos.nY = Image.oPosition.nY + m_nImgHeight;
  179. g_pRepresentShell->DrawPrimitives(1, &Image, RU_T_IMAGE, true);
  180. Image.oEndPos.nY = m_pMenu->nY + m_nMenuHeight;
  181. Image.oPosition.nY = Image.oEndPos.nY - m_nImgHeight;
  182. g_pRepresentShell->DrawPrimitives(1, &Image, RU_T_IMAGE, true);
  183. Image.oPosition.nX += m_nImgWidth;
  184. Image.oEndPos.nX += m_nImgWidth;
  185. };
  186. if (Image.oPosition.nX < Shadow.oEndPos.nX)
  187. {
  188. Image.oEndPos.nX = Shadow.oEndPos.nX;
  189. Image.oImgLTPos.nX = 0;
  190. Image.oImgLTPos.nY = 0;
  191. Image.oImgRBPos.nX = Image.oEndPos.nX - Image.oPosition.nX;
  192. Image.oImgRBPos.nY = m_nImgHeight;
  193. Image.oPosition.nY = m_pMenu->nY;
  194. Image.oEndPos.nY = Image.oPosition.nY + m_nImgHeight;
  195. g_pRepresentShell->DrawPrimitives(1, &Image, RU_T_IMAGE_PART, true);
  196. Image.oEndPos.nY = m_pMenu->nY + m_nMenuHeight;
  197. Image.oPosition.nY = Image.oEndPos.nY - m_nImgHeight;
  198. g_pRepresentShell->DrawPrimitives(1, &Image, RU_T_IMAGE_PART, true);
  199. }
  200. }
  201. KRULine Lines[2];
  202. if (m_pMenu->uBorderLineColor)
  203. {
  204. //绘制左右两侧的边线
  205. Lines[0].Color.Color_dw = m_pMenu->uBorderLineColor;
  206. Lines[0].oPosition.nX = Shadow.oPosition.nX - 1;
  207. Lines[0].oPosition.nY = m_pMenu->nY;
  208. Lines[0].oEndPos.nX = Lines[0].oPosition.nX;
  209. Lines[0].oEndPos.nY = m_pMenu->nY + m_nMenuHeight;
  210. Lines[0].oEndPos.nZ = Lines[0].oPosition.nZ = 0;
  211. Lines[1].Color.Color_dw = Lines[0].Color.Color_dw;
  212. Lines[1].oPosition.nX = Shadow.oEndPos.nX;
  213. Lines[1].oPosition.nY = Lines[0].oPosition.nY;
  214. Lines[1].oEndPos.nX   = Lines[1].oPosition.nX;
  215. Lines[1].oEndPos.nY   = Lines[0].oEndPos.nY;
  216. Lines[1].oEndPos.nZ   = Lines[1].oPosition.nZ = 0;
  217. g_pRepresentShell->DrawPrimitives(2, &Lines[0], RU_T_LINE, true);
  218. }
  219. if (m_pMenu->usMenuFlag & PM_F_HAVE_ITEM_SEPARATOR)
  220. {
  221. Lines[0].oPosition.nX = Shadow.oPosition.nX;
  222. Lines[0].oEndPos.nX = Shadow.oEndPos.nX;
  223. Lines[0].oEndPos.nZ = Lines[0].oPosition.nZ = 0;
  224. Lines[0].Color.Color_dw = m_pMenu->uBorderLineColor;
  225. }
  226. //绘制非选中的菜单项
  227. int nTextStartX = Shadow.oPosition.nX + m_pMenu->nItemTitleIndent;
  228. for (char i = 0; i < m_pMenu->nNumItem; i++)
  229. {
  230. Shadow.oEndPos.nY = Shadow.oPosition.nY + m_pMenu->nItemHeight;
  231. if (m_pMenu->usMenuFlag & PM_F_HAVE_ITEM_SEPARATOR)
  232. {
  233. Shadow.oEndPos.nY --;
  234. Lines[0].oEndPos.nY = Lines[0].oPosition.nY = Shadow.oPosition.nY - 1;
  235. g_pRepresentShell->DrawPrimitives(1, &Lines[0], RU_T_LINE, true);
  236. }
  237. if (i != m_pMenu->nSelectedItem)
  238. {
  239. Shadow.Color.Color_dw = m_pMenu->Items[i].uBgColor;
  240. g_pRepresentShell->DrawPrimitives(1, &Shadow, RU_T_SHADOW, true);
  241. if (m_pMenu->uTextColor)
  242. {
  243. KOutputTextParam param;
  244. param.nX = nTextStartX;
  245. param.nY = Shadow.oPosition.nY + m_pMenu->byItemTitleUpSpace;
  246. param.nZ = TEXT_IN_SINGLE_PLANE_COORD;
  247. param.nSkipLine = 0;
  248. param.nNumLine = m_pMenu->nItemHeight / m_pMenu->byFontSize + 1;
  249. param.Color = m_pMenu->uTextColor;
  250. param.BorderColor = m_pMenu->uTextBorderColor;
  251. param.nVertAlign = 1;
  252. if ((m_pMenu->usMenuFlag & PM_F_TAB_SPLIT_ITEM_TEXT) == 0)
  253. {
  254. g_pRepresentShell->OutputRichText(m_pMenu->byFontSize, &param,
  255. m_pMenu->Items[i].szData, m_pMenu->Items[i].uDataLen);
  256. }
  257. else
  258. {
  259. OutputTabSplitText(m_pMenu->Items[i].szData, m_pMenu->Items[i].uDataLen,
  260. m_pMenu->nItemWidth, m_pMenu->byFontSize, &param);
  261. }
  262. }
  263. }
  264. Shadow.oPosition.nY += m_pMenu->nItemHeight;
  265. }
  266. if (m_pMenu->usMenuFlag & PM_F_HAVE_ITEM_SEPARATOR)
  267. {
  268. Lines[0].oEndPos.nY = Lines[0].oPosition.nY = Shadow.oPosition.nY - 1;
  269. g_pRepresentShell->DrawPrimitives(1, &Lines[0], RU_T_LINE, true);
  270. }
  271. //绘制选中的菜单项
  272. if (m_pMenu->nSelectedItem >= 0)
  273. {
  274. Shadow.oPosition.nY -= m_pMenu->nItemHeight * (m_pMenu->nNumItem - m_pMenu->nSelectedItem);
  275. Shadow.oEndPos.nY = Shadow.oPosition.nY + m_pMenu->nItemHeight;
  276. if (m_pMenu->uSelItemBgColor)
  277. Shadow.Color.Color_dw = m_pMenu->uSelItemBgColor;
  278. else
  279. Shadow.Color.Color_dw = m_pMenu->Items[m_pMenu->nSelectedItem].uBgColor;
  280. if (m_pMenu->usMenuFlag & PM_F_ZOOM_SELECTED_ITEM)
  281. {
  282. Shadow.oPosition.nX -= 4;
  283. Shadow.oEndPos.nX += 4;
  284. Shadow.oPosition.nY -= 4;
  285. if (m_pMenu->usMenuFlag & PM_F_HAVE_ITEM_SEPARATOR)
  286. Shadow.oEndPos.nY += 3;
  287. else
  288. Shadow.oEndPos.nY += 4;
  289. }
  290. g_pRepresentShell->DrawPrimitives(1, &Shadow, RU_T_SHADOW, true);
  291. KOutputTextParam param;
  292. if (m_pMenu->uSelTextColor)
  293. {
  294. param.Color = m_pMenu->uSelTextColor;
  295. param.BorderColor = m_pMenu->uSelTextBorderColor;
  296. }
  297. else
  298. {
  299. param.Color = m_pMenu->uTextColor;
  300. param.BorderColor = m_pMenu->uTextBorderColor;
  301. }
  302. if (param.Color)
  303. {
  304. if (m_pMenu->usMenuFlag & PM_F_ZOOM_SELECTED_ITEM)
  305. Shadow.oPosition.nY += 4;
  306. param.nX = nTextStartX;
  307. param.nY = Shadow.oPosition.nY + m_pMenu->byItemTitleUpSpace;
  308. param.nZ = TEXT_IN_SINGLE_PLANE_COORD;
  309. param.nSkipLine = 0;
  310. param.nNumLine = m_pMenu->nItemHeight / m_pMenu->byFontSize + 1;
  311. param.nVertAlign = 1;
  312. if ((m_pMenu->usMenuFlag & PM_F_TAB_SPLIT_ITEM_TEXT) == 0)
  313. {
  314. g_pRepresentShell->OutputRichText(m_pMenu->byFontSize, &param,
  315. m_pMenu->Items[m_pMenu->nSelectedItem].szData,
  316. m_pMenu->Items[m_pMenu->nSelectedItem].uDataLen);
  317. }
  318. else
  319. {
  320. OutputTabSplitText(m_pMenu->Items[m_pMenu->nSelectedItem].szData,
  321. m_pMenu->Items[m_pMenu->nSelectedItem].uDataLen,
  322. m_pMenu->nItemWidth, m_pMenu->byFontSize, &param);
  323. }
  324. }
  325. if (m_pMenu->uBorderLineColor)
  326. {
  327. KRURect Rect;
  328. Rect.Color.Color_dw = m_pMenu->uBorderLineColor;
  329. Rect.oPosition.nX = Shadow.oPosition.nX - 1;
  330. Rect.oEndPos.nX = Shadow.oEndPos.nX;
  331. Rect.oPosition.nY = Shadow.oPosition.nY - 1;
  332. Rect.oEndPos.nY = Shadow.oEndPos.nY;
  333. if (m_pMenu->usMenuFlag & PM_F_HAVE_ITEM_SEPARATOR)
  334. Rect.oEndPos.nY--;
  335. g_pRepresentShell->DrawPrimitives(1, &Rect, RU_T_RECT, true);
  336. }
  337. }
  338. }
  339. //窗口函数
  340. int KPopupMenu::HandleInput(unsigned int uMsg, unsigned int uParam, int nParam)
  341. {
  342. int nRet = 0;
  343. if (m_pMenu)
  344. {
  345. switch(uMsg)
  346. {
  347. case WM_KEYDOWN:
  348. if (uParam == VK_ESCAPE)
  349. {
  350. Cancel();
  351. nRet = 1;
  352. }
  353. else if (uParam == VK_DOWN)
  354. {
  355. nRet = SelectItem(m_pMenu->nSelectedItem + 1, false);
  356. }
  357. else if (uParam == VK_UP)
  358. {
  359. nRet = SelectItem(m_pMenu->nSelectedItem - 1, false);
  360. }
  361. else if (uParam == VK_RETURN)
  362. {
  363. nRet = SelectItem(m_pMenu->nSelectedItem, true);
  364. }
  365. break;
  366. default:
  367. if ((uMsg >= WM_MOUSEFIRST && uMsg <= WM_MOUSELAST) || uMsg == WM_MOUSEHOVER)
  368. {
  369. if (uMsg == WM_MOUSEMOVE)
  370. SelectItem(LOWORD(nParam), HIWORD(nParam), false);
  371. else if (uMsg == WM_LBUTTONDOWN)
  372. SelectItem(LOWORD(nParam), HIWORD(nParam), true);
  373. nRet = true;
  374. }
  375. break;
  376. }
  377. }
  378. return nRet;
  379. }
  380. bool KPopupMenu::SelectItem(int nIndex, bool bApply)
  381. {
  382. bool bRet = false;
  383. if (nIndex < 0 || nIndex >= m_pMenu->nNumItem)
  384. return bRet;
  385. unsigned int nMID = WND_M_MENUITEM_SELECTED;
  386. m_pMenu->nSelectedItem = nIndex;
  387. bRet = true;
  388. if (bApply)
  389. {
  390. KPopupMenuData* pMenu = m_pMenu;
  391. short nID = -1;
  392. if (pMenu->nSelectedItem >= 0)
  393. nID = pMenu->Items[pMenu->nSelectedItem].uID;
  394. KWndWindow* pCaller = m_pCaller;
  395. unsigned int uCallerParam = m_uCallerParam;
  396. if (!(m_pMenu && (m_pMenu->usMenuFlag & PM_F_CANCEL_BY_CALLER)))
  397. Cancel();
  398. if (pCaller)
  399. {
  400. pCaller->WndProc(nMID, (DWORD)pCaller, MAKELONG(nID, uCallerParam));
  401. }
  402. }
  403. return bRet;
  404. }
  405. bool KPopupMenu::SelectItem(int x, int y, bool bApply)
  406. {
  407. bool bRet = false;
  408. unsigned int nMID = WND_M_MENUITEM_SELECTED;
  409. m_pMenu->nSelectedItem = -1;
  410. if (x >= m_pMenu->nX && y >= m_pMenu->nY &&
  411. x < m_pMenu->nX + m_pMenu->nItemWidth &&
  412. y < m_pMenu->nY + m_nMenuHeight)
  413. {
  414. if (m_pMenu->usMenuFlag & PM_F_HAVE_HEAD_TAIL_IMG)
  415. y -= m_nImgHeight;
  416. if (y > m_pMenu->nY)
  417. {
  418. m_pMenu->nSelectedItem = (y - m_pMenu->nY) / m_pMenu->nItemHeight;
  419. if (m_pMenu->nSelectedItem >= m_pMenu->nNumItem)
  420. m_pMenu->nSelectedItem = -1;
  421. }
  422. if (m_pMenu->nItemRightWidth > 0)
  423. {
  424. if ((x - m_pMenu->nX) >= m_pMenu->nItemWidth - m_pMenu->nItemRightWidth)
  425. nMID = WND_M_MENUITEMRIGHT_SELECTED;
  426. }
  427. bRet = true;
  428. }
  429. if (bApply)
  430. {
  431. KPopupMenuData* pMenu = m_pMenu;
  432. short nID = -1;
  433. if (pMenu->nSelectedItem >= 0)
  434. nID = pMenu->Items[pMenu->nSelectedItem].uID;
  435. KWndWindow* pCaller = m_pCaller;
  436. unsigned int uCallerParam = m_uCallerParam;
  437. if (!(m_pMenu && (m_pMenu->usMenuFlag & PM_F_CANCEL_BY_CALLER)))
  438. Cancel();
  439. if (pCaller)
  440. {
  441. pCaller->WndProc(nMID, (DWORD)pCaller, MAKELONG(nID, uCallerParam));
  442. }
  443. }
  444. return bRet;
  445. }
  446. void KPopupMenu::Cancel()
  447. {
  448. if (m_pMenu && (m_pMenu->usMenuFlag & PM_F_AUTO_DEL_WHEN_HIDE))
  449. {
  450. free(m_pMenu);
  451. }
  452. m_pMenu = NULL;
  453. m_pCaller = NULL;
  454. }
  455. void KPopupMenu::InitMenuData(KPopupMenuData* pMenu, int nNumItem)
  456. {
  457. if (pMenu == NULL || nNumItem < 1)
  458. return;
  459. pMenu->usMenuFlag = 0;
  460. if (m_uDefBorderLineColor)
  461. pMenu->usMenuFlag |= PM_F_HAVE_ITEM_SEPARATOR;
  462. pMenu->byFontSize = 12;
  463. pMenu->nItemHeight = MENU_ITEM_DEFAULT_HEIGHT;
  464. pMenu->nItemTitleIndent = MENU_ITEM_DEFAULT_INDENT;
  465. pMenu->byItemTitleUpSpace = MENU_ITEM_DEFAULT_TITLEUPSPACE;
  466. pMenu->nItemWidth = MENU_ITEM_DEFAULT_WIDTH;
  467. pMenu->nItemRightWidth = 0;
  468. pMenu->nNumItem = nNumItem;
  469. pMenu->nSelectedItem = -1;
  470. pMenu->nX = MENU_DEFAULT_POS;
  471. pMenu->nY = MENU_DEFAULT_POS;
  472. pMenu->nXX = MENU_DEFAULT_POS;
  473. pMenu->nYY = MENU_DEFAULT_POS;
  474. pMenu->uBorderLineColor = m_uDefBorderLineColor;
  475. pMenu->uSelItemBgColor = m_uDefSelItemBgColor;
  476. pMenu->uSelTextColor   = m_uDefSelTextColor;
  477. pMenu->uSelTextBorderColor   = m_uDefSelTextBorderColor;
  478. pMenu->uTextColor      = m_uDefTextColor;
  479. pMenu->uTextBorderColor      = m_uDefTextBorderColor;
  480. for (int i = 0; i < nNumItem; i++)
  481. {
  482. pMenu->Items[i].szData[0] = 0;
  483. pMenu->Items[i].uDataLen = 0;
  484. pMenu->Items[i].uBgColor = m_uDefItemBgColor;
  485. pMenu->Items[i].uID = i;
  486. }
  487. }
  488. //载入界面方案
  489. void KPopupMenu::LoadTheme(const char* pScheme)
  490. {
  491. if (pScheme == NULL)
  492. return;
  493. char Buff[128];
  494. KIniFile Ini;
  495. sprintf(Buff, "%s\%s", pScheme, SCHEME_INI);
  496. if (Ini.Load(Buff))
  497. {
  498. int nValue;
  499. Ini.GetInteger("Main", "ImgWidth",  0, &nValue);
  500. if(nValue >= 0)
  501. m_nImgWidth = nValue;
  502. else
  503. m_nImgWidth = 0;
  504. Ini.GetInteger("Main", "ImgHeight", 0, &nValue);
  505. if(nValue >= 0)
  506. m_nImgHeight = nValue;
  507. else
  508. m_nImgHeight = 0;
  509. Ini.GetInteger("Main", "Indent",    0, &nValue);
  510. m_nIndent = nValue;
  511. Ini.GetInteger("Main", "Frame", 0, &nValue);
  512. m_nFrame = nValue;
  513. Ini.GetString("Main", "Image", "" , m_szImage, sizeof(m_szImage));
  514. if (Ini.GetString("Menu", "BorderLineColor", "0,0,0", Buff, sizeof(Buff)))
  515. m_uDefBorderLineColor = GetColor(Buff);
  516. else
  517. m_uDefBorderLineColor = 0;
  518. if (Ini.GetString("Menu", "ItemBgColor", "0,0,0", Buff, sizeof(Buff)))
  519. m_uDefItemBgColor =  (GetColor(Buff) & 0xffffff) | 0x0a000000;
  520. else
  521. m_uDefItemBgColor = 0;
  522. if (Ini.GetString("Menu", "SelItemBgColor", "0,0,0", Buff, sizeof(Buff)))
  523. m_uDefSelItemBgColor =  (GetColor(Buff) & 0xffffff) | 0x0a000000;
  524. else
  525. m_uDefSelItemBgColor = 0;
  526. if (Ini.GetString("Menu", "TextColor", "0,0,0", Buff, sizeof(Buff)))
  527. m_uDefTextColor =  GetColor(Buff);
  528. else
  529. m_uDefTextColor = 0;
  530. if (Ini.GetString("Menu", "TextBorderColor", "0,0,0", Buff, sizeof(Buff)))
  531. m_uDefTextBorderColor =  GetColor(Buff);
  532. else
  533. m_uDefTextBorderColor = 0;
  534. if (Ini.GetString("Menu", "SelTextColor", "0,0,0", Buff, sizeof(Buff)))
  535. m_uDefSelTextColor =  GetColor(Buff);
  536. else
  537. m_uDefSelTextColor = 0;
  538. if (Ini.GetString("Menu", "SelTextBorderColor", "0,0,0", Buff, sizeof(Buff)))
  539. m_uDefSelTextBorderColor =  GetColor(Buff);
  540. else
  541. m_uDefSelTextBorderColor = 0;
  542. }
  543. }