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

模拟服务器

开发平台:

C/C++

  1. /*****************************************************************************************
  2. // 界面窗口体系结构--按键窗口
  3. // Copyright : Kingsoft 2002
  4. // Author :   Wooy(Wu yue)
  5. // CreateTime: 2002-7-22
  6. *****************************************************************************************/
  7. #include "KWin32.h"
  8. #include "KIniFile.h"
  9. #include "../Elem/WndMessage.h"
  10. #include "WndButton.h"
  11. #include "Wnds.h"
  12. #include "MouseHover.h"
  13. #include "../UiSoundSetting.h"
  14. #include "../../../Engine/src/Text.h"
  15. #include "../../../Represent/iRepresent/iRepresentShell.h"
  16. extern iRepresentShell* g_pRepresentShell;
  17. KWndButton*  KWndButton::m_pPressedDownBtn = NULL;
  18. unsigned int KWndButton::ms_uBtnTipTextColor = 0xffffffff; //按钮提示名称文字的颜色
  19. int  KWndButton::ms_nDisableBtnTip   = false; //是否静止按钮的提示文字
  20. //设置按钮提示名称文字的颜色
  21. void KWndButton::SetAllButtonTipTextColor(unsigned int uColor)
  22. {
  23. ms_uBtnTipTextColor = uColor;
  24. }
  25. //禁止/允许按钮的提示文字
  26. void KWndButton::EnableAllButtonTip(int bEnable)
  27. {
  28. ms_nDisableBtnTip = !bEnable;
  29. }
  30. //--------------------------------------------------------------------------
  31. // 功能:构造函数
  32. //--------------------------------------------------------------------------
  33. KWndButton::KWndButton()
  34. {
  35. m_Flag  = 0;
  36. m_nUpFrame   = 0;
  37. m_nDownFrame = 0;
  38. m_nCheckOverFrame =0;
  39. m_nOverStartFrame = 0;
  40. m_nDisableFrame = -1;
  41. m_szTip[0] = 0;
  42. m_nTipLen = 0;
  43. }
  44. void KWndButton::Clone(KWndButton* pCopy)
  45. {
  46. if (pCopy)
  47. {
  48. KWndImage::Clone(pCopy);
  49. pCopy->m_nUpFrame = m_nUpFrame;
  50. pCopy->m_nDownFrame = m_nDownFrame;
  51. pCopy->m_nDisableFrame = m_nDisableFrame;
  52. pCopy->m_nOverStartFrame= m_nOverStartFrame;
  53. pCopy->SetFrame(m_nUpFrame);
  54. pCopy->m_Flag = m_Flag & WNDBTN_ES_FILTER;
  55. memcpy(pCopy->m_szTip, m_szTip, sizeof(m_szTip));
  56. pCopy->m_nTipLen = m_nTipLen;
  57. }
  58. }
  59. //--------------------------------------------------------------------------
  60. // 功能:初始化窗口
  61. //--------------------------------------------------------------------------
  62. int KWndButton::Init(KIniFile* pIniFile, const char* pSection)
  63. {
  64. if (KWndImage::Init(pIniFile, pSection))
  65. {
  66. int nValue;
  67. pIniFile->GetInteger(pSection, "Up",  0, &nValue);
  68. m_nUpFrame = nValue;
  69. pIniFile->GetInteger(pSection, "Down",1, &nValue);
  70. m_nDownFrame = nValue;
  71. SetFrame((m_Flag & WNDBTN_F_DOWN) ? m_nDownFrame : m_nUpFrame);
  72. pIniFile->GetInteger(pSection, "DisableFrame", -1, &nValue);
  73. m_nDisableFrame = nValue;
  74. if (m_nDisableFrame >= 0 && IsDisable())
  75. SetFrame(m_nDisableFrame);
  76. int bBool = 0;
  77. pIniFile->GetInteger(pSection, "NoOverSound", 0, &bBool);
  78. if (bBool)
  79. m_Flag |= WNDBTN_ES_NO_OVERSOUND;
  80. else
  81. m_Flag &= ~WNDBTN_ES_NO_OVERSOUND;
  82. pIniFile->GetInteger(pSection, "Over", 0, &bBool);
  83. if (bBool)
  84. {
  85. m_Flag |= WNDBTN_ES_ANIMATION;
  86. pIniFile->GetInteger(pSection, "OverFrame", 2, &nValue);
  87. m_nOverStartFrame = nValue;
  88. }
  89. else
  90. m_Flag &= ~WNDBTN_ES_ANIMATION;
  91. pIniFile->GetInteger(pSection, "CheckBox", 0, &nValue);
  92. if (nValue)
  93. {
  94. m_Flag |= WNDBTN_ES_CHECKBOX;
  95. pIniFile->GetInteger(pSection, "CheckOver", 0, &nValue);
  96. m_nCheckOverFrame = nValue;
  97. }
  98. else
  99. m_Flag &= ~WNDBTN_ES_CHECKBOX;
  100. pIniFile->GetInteger(pSection, "SendHoldMsg", 0, &nValue);
  101. if (nValue)
  102. m_Flag |= WNDBTN_ES_SEND_HOLD_MSG;
  103. else
  104. m_Flag &= ~WNDBTN_ES_SEND_HOLD_MSG;
  105. m_nTipLen = 0;
  106. if (pIniFile->GetString(pSection, "Tip", "", m_szTip, sizeof(m_szTip)))
  107. {
  108. m_nTipLen = TEncodeText(m_szTip, strlen(m_szTip));
  109. }
  110. return true;
  111. }
  112. return false;
  113. }
  114. //--------------------------------------------------------------------------
  115. // 功能:按钮是否出于按下状态
  116. //--------------------------------------------------------------------------
  117. int KWndButton::IsButtonChecked()
  118. {
  119. return (m_Flag & WNDBTN_F_CHECKED);
  120. }
  121. //--------------------------------------------------------------------------
  122. // 功能:设置按钮的按下状态
  123. //--------------------------------------------------------------------------
  124. void KWndButton::CheckButton(int bChecked)
  125. {
  126. if (bChecked)
  127. {
  128. m_Flag |= WNDBTN_F_CHECKED;
  129. SetFrame(m_nDownFrame);
  130. }
  131. else
  132. {
  133. m_Flag &= ~WNDBTN_F_CHECKED;
  134. SetFrame(m_nUpFrame);
  135. }
  136. }
  137. int KWndButton::IsButtonActive()
  138. {
  139. return (m_Flag & WNDBTN_F_OVER);
  140. }
  141. //--------------------------------------------------------------------------
  142. // 功能:窗口函数(处理消息)
  143. //--------------------------------------------------------------------------
  144. int KWndButton::WndProc(unsigned int uMsg, unsigned int uParam, int nParam)
  145. {
  146. if (IsDisable())
  147. return KWndWindow::WndProc(uMsg, uParam, nParam);
  148. switch(uMsg)
  149. {
  150. case WM_LBUTTONUP:
  151. OnLBtnUp();
  152. break;
  153. case WM_LBUTTONDOWN:
  154. OnLBtnDown(false);
  155. break;
  156. case WND_M_MOUSE_ENTER:
  157. case WM_MOUSEMOVE:
  158. if (uParam & MK_LBUTTON)
  159. OnLBtnDownMove();
  160. if ((m_Flag & WNDBTN_F_OVER) == 0 && m_pPressedDownBtn != this)
  161. {
  162. if (m_pParentWnd)
  163. m_pParentWnd->WndProc(WND_N_BUTTON_OVER, (unsigned int)(KWndWindow*)this, 0);
  164. m_Flag |= WNDBTN_F_OVER;
  165. if ((m_Flag & WNDBTN_ES_NO_OVERSOUND) == 0)
  166. UiSoundPlay(UI_SI_OVER_OUTGAME_WND_BTN);
  167. if (m_Flag & WNDBTN_ES_ANIMATION)
  168. {
  169. if ((m_Flag & WNDBTN_F_DOWN) == 0)
  170. SetFrame(m_nOverStartFrame);
  171. else if (m_Flag & WNDBTN_ES_CHECKBOX)
  172. SetFrame(m_nCheckOverFrame);
  173. }
  174. }
  175. break;
  176. case WND_M_MOUSE_LEAVE:
  177. m_Flag &= ~WNDBTN_F_OVER;
  178. if (m_pPressedDownBtn == this && m_Flag & WNDBTN_F_DOWN)
  179. {
  180. m_Flag &= ~WNDBTN_F_DOWN;
  181. SetFrame(m_nUpFrame);
  182. }
  183. else if (m_Flag & WNDBTN_ES_ANIMATION)
  184. SetFrame((m_Flag & WNDBTN_F_DOWN) ? m_nDownFrame : m_nUpFrame);
  185. if (g_MouseOver.IsMoseHoverWndObj((void*)(KWndWindow*)this, 0))
  186. g_MouseOver.CancelMouseHoverInfo();
  187. KWndWindow::WndProc(uMsg, uParam, nParam);
  188. break;
  189. case WM_MOUSEHOVER:
  190. if (m_pPressedDownBtn == this &&
  191. (m_Flag & WNDBTN_ES_SEND_HOLD_MSG) && m_pParentWnd)
  192. {
  193. m_pParentWnd->WndProc(WND_N_BUTTON_HOLD, (unsigned int)(KWndWindow*)this, 0);
  194. }
  195. else if (ms_nDisableBtnTip == false && m_szTip[0] && !g_MouseOver.IsMoseHoverWndObj((void*)(KWndWindow*)this, 0))
  196. {
  197. char szTip[64];
  198. int nTipLen = GetToolTipInfo(szTip, 63);
  199. szTip[nTipLen] = 0;
  200. g_MouseOver.SetMouseHoverInfo((void*)(KWndWindow*)this, 0,
  201. LOWORD(nParam), HIWORD(nParam), false, true);
  202. g_MouseOver.SetMouseHoverTitle(szTip, nTipLen, ms_uBtnTipTextColor);
  203. }
  204. break;
  205. case WM_LBUTTONDBLCLK:
  206. OnLBtnDown(true);
  207. break;
  208. default:
  209. return KWndWindow::WndProc(uMsg, uParam, nParam);
  210. }
  211. return 0;
  212. }
  213. int KWndButton::GetToolTipInfo(char* szTip, int nMax)
  214. {
  215. int nTipLen = min(m_nTipLen, nMax);
  216. memcpy(szTip, m_szTip, nTipLen);
  217. const char* pKey = GetShortKey();
  218. if (pKey && pKey[0] != 0 && (nTipLen + (int)strlen(pKey)) < nMax)
  219. {
  220. szTip[nTipLen++] =  '(';
  221. strcpy(szTip + nTipLen, pKey);
  222. nTipLen += strlen(pKey);
  223. szTip[nTipLen++] =  ')';
  224. }
  225. return nTipLen;
  226. }
  227. int KWndButton::SetToolTipInfo(char* szTip, int nMax)
  228. {
  229. m_nTipLen = min(nMax, sizeof(m_szTip) - 1);
  230. memcpy(m_szTip, szTip, m_nTipLen);
  231. m_szTip[m_nTipLen] = 0;
  232. m_nTipLen = TEncodeText(m_szTip, strlen(m_szTip));
  233. return m_nTipLen;
  234. }
  235. //--------------------------------------------------------------------------
  236. // 功能:窗体绘制
  237. //--------------------------------------------------------------------------
  238. void KWndButton::PaintWindow()
  239. {
  240. if ((m_Flag & (WNDBTN_F_OVER | WNDBTN_ES_ANIMATION | WNDBTN_ES_CHECKBOX)) == (WNDBTN_F_OVER | WNDBTN_ES_ANIMATION))
  241. {
  242. NextFrame();
  243. if (m_Image.nFrame < m_nOverStartFrame)
  244. SetFrame(m_nOverStartFrame);
  245. }
  246. KWndImage::PaintWindow();
  247. #ifdef _DEBUG
  248. if (WND_SHOW_DEBUG_FRAME_TEXT && g_pRepresentShell &&
  249. m_Image.szImage[0] == 0 && (m_Flag & WNDBTN_F_DOWN) &&
  250. (WNDBTN_ES_CHECKBOX & m_Flag))
  251. {
  252. int x = m_nAbsoluteLeft + strlen(m_Caption) * 8;
  253. g_pRepresentShell->OutputText(16, "[C]", 3, x + 1, m_nAbsoluteTop + 1, 0xFF000000, 0);
  254. g_pRepresentShell->OutputText(16, "[C]", 3, x, m_nAbsoluteTop, 0xFFFFFFFF, 0);
  255. }
  256. #endif
  257. }
  258. //--------------------------------------------------------------------------
  259. // 功能:响应鼠标左键在此按下
  260. //--------------------------------------------------------------------------
  261. void KWndButton::OnLBtnDown(bool bDoubleClick)
  262. {
  263. m_Flag &= ~WNDBTN_F_OVER;
  264. if ((m_Flag & WNDBTN_ES_CHECKBOX) == 0)
  265. m_pPressedDownBtn = this;
  266. else
  267. m_pPressedDownBtn = NULL;
  268. if ((m_Flag & WNDBTN_ES_CHECKBOX) == 0)
  269. {
  270. m_Flag |= WNDBTN_F_DOWN;
  271. SetFrame(m_nDownFrame);
  272. if (m_pParentWnd)
  273. {
  274. m_pParentWnd->WndProc(bDoubleClick ? WND_N_BUTTON_DB_CLICK : WND_N_BUTTON_DOWN,
  275. (unsigned int)(KWndWindow*)this, 0);
  276. }
  277. }
  278. else
  279. {
  280. if (m_Flag & WNDBTN_F_CHECKED)
  281. {
  282. m_Flag &= ~WNDBTN_F_CHECKED;
  283. SetFrame((m_Flag & WNDBTN_ES_ANIMATION) ? m_nOverStartFrame : m_nUpFrame);
  284. }
  285. else
  286. {
  287. m_Flag |= WNDBTN_F_CHECKED;
  288. SetFrame((m_Flag & WNDBTN_ES_ANIMATION) ? m_nCheckOverFrame : m_nDownFrame);
  289. }
  290. OnButtonClick();
  291. if (m_pParentWnd)
  292. m_pParentWnd->WndProc(WND_N_BUTTON_CLICK,
  293. (unsigned int)(KWndWindow*)this, (m_Flag & WNDBTN_F_CHECKED));
  294. }
  295. }
  296. //--------------------------------------------------------------------------
  297. // 功能:响应鼠标左键在此放开
  298. //--------------------------------------------------------------------------
  299. void KWndButton::OnLBtnUp()
  300. {
  301. if (m_pPressedDownBtn == this && (m_Flag & WNDBTN_F_DOWN))
  302. {
  303. m_Flag &= ~WNDBTN_F_DOWN;
  304. SetFrame(m_nUpFrame);
  305. OnButtonClick();
  306. if (m_pParentWnd)
  307. m_pParentWnd->WndProc(WND_N_BUTTON_CLICK, (unsigned int)(KWndWindow*)this, 0);
  308. }
  309. m_pPressedDownBtn = NULL;
  310. }
  311. //--------------------------------------------------------------------------
  312. // 功能:响应鼠标左键按下时的移动
  313. //--------------------------------------------------------------------------
  314. void KWndButton::OnLBtnDownMove()
  315. {
  316. if (m_pPressedDownBtn == this)
  317. {
  318. if ((m_Flag & WNDBTN_F_DOWN) == 0)
  319. {
  320. m_Flag |= WNDBTN_F_DOWN;
  321. SetFrame(m_nDownFrame);
  322. }
  323. }
  324. }
  325. //禁止或者允许使窗口被操作
  326. void KWndButton::Enable(int bEnable)
  327. {
  328. KWndWindow::Enable(bEnable);
  329. if (m_nDisableFrame >= 0)
  330. {
  331. if (bEnable)
  332. SetFrame((m_Flag & WNDBTN_F_DOWN) ? m_nDownFrame : m_nUpFrame);
  333. else
  334. SetFrame(m_nDisableFrame);
  335. }
  336. }
  337. ///////////////////////////////////////////////////////////////////////////////////
  338. KWndImageTextButton::KWndImageTextButton()
  339. {
  340. bPart = true;
  341. }
  342. int KWndImageTextButton::Init(KIniFile* pIniFile, const char* pSection)
  343. {
  344. if (KWndButton::Init(pIniFile, pSection))
  345. {
  346. pIniFile->GetInteger(pSection, "Part", 1, &bPart);
  347. char szName[32];
  348. sprintf(szName, "%s_Image", pSection);
  349. if (bPart)
  350. m_ImagePart.Init(pIniFile, szName);
  351. else
  352. m_Image.Init(pIniFile, szName);
  353. sprintf(szName, "%s_Text", pSection);
  354. m_Text.Init(pIniFile, szName);
  355. if (bPart)
  356. AddChild(&m_ImagePart);
  357. else
  358. AddChild(&m_Image);
  359. AddChild(&m_Text);
  360. m_Text.Enable(false);
  361. m_Image.Enable(false);
  362. m_ImagePart.Enable(false);
  363. return true;
  364. }
  365. return false;
  366. }
  367. void KWndImageTextButton::Set2IntText(int nNumber1, int nNumber2, char Separator)
  368. {
  369. m_Text.Set2IntText(nNumber1, nNumber2, Separator);
  370. }
  371. void KWndImageTextButton::SetIntText(int nNumber, char Separator)
  372. {
  373. m_Text.SetIntText(nNumber, Separator);
  374. }
  375. void KWndImageTextButton::SetText(const char* pText, int nLen) //设置文本文字
  376. {
  377. m_Text.SetText(pText, nLen);
  378. }
  379. int KWndImageTextButton::GetText(char* pBuffer, int nSize) //获取字符串内容
  380. {
  381. return m_Text.GetText(pBuffer, nSize);
  382. }
  383. void KWndImageTextButton::Set2IntValue(int nNumber1, int nNumber2)
  384. {
  385. if (bPart)
  386. m_ImagePart.SetPart(nNumber1, nNumber2);
  387. else
  388. m_Image.SetMoveValue(nNumber1, nNumber2);
  389. }