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

模拟服务器

开发平台:

C/C++

  1. /*****************************************************************************************
  2. // 界面窗口体系结构--滚动条窗口
  3. // Copyright : Kingsoft 2002
  4. // Author :   Wooy(Wu yue)
  5. // CreateTime: 2002-7-23
  6. *****************************************************************************************/
  7. #include "KWin32.h"
  8. #include "KIniFile.h"
  9. #include "../Elem/WndMessage.h"
  10. #include "WndScrollBar.h"
  11. #include "Wnds.h"
  12. #include "../../../Represent/iRepresent/iRepresentShell.h"
  13. extern iRepresentShell* g_pRepresentShell;
  14. //--------------------------------------------------------------------------
  15. // 功能:构造函数
  16. //--------------------------------------------------------------------------
  17. KWndScrollBar::KWndScrollBar()
  18. {
  19. m_Flag = 0;
  20. m_nMinValue = 0;
  21. m_nMaxValue = 0;
  22. m_nCurValue = 0;
  23. // m_nLineSize = 0;
  24. m_nPageSize = 0;
  25. m_nMinPosition  = 0;
  26. m_nMaxPosition  = 0;
  27. m_nImgRange = 0;
  28. AddChild(&m_SlideBtn);
  29. }
  30. void KWndScrollBar::Clone(KWndScrollBar* pCopy)
  31. {
  32. if (pCopy)
  33. {
  34. KWndImage::Clone(pCopy);
  35. pCopy->m_nMinValue = m_nMinValue;
  36. pCopy->m_nMaxValue = m_nMaxValue;
  37. pCopy->m_nCurValue = m_nMinValue - 1;
  38. pCopy->m_nPageSize = m_nPageSize;
  39. pCopy->m_nMinPosition = m_nMinPosition;
  40. pCopy->m_nMaxPosition = m_nMaxPosition;
  41. pCopy->m_Flag = (m_Flag & (~WNDSCROLL_F_DRAGGING_SLIDE));
  42. pCopy->m_nImgRange = m_nImgRange;
  43. m_SlideBtn.Clone(&pCopy->m_SlideBtn);
  44. pCopy->SetScrollPos(m_nMinValue);
  45. }
  46. }
  47. //--------------------------------------------------------------------------
  48. // 功能:初始化窗口
  49. //--------------------------------------------------------------------------
  50. int KWndScrollBar::Init(KIniFile* pIniFile, const char* pSection)
  51. {
  52. if (KWndImage::Init(pIniFile, pSection))
  53. {
  54. int nValue;
  55. pIniFile->GetInteger(pSection, "Type", 0, &nValue);
  56. if (nValue)
  57. m_Flag |= WNDSCROLL_ES_VERTICAL;
  58. else
  59. m_Flag &= ~WNDSCROLL_ES_VERTICAL;
  60. pIniFile->GetInteger(pSection, "RepeatImg", 0, &nValue);
  61. m_nImgRange = 0;
  62. if (nValue && g_pRepresentShell)
  63. {
  64. KImageParam Param;
  65. Param.nWidth = 0;
  66. Param.nHeight = 0;
  67. g_pRepresentShell->GetImageParam(m_Image.szImage, &Param, m_Image.nType);
  68. if (m_Flag & WNDSCROLL_ES_VERTICAL)
  69. m_nImgRange = Param.nHeight;
  70. else
  71. m_nImgRange = Param.nWidth;
  72. }
  73. pIniFile->GetInteger(pSection, "Min", 0, &m_nMinValue);
  74. pIniFile->GetInteger(pSection, "Max", 0, &m_nMaxValue);
  75. // pIniFile->GetInteger(pSection, "Position", 0, &m_nCurValue);
  76. // pIniFile->GetInteger(pSection, "LineSize", 1, &m_nLineSize);
  77. pIniFile->GetInteger(pSection, "PageSize", 1, &m_nPageSize);
  78. pIniFile->GetInteger(pSection, "SlideBegin",0, &m_nMinPosition);
  79. pIniFile->GetInteger(pSection, "SlideEnd",  0, &m_nMaxPosition);
  80. char Buffer[128];
  81. sprintf(Buffer, "%s_Btn", pSection);
  82. m_SlideBtn.Init(pIniFile, Buffer);
  83. SetSlideBtnPos();
  84. return true;
  85. }
  86. return false;
  87. }
  88. //设置窗口大小
  89. void KWndScrollBar::SetSize(int nWidth, int nHeight)
  90. {
  91. if (m_Flag & WNDSCROLL_ES_VERTICAL)
  92. m_nMaxPosition += nHeight - m_Height;
  93. else
  94. m_nMaxPosition += nWidth - m_Height;
  95. if (m_nMaxPosition < m_nMinPosition)
  96. m_nMaxPosition = m_nMinPosition;
  97. KWndImage::SetSize(nWidth, nHeight);
  98. SetSlideBtnPos();
  99. }
  100. //--------------------------------------------------------------------------
  101. // 功能:窗口函数
  102. //--------------------------------------------------------------------------
  103. int KWndScrollBar::WndProc(unsigned int uMsg, unsigned int uParam, int nParam)
  104. {
  105. if (IsDisable())
  106. return KWndImage::WndProc(uMsg, uParam, nParam);
  107. switch (uMsg)
  108. {
  109. case WM_LBUTTONDOWN:
  110. OnLButtonDown(LOWORD(nParam), HIWORD(nParam));
  111. break;
  112. case WM_MOUSEMOVE:
  113. if ((uParam & MK_LBUTTON) &&
  114. (m_Flag & WNDSCROLL_F_DRAGGING_SLIDE))
  115. OnDraggingSlide(LOWORD(nParam), HIWORD(nParam));
  116. break;
  117. case WM_LBUTTONUP:
  118. if (m_Flag & WNDSCROLL_F_DRAGGING_SLIDE)
  119. {
  120. m_Flag &= ~WNDSCROLL_F_DRAGGING_SLIDE;
  121. Wnd_ReleaseCapture();
  122. }
  123. break;
  124. case WND_N_BUTTON_CLICK:
  125. if (m_Flag & WNDSCROLL_F_DRAGGING_SLIDE &&
  126. uParam == (unsigned int)(KWndWindow*)&m_SlideBtn)
  127. {
  128. m_Flag &= ~WNDSCROLL_F_DRAGGING_SLIDE;
  129. Wnd_ReleaseCapture();
  130. }
  131. break;
  132. case WND_N_BUTTON_DOWN:
  133. if (uParam == (unsigned int)(KWndWindow*)&m_SlideBtn)
  134. OnSlideBtnPressed();
  135. break;
  136. default:
  137. return KWndImage::WndProc(uMsg, uParam, nParam);
  138. }
  139. return 0;
  140. }
  141. //窗体绘制
  142. void KWndScrollBar::PaintWindow()
  143. {
  144. KWndWindow::PaintWindow();
  145. if (g_pRepresentShell)
  146. {
  147. m_Image.oPosition.nX = m_nAbsoluteLeft;
  148. m_Image.oPosition.nY = m_nAbsoluteTop;
  149. if (m_nImgRange == 0)
  150. {
  151. g_pRepresentShell->DrawPrimitives(1, &m_Image, RU_T_IMAGE, true);
  152. }
  153. else
  154. {
  155. int* pValue;
  156. int nEnd;
  157. if (m_Flag & WNDSCROLL_ES_VERTICAL)
  158. {
  159. pValue = &m_Image.oPosition.nY;
  160. nEnd = m_nAbsoluteTop + m_Height;
  161. }
  162. else
  163. {
  164. pValue = &m_Image.oPosition.nX;
  165. nEnd = m_nAbsoluteLeft + m_Width;
  166. }
  167. do
  168. {
  169. g_pRepresentShell->DrawPrimitives(1, &m_Image, RU_T_IMAGE, true);
  170. (*pValue) =  (*pValue) + m_nImgRange;
  171. }while((*pValue) < nEnd);
  172. }
  173. }
  174. }
  175. //--------------------------------------------------------------------------
  176. // 功能:设置取值范围
  177. //--------------------------------------------------------------------------
  178. void KWndScrollBar::SetValueRange(int nMinValue,int nMaxValue)
  179. {
  180. if (nMinValue <= nMaxValue)
  181. {
  182. m_nMinValue = nMinValue;
  183. m_nMaxValue = nMaxValue;
  184. SetScrollPos(m_nCurValue);
  185. }
  186. }
  187. //--------------------------------------------------------------------------
  188. // 功能:设置位置
  189. //--------------------------------------------------------------------------
  190. void KWndScrollBar::SetScrollPos(int nPosition)
  191. {
  192. if (nPosition != m_nCurValue)
  193. {
  194. if (nPosition < m_nMinValue)
  195. nPosition = m_nMinValue;
  196. if (nPosition > m_nMaxValue)
  197. nPosition = m_nMaxValue;
  198. if (nPosition != m_nCurValue)
  199. {
  200. m_nCurValue = nPosition;
  201. SetSlideBtnPos();
  202. if (m_pParentWnd)
  203. {
  204. m_pParentWnd->WndProc(WND_N_SCORLLBAR_POS_CHANGED, (unsigned int)(KWndWindow*)this, m_nCurValue);
  205. }
  206. }
  207. }
  208. }
  209. //--------------------------------------------------------------------------
  210. // 功能:设置滑动块窗口位置
  211. //--------------------------------------------------------------------------
  212. void KWndScrollBar::SetSlideBtnPos()
  213. {
  214. int nValueRange = m_nMaxValue - m_nMinValue;
  215. int nSpaceRange = m_nMaxPosition - m_nMinPosition;
  216. if (nValueRange <= 0)
  217. nValueRange = 1;
  218. int Left, Top;
  219. m_SlideBtn.GetPosition(&Left, &Top);
  220. int pos = m_nMinPosition + m_nCurValue * nSpaceRange / nValueRange;
  221. if (pos < m_nMinPosition)
  222. pos  = m_nMinPosition;
  223. if (pos > m_nMaxPosition)
  224. pos = m_nMaxPosition;
  225. int nWidth, nHeight;
  226. m_SlideBtn.GetSize(&nWidth, &nHeight);
  227. if ((m_Flag & WNDSCROLL_ES_VERTICAL) == 0)
  228. Left = pos - nWidth / 2;
  229. else
  230. Top = pos - nHeight / 2;
  231. m_SlideBtn.SetPosition(Left, Top);
  232. }
  233. //--------------------------------------------------------------------------
  234. // 功能:响应鼠标左键按下
  235. //--------------------------------------------------------------------------
  236. void KWndScrollBar::OnLButtonDown(int x,int y)
  237. {
  238. int Left, Top, Width, Height;
  239. m_SlideBtn.GetAbsolutePos(&Left, &Top);
  240. m_SlideBtn.GetSize(&Width, &Height);
  241. if ((m_Flag & WNDSCROLL_ES_VERTICAL) == 0) // Horizontal
  242. {
  243. if (x < Left + Width / 2)
  244. SetScrollPos(m_nCurValue - m_nPageSize);
  245. else
  246. SetScrollPos(m_nCurValue + m_nPageSize);
  247. }
  248. else
  249. {
  250. if (y < Top + Height / 2)
  251. SetScrollPos(m_nCurValue - m_nPageSize);
  252. else
  253. SetScrollPos(m_nCurValue + m_nPageSize);
  254. }
  255. }
  256. int KWndScrollBar::ScrollLine(bool bPre)
  257. {
  258. int nPos = m_nCurValue + (bPre ? (-1) : 1);
  259. SetScrollPos(nPos);
  260. return m_nCurValue;
  261. }
  262. int KWndScrollBar::ScrollPage(bool bPre)
  263. {
  264. int nPos = m_nCurValue + (bPre ? (-m_nPageSize) : m_nPageSize);
  265. SetScrollPos(nPos);
  266. return m_nCurValue;
  267. }
  268. //--------------------------------------------------------------------------
  269. // 功能:响应滑动按钮被按下
  270. //--------------------------------------------------------------------------
  271. void KWndScrollBar::OnSlideBtnPressed()
  272. {
  273. Wnd_SetCapture(this);
  274. m_Flag |= WNDSCROLL_F_DRAGGING_SLIDE;
  275. }
  276. //--------------------------------------------------------------------------
  277. // 功能:正在拖动滑动按钮
  278. //--------------------------------------------------------------------------
  279. void KWndScrollBar::OnDraggingSlide(int x, int y)
  280. {
  281. int nValueRange = m_nMaxValue - m_nMinValue;
  282. int nSpaceRange = m_nMaxPosition - m_nMinPosition;
  283. if (nSpaceRange <= 0)
  284. nSpaceRange = 1;
  285. int nValue = m_nMinValue;
  286. if (nValueRange != 0)
  287. {
  288. if ((m_Flag & WNDSCROLL_ES_VERTICAL) == 0)
  289. nValue += (x - m_nAbsoluteLeft - m_nMinPosition + nSpaceRange / nValueRange / 2) * nValueRange / nSpaceRange;
  290. else
  291. nValue += (y - m_nAbsoluteTop - m_nMinPosition + nSpaceRange / nValueRange / 2) * nValueRange / nSpaceRange;
  292. }
  293. SetScrollPos(nValue);
  294. }
  295. int KWndScrollBar::GetMinHeight()
  296. {
  297. int nHeight = 0;
  298. m_SlideBtn.GetSize(NULL, &nHeight);
  299. return max(nHeight, nHeight + m_nMinPosition + m_Height - m_nMaxPosition);
  300. }