UIPageControl.cpp 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671
  1. #include "StdAfx.h"
  2. #include "UIPageControl.h"
  3. #pragma warning(disable:4996)
  4. namespace DuiLib
  5. {
  6. IMPLEMENT_DUICONTROL(CPageControlUI)
  7. #define TEXT_MORE _T("...")
  8. #define PAGE_OPT_GROUP _T("PAGE_OPT_GROUP")
  9. DuiLib::CPageControlUI::CPageControlUI()
  10. : m_BtnPrevious(new CButtonUI)
  11. , m_BtnNext(new CButtonUI)
  12. , m_BtnNextMore(new CButtonUI)
  13. , m_BtnGoto(new CButtonUI)
  14. , m_EdtPageNo(new CEditUI)
  15. , m_ConCurSel(nullptr)
  16. , m_nMaxPage(0)
  17. , m_nSelPageNo(-1)
  18. , m_dwHotBkColor(0xffc3c3c3)
  19. , m_dwSelTextColor(0xff00ff00)
  20. , m_dwNormalTextColor(0xff000000)
  21. , m_dwNormalBkColor(0)
  22. , m_dwHotTextColor(0xff000000)
  23. , m_dwSelectedBkColor(0)
  24. , m_nFont(-1)
  25. {
  26. SetPageNoSize();
  27. SetGotoEditSize();
  28. m_BtnPrevious->SetText(_T("<"));
  29. m_BtnPrevious->SetHotBkColor(m_dwHotBkColor);
  30. m_BtnPrevious->OnNotify += MakeDelegate(this, &CPageControlUI::OnBtnClick);
  31. Add(m_BtnPrevious);
  32. m_BtnNext->SetText(_T(">"));
  33. m_BtnNext->SetHotBkColor(m_dwHotBkColor);
  34. m_BtnNext->OnNotify += MakeDelegate(this, &CPageControlUI::OnBtnClick);
  35. Add(m_BtnNext);
  36. m_BtnNextMore->SetText(_T("..."));
  37. m_BtnNextMore->SetHotBkColor(m_dwHotBkColor);
  38. m_BtnNextMore->OnNotify += MakeDelegate(this, &CPageControlUI::OnBtnClick);
  39. Add(m_BtnNextMore);
  40. m_BtnGoto->SetText(_T("Go to"));
  41. m_BtnGoto->SetHotBkColor(m_dwHotBkColor);
  42. m_BtnGoto->OnNotify += MakeDelegate(this, &CPageControlUI::OnBtnClick);
  43. Add(m_BtnGoto);
  44. Add(m_EdtPageNo);
  45. m_EdtPageNo->SetNumberOnly(true);
  46. SetMaxChar();
  47. SetMaxPages(1);
  48. }
  49. DuiLib::CPageControlUI::~CPageControlUI()
  50. {
  51. RemoveAll();
  52. }
  53. void DuiLib::CPageControlUI::SetMaxPages(int nPages, int nShowNum /*= 6*/)
  54. {
  55. if (m_nShowPage == nShowNum && m_nMaxPage == nPages)
  56. {
  57. return;
  58. }
  59. m_nMaxPage = max(nPages, 1);
  60. m_nShowPage = max(nShowNum, 5);
  61. ResetAllPages();
  62. }
  63. void DuiLib::CPageControlUI::SetMaxChar(int nNum /*= 2*/)
  64. {
  65. m_EdtPageNo->SetMaxChar(nNum);
  66. }
  67. void DuiLib::CPageControlUI::SetFont(int nFont)
  68. {
  69. m_nFont = nFont;
  70. m_BtnPrevious->SetFont(nFont);
  71. m_BtnNext->SetFont(nFont);
  72. m_BtnGoto->SetFont(nFont);
  73. m_EdtPageNo->SetFont(nFont);
  74. m_BtnNextMore->SetFont(nFont);
  75. for (int i = 0; i < m_OptPageNoArr.GetSize(); i++)
  76. {
  77. COptionUI* page = (COptionUI*)m_OptPageNoArr[i];
  78. page->SetFont(nFont);
  79. }
  80. }
  81. void DuiLib::CPageControlUI::SetPageSelectedTextColor(DWORD cr /*= 0xff00ff00*/)
  82. {
  83. m_dwSelTextColor = cr;
  84. for (int i = 0; i < m_OptPageNoArr.GetSize(); i++)
  85. {
  86. COptionUI* page = (COptionUI*)m_OptPageNoArr[i];
  87. page->SetSelectedTextColor(cr);
  88. }
  89. }
  90. void DuiLib::CPageControlUI::SetPageSelectedBkColor(DWORD cr)
  91. {
  92. m_dwSelectedBkColor = cr;
  93. for (int i = 0; i < m_OptPageNoArr.GetSize(); i++)
  94. {
  95. COptionUI* page = (COptionUI*)m_OptPageNoArr[i];
  96. page->SetSelectedBkColor(m_dwSelectedBkColor);
  97. }
  98. }
  99. void DuiLib::CPageControlUI::SetPageNormalTextColor(DWORD cr /*= 0xff000000*/)
  100. {
  101. m_dwNormalTextColor = cr;
  102. for (int i = 0; i < m_OptPageNoArr.GetSize(); i++)
  103. {
  104. COptionUI* page = (COptionUI*)m_OptPageNoArr[i];
  105. page->SetTextColor(cr);
  106. }
  107. }
  108. void DuiLib::CPageControlUI::SetPageBkColor(DWORD cr /*= 0x00000000*/)
  109. {
  110. m_dwNormalBkColor = cr;
  111. for (int i = 0; i < m_OptPageNoArr.GetSize(); i++)
  112. {
  113. COptionUI* page = (COptionUI*)m_OptPageNoArr[i];
  114. page->SetBkColor(cr);
  115. }
  116. }
  117. void DuiLib::CPageControlUI::SetPageHotBkColor(DWORD cr)
  118. {
  119. m_dwHotBkColor = cr;
  120. m_BtnPrevious->SetHotBkColor(m_dwHotBkColor);
  121. m_BtnNext->SetHotBkColor(m_dwHotBkColor);
  122. m_BtnGoto->SetHotBkColor(m_dwHotBkColor);
  123. m_BtnNextMore->SetHotBkColor(m_dwHotBkColor);
  124. for (int i = 0; i < m_OptPageNoArr.GetSize(); i++)
  125. {
  126. COptionUI* page = (COptionUI*)m_OptPageNoArr[i];
  127. page->SetHotBkColor(m_dwHotBkColor);
  128. }
  129. }
  130. void DuiLib::CPageControlUI::SetPageHotTextColor(DWORD cr)
  131. {
  132. m_dwHotTextColor = cr;
  133. m_BtnPrevious->SetHotTextColor(m_dwHotTextColor);
  134. m_BtnNext->SetHotTextColor(m_dwHotTextColor);
  135. m_BtnGoto->SetHotTextColor(m_dwHotTextColor);
  136. m_BtnNextMore->SetHotTextColor(m_dwHotTextColor);
  137. for (int i = 0; i < m_OptPageNoArr.GetSize(); i++)
  138. {
  139. COptionUI* page = (COptionUI*)m_OptPageNoArr[i];
  140. page->SetHotTextColor(m_dwHotTextColor);
  141. }
  142. }
  143. void DuiLib::CPageControlUI::SetPageNoSize(int w /*= 30*/, int h /*= 30*/)
  144. {
  145. m_szPage.cx = w;
  146. m_szPage.cy = h;
  147. UpdatePosition();
  148. }
  149. void DuiLib::CPageControlUI::SetGotoEditSize(int w /*= 50*/, int h /*= 30*/)
  150. {
  151. m_szGotoEdit.cx = w;
  152. m_szGotoEdit.cy = h;
  153. UpdatePosition();
  154. }
  155. void DuiLib::CPageControlUI::SetGotoEditBorderColor(DWORD cr /*= 0x00000000*/)
  156. {
  157. m_EdtPageNo->SetBorderColor(cr);
  158. }
  159. void DuiLib::CPageControlUI::SetGotoEditBorderSize(int size /*= 1*/)
  160. {
  161. m_EdtPageNo->SetBorderSize(size);
  162. }
  163. void DuiLib::CPageControlUI::SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue)
  164. {
  165. if (_tcsicmp(pstrName, _T("maxpage")) == 0)
  166. {
  167. LPTSTR pstr = NULL;
  168. int nMaxPageNo = _tcstol(pstrValue, &pstr, 10); ASSERT(pstr);
  169. int nShowPage = _tcstol(pstr + 1, &pstr, 10);
  170. SetMaxPages(nMaxPageNo, nShowPage);
  171. return;
  172. }
  173. else if (_tcsicmp(pstrName, _T("font")) == 0)
  174. {
  175. LPTSTR pstr = NULL;
  176. int nFont = _tcstol(pstrValue, &pstr, 10);
  177. SetFont(nFont);
  178. return;
  179. }
  180. else if (_tcsicmp(pstrName, _T("pageselectedtextcolor")) == 0)
  181. {
  182. while (*pstrValue > _T('\0') && *pstrValue <= _T(' ')) pstrValue = ::CharNext(pstrValue);
  183. if (*pstrValue == _T('#')) pstrValue = ::CharNext(pstrValue);
  184. LPTSTR pstr = NULL;
  185. DWORD clrColor = _tcstoul(pstrValue, &pstr, 16);
  186. SetPageSelectedTextColor(clrColor);
  187. return;
  188. }
  189. else if (_tcsicmp(pstrName, _T("pageselectedbkcolor")) == 0)
  190. {
  191. while (*pstrValue > _T('\0') && *pstrValue <= _T(' ')) pstrValue = ::CharNext(pstrValue);
  192. if (*pstrValue == _T('#')) pstrValue = ::CharNext(pstrValue);
  193. LPTSTR pstr = NULL;
  194. DWORD clrColor = _tcstoul(pstrValue, &pstr, 16);
  195. SetPageSelectedBkColor(clrColor);
  196. return;
  197. }
  198. else if (_tcsicmp(pstrName, _T("pagetextcolor")) == 0)
  199. {
  200. while (*pstrValue > _T('\0') && *pstrValue <= _T(' ')) pstrValue = ::CharNext(pstrValue);
  201. if (*pstrValue == _T('#')) pstrValue = ::CharNext(pstrValue);
  202. LPTSTR pstr = NULL;
  203. DWORD clrColor = _tcstoul(pstrValue, &pstr, 16);
  204. SetPageNormalTextColor(clrColor);
  205. return;
  206. }
  207. else if (_tcsicmp(pstrName, _T("pagebkcolor")) == 0)
  208. {
  209. while (*pstrValue > _T('\0') && *pstrValue <= _T(' ')) pstrValue = ::CharNext(pstrValue);
  210. if (*pstrValue == _T('#')) pstrValue = ::CharNext(pstrValue);
  211. LPTSTR pstr = NULL;
  212. DWORD clrColor = _tcstoul(pstrValue, &pstr, 16);
  213. SetPageBkColor(clrColor);
  214. return;
  215. }
  216. else if (_tcsicmp(pstrName, _T("pagehotbkcolor")) == 0)
  217. {
  218. while (*pstrValue > _T('\0') && *pstrValue <= _T(' ')) pstrValue = ::CharNext(pstrValue);
  219. if (*pstrValue == _T('#')) pstrValue = ::CharNext(pstrValue);
  220. LPTSTR pstr = NULL;
  221. DWORD clrColor = _tcstoul(pstrValue, &pstr, 16);
  222. SetPageHotBkColor(clrColor);
  223. return;
  224. }
  225. else if (_tcsicmp(pstrName, _T("pagehottextcolor")) == 0)
  226. {
  227. while (*pstrValue > _T('\0') && *pstrValue <= _T(' ')) pstrValue = ::CharNext(pstrValue);
  228. if (*pstrValue == _T('#')) pstrValue = ::CharNext(pstrValue);
  229. LPTSTR pstr = NULL;
  230. DWORD clrColor = _tcstoul(pstrValue, &pstr, 16);
  231. SetPageHotTextColor(clrColor);
  232. return;
  233. }
  234. else if (_tcsicmp(pstrName, _T("gotoeditbordercolor")) == 0)
  235. {
  236. while (*pstrValue > _T('\0') && *pstrValue <= _T(' ')) pstrValue = ::CharNext(pstrValue);
  237. if (*pstrValue == _T('#')) pstrValue = ::CharNext(pstrValue);
  238. LPTSTR pstr = NULL;
  239. DWORD clrColor = _tcstoul(pstrValue, &pstr, 16);
  240. SetGotoEditBorderColor(clrColor);
  241. return;
  242. }
  243. else if (_tcsicmp(pstrName, _T("gotoeditbordersize")) == 0)
  244. {
  245. LPTSTR pstr = NULL;
  246. int nFont = _tcstol(pstrValue, &pstr, 10);
  247. SetGotoEditBorderSize(nFont);
  248. return;
  249. }
  250. else if (_tcsicmp(pstrName, _T("editmaxchar")) == 0)
  251. {
  252. LPTSTR pstr = NULL;
  253. int nNum = _tcstol(pstrValue, &pstr, 10);
  254. SetMaxChar(nNum);
  255. return;
  256. }
  257. CHorizontalLayoutUI::SetAttribute(pstrName, pstrValue);
  258. }
  259. void DuiLib::CPageControlUI::ResetAllPages()
  260. {
  261. int nPages = m_OptPageNoArr.GetSize();
  262. if (nPages < m_nShowPage)
  263. {
  264. for (int i = nPages; i < m_nShowPage; i++)
  265. {
  266. auto page = new COptionUI();
  267. TCHAR szPageText[20];
  268. _sntprintf(szPageText, 20, _T("%u"), i + 1);
  269. page->SetText(szPageText);
  270. page->SetGroup(PAGE_OPT_GROUP);
  271. page->OnNotify += MakeDelegate(this, &CPageControlUI::OnOptionSelChanged);
  272. page->SetTag(i);
  273. page->SetFont(m_nFont);
  274. page->SetTextColor(m_dwNormalTextColor);
  275. page->SetBkColor(m_dwNormalBkColor);
  276. page->SetSelectedTextColor(m_dwSelTextColor);
  277. page->SetSelectedBkColor(m_dwSelectedBkColor);
  278. page->SetHotTextColor(m_dwHotTextColor);
  279. page->SetHotBkColor(m_dwHotBkColor);
  280. m_OptPageNoArr.Add(page);
  281. Add(page);
  282. }
  283. }
  284. else
  285. {
  286. for (int i = nPages - 1; i >= m_nShowPage; i--)
  287. {
  288. COptionUI* page = (COptionUI*)m_OptPageNoArr[i];
  289. m_OptPageNoArr.Remove(i);
  290. Remove(page);
  291. }
  292. }
  293. //更新索引
  294. UpdateItemIndex();
  295. //更新页码
  296. UpdatePageNo(0, true);
  297. //选中
  298. if (m_nSelPageNo == -1 || m_nSelPageNo > m_nShowPage)
  299. {
  300. SelectPage(0);
  301. }
  302. UpdatePosition();
  303. UpdateMoreBtnVisiable();
  304. }
  305. void DuiLib::CPageControlUI::UpdatePosition()
  306. {
  307. int controlWidth = 0;
  308. m_BtnPrevious->SetFixedWidth(m_szPage.cx);
  309. m_BtnPrevious->SetFixedHeight(m_szPage.cy);
  310. controlWidth += m_szPage.cx;
  311. for (int i = 0; i < m_OptPageNoArr.GetSize(); i++)
  312. {
  313. if (i == m_OptPageNoArr.GetSize() - 1)
  314. {
  315. m_BtnNextMore->SetFixedWidth(m_szPage.cx);
  316. m_BtnNextMore->SetFixedHeight(m_szPage.cy);
  317. controlWidth += m_szPage.cx;
  318. }
  319. COptionUI* page = (COptionUI*)m_OptPageNoArr[i];
  320. page->SetFixedWidth(m_szPage.cx);
  321. page->SetFixedHeight(m_szPage.cy);
  322. controlWidth += m_szPage.cx;
  323. }
  324. m_BtnNext->SetFixedWidth(m_szPage.cx);
  325. m_BtnNext->SetFixedHeight(m_szPage.cy);
  326. controlWidth += m_szPage.cx;
  327. m_BtnGoto->SetPadding(CDuiRect(m_szPage.cx + 10,0,0,0));
  328. m_BtnGoto->SetFixedWidth(m_szPage.cx + 10);
  329. m_BtnGoto->SetFixedHeight(m_szPage.cy);
  330. controlWidth += m_szPage.cx + m_szPage.cx + 10 + 10;
  331. m_EdtPageNo->SetPadding(CDuiRect(5,(m_szPage.cy - m_szGotoEdit.cy) / 2,0,0));
  332. m_EdtPageNo->SetFixedWidth(m_szGotoEdit.cx);
  333. m_EdtPageNo->SetFixedHeight(m_szGotoEdit.cy);
  334. controlWidth += m_szGotoEdit.cx + 5;
  335. SetFixedWidth(controlWidth + GetBorderSize() * 2);
  336. }
  337. void DuiLib::CPageControlUI::UpdatePageNo(int iDelta, bool bReset)
  338. {
  339. if (bReset)
  340. {
  341. for (int i = 0; i < m_OptPageNoArr.GetSize(); i++)
  342. {
  343. COptionUI* page = (COptionUI*)m_OptPageNoArr[i];
  344. TCHAR szPage[20];
  345. _sntprintf(szPage, 20, _T("%u"), i + 1);
  346. page->SetText(szPage);
  347. page->SetVisible(true);
  348. if (i >= m_nMaxPage)
  349. {
  350. page->SetVisible(false);
  351. }
  352. }
  353. COptionUI* page = (COptionUI*)m_OptPageNoArr[m_OptPageNoArr.GetSize() - 1];
  354. TCHAR szPage[20];
  355. _sntprintf(szPage, 20, _T("%u"), m_nMaxPage);
  356. page->SetText(szPage);
  357. }
  358. else
  359. {
  360. for (int i = 0; i < m_OptPageNoArr.GetSize() - 1; i++)
  361. {
  362. COptionUI* page = (COptionUI*)m_OptPageNoArr[i];
  363. int nPage = GetPageNoByControl(page);
  364. nPage += iDelta;
  365. TCHAR szPage[20];
  366. _sntprintf(szPage, 20, _T("%u"), nPage);
  367. page->SetText(szPage);
  368. }
  369. }
  370. }
  371. void DuiLib::CPageControlUI::UpdateItemIndex()
  372. {
  373. int nIndex = 1;
  374. for (int i = 0; i < m_OptPageNoArr.GetSize(); i++)
  375. {
  376. if (i == m_OptPageNoArr.GetSize() - 1)
  377. {
  378. SetItemIndex(m_BtnNextMore, nIndex++);
  379. }
  380. SetItemIndex((CControlUI*)m_OptPageNoArr[i], nIndex++);
  381. }
  382. SetItemIndex(m_BtnNext, nIndex++);
  383. SetItemIndex(m_BtnGoto, nIndex++);
  384. SetItemIndex(m_EdtPageNo, nIndex++);
  385. }
  386. void DuiLib::CPageControlUI::GotoPage(int nPageNo, bool bAutoGotoOneWhenError)
  387. {
  388. int nGotoPageNo = nPageNo;
  389. if (nGotoPageNo > 0 && nGotoPageNo <= m_nMaxPage)
  390. {
  391. int nExistsPageNoIdx = GetIndexByPageNo(nGotoPageNo);
  392. //页面存在但是不是最后一个页码
  393. if (nExistsPageNoIdx != -1 && nExistsPageNoIdx != m_OptPageNoArr.GetSize() - 1)
  394. {
  395. SelectPage(nExistsPageNoIdx);
  396. return;
  397. }
  398. int nFirstPageVal = 1;
  399. int nSelIndex = m_nMaxPage - nGotoPageNo + 1 - m_nShowPage;
  400. if (nSelIndex >= 0)
  401. {
  402. nFirstPageVal = nGotoPageNo;
  403. nSelIndex = 0;
  404. }
  405. else
  406. {
  407. nFirstPageVal = nGotoPageNo + nSelIndex;
  408. }
  409. int nFirstPageNo = GetPageNoByControl((CControlUI*)m_OptPageNoArr[0]);
  410. if (nFirstPageNo >= 0)
  411. {
  412. int delta = nFirstPageVal - nFirstPageNo;
  413. if (delta != 0)
  414. {
  415. UpdatePageNo(delta);
  416. UpdateMoreBtnVisiable();
  417. }
  418. SelectPage(-nSelIndex);
  419. }
  420. }
  421. else if (bAutoGotoOneWhenError)
  422. {
  423. DUITRACE(_T("索引越界,选中第一个页"));
  424. SelectPage(0);
  425. }
  426. }
  427. int DuiLib::CPageControlUI::GetIndexByPageNo(int nPageNo)
  428. {
  429. for (int i = 0; i < GetShowPageNum(); i++)
  430. {
  431. int pageNo = GetPageNoByControl((CControlUI*)m_OptPageNoArr[i]);
  432. if (nPageNo == pageNo)
  433. {
  434. return i;
  435. }
  436. }
  437. return -1;
  438. }
  439. void DuiLib::CPageControlUI::SelectPage(int nPageIdx)
  440. {
  441. m_EdtPageNo->SetText(_T(""));
  442. if (nPageIdx >= GetShowPageNum() || nPageIdx < 0)
  443. {
  444. nPageIdx = 0;
  445. }
  446. int nCurSelPageNo = m_nSelPageNo;
  447. int nNewPageNo = GetPageNoByControl((COptionUI*)m_OptPageNoArr[nPageIdx]);
  448. if (nNewPageNo == -1)
  449. {
  450. return;
  451. }
  452. if (nCurSelPageNo != nNewPageNo)
  453. {
  454. m_nSelPageNo = nNewPageNo;
  455. m_ConCurSel = (COptionUI*)m_OptPageNoArr[nPageIdx];
  456. if (!m_ConCurSel->IsSelected())
  457. {
  458. m_ConCurSel->Selected(true, false);
  459. }
  460. if (m_pManager)
  461. {
  462. m_pManager->SendNotify(this, DUI_MSGTYPE_PAGECHANED, nNewPageNo, nCurSelPageNo);
  463. DUITRACE(_T("select page changed %d -> %d"), nCurSelPageNo, nNewPageNo);
  464. }
  465. }
  466. }
  467. int DuiLib::CPageControlUI::GetCurSel()
  468. {
  469. return m_nSelPageNo;
  470. }
  471. void DuiLib::CPageControlUI::UpdateMoreBtnVisiable()
  472. {
  473. bool bVisiable = false;
  474. int nLastPageIdx = GetShowPageNum() - 1;
  475. int nPrevPageIdx = GetShowPageNum() - 2;
  476. if (nLastPageIdx < 0 || nPrevPageIdx < 0)
  477. {
  478. m_BtnNextMore->SetVisible(bVisiable);
  479. return;
  480. }
  481. COptionUI* lastPage = (COptionUI*)m_OptPageNoArr[nLastPageIdx];
  482. COptionUI* prevPage = (COptionUI*)m_OptPageNoArr[nPrevPageIdx];
  483. int iLastPageNo = GetPageNoByControl(lastPage);
  484. int iPrevPageNo = GetPageNoByControl(prevPage);
  485. bVisiable = (iLastPageNo - iPrevPageNo > 1 ? true : false);
  486. m_BtnNextMore->SetVisible(bVisiable);
  487. }
  488. bool DuiLib::CPageControlUI::IsExistNextMore()
  489. {
  490. bool bVisiable = m_BtnNextMore->IsVisible();
  491. return bVisiable;
  492. }
  493. bool DuiLib::CPageControlUI::OnOptionSelChanged(void* p)
  494. {
  495. TNotifyUI* notify = (TNotifyUI*)p;
  496. if (notify->sType == DUI_MSGTYPE_SELECTCHANGED)
  497. {
  498. COptionUI* page = (COptionUI*)notify->pSender->GetInterface(DUI_CTR_OPTION);
  499. if (page && page->IsSelected())
  500. {
  501. int iPageIndex = (int)notify->pSender->GetTag();
  502. if (iPageIndex == m_OptPageNoArr.GetSize() - 1)
  503. {
  504. int nPrePageNo = GetPageNoByControl((CControlUI*)m_OptPageNoArr[m_OptPageNoArr.GetSize() - 2]);
  505. //前N-1个更新到最后一页
  506. int nDelta = m_nMaxPage - nPrePageNo - 1;
  507. UpdatePageNo(nDelta);
  508. //更新more按钮是否显示
  509. UpdateMoreBtnVisiable();
  510. }
  511. SelectPage(iPageIndex);
  512. }
  513. }
  514. return true;
  515. }
  516. bool DuiLib::CPageControlUI::OnBtnClick(void* p)
  517. {
  518. TNotifyUI* notify = (TNotifyUI*)p;
  519. if (notify->sType == DUI_MSGTYPE_CLICK)
  520. {
  521. if (notify->pSender == m_BtnPrevious)
  522. {
  523. int iCurSelIndex = m_ConCurSel->GetTag();
  524. int nFirstPageNo = GetPageNoByControl((COptionUI*)m_OptPageNoArr[0]);
  525. int iPageIndex = ((COptionUI*)m_OptPageNoArr[0])->GetTag();
  526. //第一个页码是1
  527. if (nFirstPageNo == 1)
  528. {
  529. //左移选中,当前选中不是第一页
  530. if (iCurSelIndex != 0) SelectPage(--iCurSelIndex);
  531. }
  532. else
  533. {
  534. if (iCurSelIndex < GetShowPageNum() - 1)
  535. {
  536. //if (iCurSelIndex >= 0)
  537. {
  538. //前N-1个页码-1
  539. UpdatePageNo(-1);
  540. //不移动更新选中
  541. SelectPage(iCurSelIndex);
  542. }
  543. }
  544. //(选中最后一个)
  545. else
  546. {
  547. //左移选中
  548. SelectPage(--iCurSelIndex);
  549. }
  550. }
  551. UpdateMoreBtnVisiable();
  552. }
  553. else if (notify->pSender == m_BtnNext ||
  554. notify->pSender == m_BtnNextMore)
  555. {
  556. int nCurSelPage = GetCurSel();
  557. int nCurSelIdx = m_ConCurSel->GetTag();
  558. //当前选中是倒数第二个之前的页
  559. if (nCurSelIdx < GetShowPageNum() - 1)
  560. {
  561. //不存在下一个更多按钮或者不是倒数第二个按钮
  562. if (!IsExistNextMore() || nCurSelIdx != GetShowPageNum() - 2)
  563. {
  564. //右移选中
  565. SelectPage(++nCurSelIdx);
  566. }
  567. else//存在更多按钮
  568. {
  569. //页码+1
  570. UpdatePageNo(1);
  571. //通知选中
  572. SelectPage(nCurSelIdx);
  573. }
  574. }
  575. UpdateMoreBtnVisiable();
  576. }
  577. else if (notify->pSender == m_BtnGoto)
  578. {
  579. int nGotoPageNo = GetPageNoByControl(m_EdtPageNo);
  580. GotoPage(nGotoPageNo, false);
  581. }
  582. }
  583. return true;
  584. }
  585. int DuiLib::CPageControlUI::GetPageNoByControl(CControlUI* pcon)
  586. {
  587. if (!pcon)
  588. {
  589. return -1;
  590. }
  591. int iPage = _ttoi(pcon->GetText().GetData());
  592. return iPage;
  593. }
  594. }