UIContainer.cpp 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167
  1. #include "StdAfx.h"
  2. namespace DuiLib
  3. {
  4. /////////////////////////////////////////////////////////////////////////////////////
  5. //
  6. //
  7. IMPLEMENT_DUICONTROL(CContainerUI)
  8. CContainerUI::CContainerUI()
  9. : m_iChildPadding(0),
  10. m_iChildAlign(DT_LEFT),
  11. m_iChildVAlign(DT_TOP),
  12. m_bAutoDestroy(true),
  13. m_bDelayedDestroy(true),
  14. m_bMouseChildEnabled(true),
  15. m_pVerticalScrollBar(NULL),
  16. m_pHorizontalScrollBar(NULL),
  17. m_nScrollStepSize(0),
  18. m_bFixedScrollbar(false),
  19. m_bShowScrollbar(true)
  20. {
  21. ::ZeroMemory(&m_rcInset, sizeof(m_rcInset));
  22. }
  23. CContainerUI::~CContainerUI()
  24. {
  25. m_bDelayedDestroy = false;
  26. RemoveAll();
  27. if( m_pVerticalScrollBar ) {
  28. delete m_pVerticalScrollBar;
  29. m_pVerticalScrollBar = NULL;
  30. }
  31. if( m_pHorizontalScrollBar ) {
  32. delete m_pHorizontalScrollBar;
  33. m_pHorizontalScrollBar = NULL;
  34. }
  35. }
  36. LPCTSTR CContainerUI::GetClass() const
  37. {
  38. return _T("ContainerUI");
  39. }
  40. LPVOID CContainerUI::GetInterface(LPCTSTR pstrName)
  41. {
  42. if( _tcsicmp(pstrName, _T("IContainer")) == 0 ) return static_cast<IContainerUI*>(this);
  43. else if( _tcsicmp(pstrName, DUI_CTR_CONTAINER) == 0 ) return static_cast<CContainerUI*>(this);
  44. return CControlUI::GetInterface(pstrName);
  45. }
  46. CControlUI* CContainerUI::GetItemAt(int iIndex) const
  47. {
  48. if( iIndex < 0 || iIndex >= m_items.GetSize() ) return NULL;
  49. return static_cast<CControlUI*>(m_items[iIndex]);
  50. }
  51. int CContainerUI::GetItemIndex(CControlUI* pControl) const
  52. {
  53. for( int it = 0; it < m_items.GetSize(); it++ ) {
  54. if( static_cast<CControlUI*>(m_items[it]) == pControl ) {
  55. return it;
  56. }
  57. }
  58. return -1;
  59. }
  60. bool CContainerUI::SetItemIndex(CControlUI* pControl, int iIndex)
  61. {
  62. for( int it = 0; it < m_items.GetSize(); it++ ) {
  63. if( static_cast<CControlUI*>(m_items[it]) == pControl ) {
  64. NeedUpdate();
  65. m_items.Remove(it);
  66. return m_items.InsertAt(iIndex, pControl);
  67. }
  68. }
  69. return false;
  70. }
  71. int CContainerUI::GetCount() const
  72. {
  73. return m_items.GetSize();
  74. }
  75. bool CContainerUI::Add(CControlUI* pControl)
  76. {
  77. if( pControl == NULL) return false;
  78. if( m_pManager != NULL ) m_pManager->InitControls(pControl, this);
  79. if( IsVisible() ) NeedUpdate();
  80. else pControl->SetInternVisible(false);
  81. return m_items.Add(pControl);
  82. }
  83. bool CContainerUI::AddAt(CControlUI* pControl, int iIndex)
  84. {
  85. if( pControl == NULL) return false;
  86. if( m_pManager != NULL ) m_pManager->InitControls(pControl, this);
  87. if( IsVisible() ) NeedUpdate();
  88. else pControl->SetInternVisible(false);
  89. return m_items.InsertAt(iIndex, pControl);
  90. }
  91. bool CContainerUI::Remove(CControlUI* pControl)
  92. {
  93. if( pControl == NULL) return false;
  94. for( int it = 0; it < m_items.GetSize(); it++ ) {
  95. if( static_cast<CControlUI*>(m_items[it]) == pControl ) {
  96. NeedUpdate();
  97. if( m_bAutoDestroy ) {
  98. if( m_bDelayedDestroy && m_pManager ) m_pManager->AddDelayedCleanup(pControl);
  99. else delete pControl;
  100. }
  101. return m_items.Remove(it);
  102. }
  103. }
  104. return false;
  105. }
  106. bool CContainerUI::RemoveAt(int iIndex)
  107. {
  108. CControlUI* pControl = GetItemAt(iIndex);
  109. if (pControl != NULL) {
  110. return CContainerUI::Remove(pControl);
  111. }
  112. return false;
  113. }
  114. void CContainerUI::RemoveAll()
  115. {
  116. for( int it = 0; m_bAutoDestroy && it < m_items.GetSize(); it++ ) {
  117. CControlUI* pItem = static_cast<CControlUI*>(m_items[it]);
  118. if( m_bDelayedDestroy && m_pManager ) {
  119. m_pManager->AddDelayedCleanup(pItem);
  120. }
  121. else {
  122. delete pItem;
  123. pItem = NULL;
  124. }
  125. }
  126. m_items.Empty();
  127. NeedUpdate();
  128. }
  129. bool CContainerUI::IsAutoDestroy() const
  130. {
  131. return m_bAutoDestroy;
  132. }
  133. void CContainerUI::SetAutoDestroy(bool bAuto)
  134. {
  135. m_bAutoDestroy = bAuto;
  136. }
  137. bool CContainerUI::IsDelayedDestroy() const
  138. {
  139. return m_bDelayedDestroy;
  140. }
  141. void CContainerUI::SetDelayedDestroy(bool bDelayed)
  142. {
  143. m_bDelayedDestroy = bDelayed;
  144. }
  145. RECT CContainerUI::GetInset() const
  146. {
  147. if(m_pManager) return m_pManager->GetDPIObj()->Scale(m_rcInset);
  148. return m_rcInset;
  149. }
  150. void CContainerUI::SetInset(RECT rcInset)
  151. {
  152. m_rcInset = rcInset;
  153. NeedUpdate();
  154. }
  155. int CContainerUI::GetChildPadding() const
  156. {
  157. if (m_pManager) return m_pManager->GetDPIObj()->Scale(m_iChildPadding);
  158. return m_iChildPadding;
  159. }
  160. void CContainerUI::SetChildPadding(int iPadding)
  161. {
  162. m_iChildPadding = iPadding;
  163. NeedUpdate();
  164. }
  165. UINT CContainerUI::GetChildAlign() const
  166. {
  167. return m_iChildAlign;
  168. }
  169. void CContainerUI::SetChildAlign(UINT iAlign)
  170. {
  171. m_iChildAlign = iAlign;
  172. NeedUpdate();
  173. }
  174. UINT CContainerUI::GetChildVAlign() const
  175. {
  176. return m_iChildVAlign;
  177. }
  178. void CContainerUI::SetChildVAlign(UINT iVAlign)
  179. {
  180. m_iChildVAlign = iVAlign;
  181. NeedUpdate();
  182. }
  183. bool CContainerUI::IsMouseChildEnabled() const
  184. {
  185. return m_bMouseChildEnabled;
  186. }
  187. void CContainerUI::SetMouseChildEnabled(bool bEnable)
  188. {
  189. m_bMouseChildEnabled = bEnable;
  190. }
  191. bool CContainerUI::IsFixedScrollbar()
  192. {
  193. return m_bFixedScrollbar;
  194. }
  195. void CContainerUI::SetFixedScrollbar(bool bFixed)
  196. {
  197. m_bFixedScrollbar = bFixed;
  198. Invalidate();
  199. }
  200. bool CContainerUI::IsShowScrollbar()
  201. {
  202. return m_bShowScrollbar;
  203. }
  204. void CContainerUI::SetShowScrollbar(bool bShow)
  205. {
  206. m_bShowScrollbar = bShow;
  207. if( m_pVerticalScrollBar != NULL ) m_pVerticalScrollBar->SetShow(bShow);
  208. if( m_pHorizontalScrollBar != NULL ) m_pHorizontalScrollBar->SetShow(bShow);
  209. }
  210. void CContainerUI::SetVisible(bool bVisible)
  211. {
  212. if( m_bVisible == bVisible ) return;
  213. CControlUI::SetVisible(bVisible);
  214. for( int it = 0; it < m_items.GetSize(); it++ ) {
  215. static_cast<CControlUI*>(m_items[it])->SetInternVisible(IsVisible());
  216. }
  217. }
  218. // 逻辑上,对于Container控件不公开此方法
  219. // 调用此方法的结果是,内部子控件隐藏,控件本身依然显示,背景等效果存在
  220. void CContainerUI::SetInternVisible(bool bVisible)
  221. {
  222. CControlUI::SetInternVisible(bVisible);
  223. if( m_items.IsEmpty() ) return;
  224. for( int it = 0; it < m_items.GetSize(); it++ ) {
  225. // 控制子控件显示状态
  226. // InternVisible状态应由子控件自己控制
  227. static_cast<CControlUI*>(m_items[it])->SetInternVisible(IsVisible());
  228. }
  229. }
  230. void CContainerUI::SetEnabled(bool bEnabled)
  231. {
  232. if( m_bEnabled == bEnabled ) return;
  233. m_bEnabled = bEnabled;
  234. for( int it = 0; it < m_items.GetSize(); it++ ) {
  235. static_cast<CControlUI*>(m_items[it])->SetEnabled(m_bEnabled);
  236. }
  237. Invalidate();
  238. }
  239. void CContainerUI::SetMouseEnabled(bool bEnabled)
  240. {
  241. if( m_pVerticalScrollBar != NULL ) m_pVerticalScrollBar->SetMouseEnabled(bEnabled);
  242. if( m_pHorizontalScrollBar != NULL ) m_pHorizontalScrollBar->SetMouseEnabled(bEnabled);
  243. CControlUI::SetMouseEnabled(bEnabled);
  244. }
  245. void CContainerUI::DoEvent(TEventUI& event)
  246. {
  247. if( !IsMouseEnabled() && event.Type > UIEVENT__MOUSEBEGIN && event.Type < UIEVENT__MOUSEEND ) {
  248. if( m_pParent != NULL ) m_pParent->DoEvent(event);
  249. else CControlUI::DoEvent(event);
  250. return;
  251. }
  252. if( event.Type == UIEVENT_SETFOCUS )
  253. {
  254. m_bFocused = true;
  255. return;
  256. }
  257. if( event.Type == UIEVENT_KILLFOCUS )
  258. {
  259. m_bFocused = false;
  260. return;
  261. }
  262. if( m_pVerticalScrollBar != NULL && m_pVerticalScrollBar->IsVisible() && m_pVerticalScrollBar->IsEnabled() )
  263. {
  264. if( event.Type == UIEVENT_KEYDOWN )
  265. {
  266. switch( event.chKey ) {
  267. case VK_DOWN:
  268. LineDown();
  269. return;
  270. case VK_UP:
  271. LineUp();
  272. return;
  273. case VK_NEXT:
  274. PageDown();
  275. return;
  276. case VK_PRIOR:
  277. PageUp();
  278. return;
  279. case VK_HOME:
  280. HomeUp();
  281. return;
  282. case VK_END:
  283. EndDown();
  284. return;
  285. }
  286. }
  287. else if( event.Type == UIEVENT_SCROLLWHEEL )
  288. {
  289. switch( LOWORD(event.wParam) ) {
  290. case SB_LINEUP:
  291. LineUp();
  292. return;
  293. case SB_LINEDOWN:
  294. LineDown();
  295. return;
  296. }
  297. }
  298. }
  299. if( m_pHorizontalScrollBar != NULL && m_pHorizontalScrollBar->IsVisible() && m_pHorizontalScrollBar->IsEnabled() ) {
  300. if( event.Type == UIEVENT_KEYDOWN )
  301. {
  302. switch( event.chKey ) {
  303. case VK_DOWN:
  304. LineRight();
  305. return;
  306. case VK_UP:
  307. LineLeft();
  308. return;
  309. case VK_NEXT:
  310. PageRight();
  311. return;
  312. case VK_PRIOR:
  313. PageLeft();
  314. return;
  315. case VK_HOME:
  316. HomeLeft();
  317. return;
  318. case VK_END:
  319. EndRight();
  320. return;
  321. }
  322. }
  323. else if( event.Type == UIEVENT_SCROLLWHEEL )
  324. {
  325. switch( LOWORD(event.wParam) ) {
  326. case SB_LINEUP:
  327. LineLeft();
  328. return;
  329. case SB_LINEDOWN:
  330. LineRight();
  331. return;
  332. }
  333. }
  334. }
  335. CControlUI::DoEvent(event);
  336. }
  337. SIZE CContainerUI::GetScrollPos() const
  338. {
  339. SIZE sz = {0, 0};
  340. if( m_pVerticalScrollBar && m_pVerticalScrollBar->IsVisible() ) sz.cy = m_pVerticalScrollBar->GetScrollPos();
  341. if( m_pHorizontalScrollBar && m_pHorizontalScrollBar->IsVisible() ) sz.cx = m_pHorizontalScrollBar->GetScrollPos();
  342. return sz;
  343. }
  344. SIZE CContainerUI::GetScrollRange() const
  345. {
  346. SIZE sz = {0, 0};
  347. if( m_pVerticalScrollBar && m_pVerticalScrollBar->IsVisible() ) sz.cy = m_pVerticalScrollBar->GetScrollRange();
  348. if( m_pHorizontalScrollBar && m_pHorizontalScrollBar->IsVisible() ) sz.cx = m_pHorizontalScrollBar->GetScrollRange();
  349. return sz;
  350. }
  351. void CContainerUI::SetScrollPos(SIZE szPos, bool bMsg)
  352. {
  353. int cx = 0;
  354. int cy = 0;
  355. if( m_pVerticalScrollBar && m_pVerticalScrollBar->IsVisible() ) {
  356. int iLastScrollPos = m_pVerticalScrollBar->GetScrollPos();
  357. m_pVerticalScrollBar->SetScrollPos(szPos.cy);
  358. cy = m_pVerticalScrollBar->GetScrollPos() - iLastScrollPos;
  359. }
  360. if( m_pHorizontalScrollBar && m_pHorizontalScrollBar->IsVisible() ) {
  361. int iLastScrollPos = m_pHorizontalScrollBar->GetScrollPos();
  362. m_pHorizontalScrollBar->SetScrollPos(szPos.cx);
  363. cx = m_pHorizontalScrollBar->GetScrollPos() - iLastScrollPos;
  364. }
  365. if( cx == 0 && cy == 0 ) return;
  366. RECT rcPos;
  367. for( int it2 = 0; it2 < m_items.GetSize(); it2++ ) {
  368. CControlUI* pControl = static_cast<CControlUI*>(m_items[it2]);
  369. if( !pControl->IsVisible() ) continue;
  370. if( pControl->IsFloat() ) continue;
  371. rcPos = pControl->GetPos();
  372. rcPos.left -= cx;
  373. rcPos.right -= cx;
  374. rcPos.top -= cy;
  375. rcPos.bottom -= cy;
  376. pControl->SetPos(rcPos);
  377. }
  378. Invalidate();
  379. if(m_pVerticalScrollBar)
  380. {
  381. // 发送滚动消息
  382. if( m_pManager != NULL && bMsg ) {
  383. int nPage = (m_pVerticalScrollBar->GetScrollPos() + m_pVerticalScrollBar->GetLineSize()) / m_pVerticalScrollBar->GetLineSize();
  384. m_pManager->SendNotify(this, DUI_MSGTYPE_SCROLL, (WPARAM)nPage);
  385. }
  386. }
  387. }
  388. void CContainerUI::SetScrollStepSize(int nSize)
  389. {
  390. if (nSize >0)
  391. m_nScrollStepSize = nSize;
  392. }
  393. int CContainerUI::GetScrollStepSize() const
  394. {
  395. if(m_pManager )return m_pManager->GetDPIObj()->Scale(m_nScrollStepSize);
  396. return m_nScrollStepSize;
  397. }
  398. void CContainerUI::LineUp()
  399. {
  400. int cyLine = GetScrollStepSize();
  401. if (cyLine == 0) {
  402. cyLine = 8;
  403. if( m_pManager ) cyLine = m_pManager->GetDefaultFontInfo()->tm.tmHeight + 8;
  404. }
  405. SIZE sz = GetScrollPos();
  406. sz.cy -= cyLine;
  407. SetScrollPos(sz);
  408. }
  409. void CContainerUI::LineDown()
  410. {
  411. int cyLine = GetScrollStepSize();
  412. if (cyLine == 0) {
  413. cyLine = 8;
  414. if( m_pManager ) cyLine = m_pManager->GetDefaultFontInfo()->tm.tmHeight + 8;
  415. }
  416. SIZE sz = GetScrollPos();
  417. sz.cy += cyLine;
  418. SetScrollPos(sz);
  419. }
  420. void CContainerUI::PageUp()
  421. {
  422. SIZE sz = GetScrollPos();
  423. int iOffset = m_rcItem.bottom - m_rcItem.top - m_rcInset.top - m_rcInset.bottom;
  424. if( m_pHorizontalScrollBar && m_pHorizontalScrollBar->IsVisible() ) iOffset -= m_pHorizontalScrollBar->GetFixedHeight();
  425. sz.cy -= iOffset;
  426. SetScrollPos(sz);
  427. }
  428. void CContainerUI::PageDown()
  429. {
  430. SIZE sz = GetScrollPos();
  431. int iOffset = m_rcItem.bottom - m_rcItem.top - m_rcInset.top - m_rcInset.bottom;
  432. if( m_pHorizontalScrollBar && m_pHorizontalScrollBar->IsVisible() ) iOffset -= m_pHorizontalScrollBar->GetFixedHeight();
  433. sz.cy += iOffset;
  434. SetScrollPos(sz);
  435. }
  436. void CContainerUI::HomeUp()
  437. {
  438. SIZE sz = GetScrollPos();
  439. sz.cy = 0;
  440. SetScrollPos(sz);
  441. }
  442. void CContainerUI::EndDown()
  443. {
  444. if(m_pManager) {
  445. ::UpdateWindow(m_pManager->GetPaintWindow());
  446. }
  447. SIZE sz = GetScrollPos();
  448. sz.cy = GetScrollRange().cy;
  449. SetScrollPos(sz);
  450. }
  451. void CContainerUI::LineLeft()
  452. {
  453. int nScrollStepSize = GetScrollStepSize();
  454. int cxLine = nScrollStepSize == 0 ? 8 : nScrollStepSize;
  455. SIZE sz = GetScrollPos();
  456. sz.cx -= cxLine;
  457. SetScrollPos(sz);
  458. }
  459. void CContainerUI::LineRight()
  460. {
  461. int nScrollStepSize = GetScrollStepSize();
  462. int cxLine = nScrollStepSize == 0 ? 8 : nScrollStepSize;
  463. SIZE sz = GetScrollPos();
  464. sz.cx += cxLine;
  465. SetScrollPos(sz);
  466. }
  467. void CContainerUI::PageLeft()
  468. {
  469. SIZE sz = GetScrollPos();
  470. RECT rcInset = GetInset();
  471. int iOffset = m_rcItem.right - m_rcItem.left - rcInset.left - rcInset.right;
  472. if( m_pVerticalScrollBar && m_pVerticalScrollBar->IsVisible() ) iOffset -= m_pVerticalScrollBar->GetFixedWidth();
  473. sz.cx -= iOffset;
  474. SetScrollPos(sz);
  475. }
  476. void CContainerUI::PageRight()
  477. {
  478. SIZE sz = GetScrollPos();
  479. RECT rcInset = GetInset();
  480. int iOffset = m_rcItem.right - m_rcItem.left - rcInset.left - rcInset.right;
  481. if( m_pVerticalScrollBar && m_pVerticalScrollBar->IsVisible() ) iOffset -= m_pVerticalScrollBar->GetFixedWidth();
  482. sz.cx += iOffset;
  483. SetScrollPos(sz);
  484. }
  485. void CContainerUI::HomeLeft()
  486. {
  487. SIZE sz = GetScrollPos();
  488. sz.cx = 0;
  489. SetScrollPos(sz);
  490. }
  491. void CContainerUI::EndRight()
  492. {
  493. if(m_pManager) {
  494. ::UpdateWindow(m_pManager->GetPaintWindow());
  495. }
  496. SIZE sz = GetScrollPos();
  497. sz.cx = GetScrollRange().cx;
  498. SetScrollPos(sz);
  499. }
  500. void CContainerUI::EnableScrollBar(bool bEnableVertical, bool bEnableHorizontal)
  501. {
  502. if( bEnableVertical && !m_pVerticalScrollBar ) {
  503. m_pVerticalScrollBar = new CScrollBarUI;
  504. m_pVerticalScrollBar->SetOwner(this);
  505. m_pVerticalScrollBar->SetManager(m_pManager, NULL, false);
  506. if ( m_pManager ) {
  507. LPCTSTR pDefaultAttributes = m_pManager->GetDefaultAttributeList(_T("VScrollBar"));
  508. if( pDefaultAttributes ) {
  509. m_pVerticalScrollBar->ApplyAttributeList(pDefaultAttributes);
  510. }
  511. m_pVerticalScrollBar->SetShow(m_bShowScrollbar);
  512. }
  513. }
  514. else if( !bEnableVertical && m_pVerticalScrollBar ) {
  515. delete m_pVerticalScrollBar;
  516. m_pVerticalScrollBar = NULL;
  517. }
  518. if( bEnableHorizontal && !m_pHorizontalScrollBar ) {
  519. m_pHorizontalScrollBar = new CScrollBarUI;
  520. m_pHorizontalScrollBar->SetHorizontal(true);
  521. m_pHorizontalScrollBar->SetOwner(this);
  522. m_pHorizontalScrollBar->SetManager(m_pManager, NULL, false);
  523. if ( m_pManager ) {
  524. LPCTSTR pDefaultAttributes = m_pManager->GetDefaultAttributeList(_T("HScrollBar"));
  525. if( pDefaultAttributes ) {
  526. m_pHorizontalScrollBar->ApplyAttributeList(pDefaultAttributes);
  527. }
  528. m_pHorizontalScrollBar->SetShow(m_bShowScrollbar);
  529. }
  530. }
  531. else if( !bEnableHorizontal && m_pHorizontalScrollBar ) {
  532. delete m_pHorizontalScrollBar;
  533. m_pHorizontalScrollBar = NULL;
  534. }
  535. NeedUpdate();
  536. }
  537. CScrollBarUI* CContainerUI::GetVerticalScrollBar() const
  538. {
  539. return m_pVerticalScrollBar;
  540. }
  541. CScrollBarUI* CContainerUI::GetHorizontalScrollBar() const
  542. {
  543. return m_pHorizontalScrollBar;
  544. }
  545. int CContainerUI::FindSelectable(int iIndex, bool bForward /*= true*/) const
  546. {
  547. // NOTE: This is actually a helper-function for the list/combo/ect controls
  548. // that allow them to find the next enabled/available selectable item
  549. if( GetCount() == 0 ) return -1;
  550. iIndex = CLAMP(iIndex, 0, GetCount() - 1);
  551. if( bForward ) {
  552. for( int i = iIndex; i < GetCount(); i++ ) {
  553. if( GetItemAt(i)->GetInterface(_T("ListItem")) != NULL
  554. && GetItemAt(i)->IsVisible()
  555. && GetItemAt(i)->IsEnabled() ) return i;
  556. }
  557. return -1;
  558. }
  559. else {
  560. for( int i = iIndex; i >= 0; --i ) {
  561. if( GetItemAt(i)->GetInterface(_T("ListItem")) != NULL
  562. && GetItemAt(i)->IsVisible()
  563. && GetItemAt(i)->IsEnabled() ) return i;
  564. }
  565. return FindSelectable(0, true);
  566. }
  567. }
  568. RECT CContainerUI::GetClientPos() const
  569. {
  570. RECT rc = m_rcItem;
  571. RECT rcInset = GetInset();
  572. rc.left += rcInset.left;
  573. rc.top += rcInset.top;
  574. rc.right -= rcInset.right;
  575. rc.bottom -= rcInset.bottom;
  576. if( m_pVerticalScrollBar && m_pVerticalScrollBar->IsVisible() ) {
  577. rc.top -= m_pVerticalScrollBar->GetScrollPos();
  578. rc.bottom -= m_pVerticalScrollBar->GetScrollPos();
  579. rc.bottom += m_pVerticalScrollBar->GetScrollRange();
  580. rc.right -= m_pVerticalScrollBar->GetFixedWidth();
  581. }
  582. if( m_pHorizontalScrollBar && m_pHorizontalScrollBar->IsVisible() ) {
  583. rc.left -= m_pHorizontalScrollBar->GetScrollPos();
  584. rc.right -= m_pHorizontalScrollBar->GetScrollPos();
  585. rc.right += m_pHorizontalScrollBar->GetScrollRange();
  586. rc.bottom -= m_pHorizontalScrollBar->GetFixedHeight();
  587. }
  588. return rc;
  589. }
  590. void CContainerUI::Move(SIZE szOffset, bool bNeedInvalidate)
  591. {
  592. CControlUI::Move(szOffset, bNeedInvalidate);
  593. if( m_pVerticalScrollBar && m_pVerticalScrollBar->IsVisible() ) m_pVerticalScrollBar->Move(szOffset, false);
  594. if( m_pHorizontalScrollBar && m_pHorizontalScrollBar->IsVisible() ) m_pHorizontalScrollBar->Move(szOffset, false);
  595. for( int it = 0; it < m_items.GetSize(); it++ ) {
  596. CControlUI* pControl = static_cast<CControlUI*>(m_items[it]);
  597. if( pControl != NULL && pControl->IsVisible() ) pControl->Move(szOffset, false);
  598. }
  599. }
  600. void CContainerUI::SetPos(RECT rc, bool bNeedInvalidate)
  601. {
  602. CControlUI::SetPos(rc, bNeedInvalidate);
  603. if( m_items.IsEmpty() ) return;
  604. rc = m_rcItem;
  605. RECT rcInset = GetInset();
  606. rc.left += rcInset.left;
  607. rc.top += rcInset.top;
  608. rc.right -= rcInset.right;
  609. rc.bottom -= rcInset.bottom;
  610. if( m_pVerticalScrollBar && m_pVerticalScrollBar->IsVisible() ) {
  611. rc.top -= m_pVerticalScrollBar->GetScrollPos();
  612. rc.bottom -= m_pVerticalScrollBar->GetScrollPos();
  613. rc.bottom += m_pVerticalScrollBar->GetScrollRange();
  614. rc.right -= m_pVerticalScrollBar->GetFixedWidth();
  615. }
  616. if( m_pHorizontalScrollBar && m_pHorizontalScrollBar->IsVisible() ) {
  617. rc.left -= m_pHorizontalScrollBar->GetScrollPos();
  618. rc.right -= m_pHorizontalScrollBar->GetScrollPos();
  619. rc.right += m_pHorizontalScrollBar->GetScrollRange();
  620. rc.bottom -= m_pHorizontalScrollBar->GetFixedHeight();
  621. }
  622. for( int it = 0; it < m_items.GetSize(); it++ ) {
  623. CControlUI* pControl = static_cast<CControlUI*>(m_items[it]);
  624. if( !pControl->IsVisible() ) continue;
  625. if( pControl->IsFloat() ) {
  626. SetFloatPos(it);
  627. }
  628. else {
  629. SIZE sz = { rc.right - rc.left, rc.bottom - rc.top };
  630. if( sz.cx < pControl->GetMinWidth() ) sz.cx = pControl->GetMinWidth();
  631. if( sz.cx > pControl->GetMaxWidth() ) sz.cx = pControl->GetMaxWidth();
  632. if( sz.cy < pControl->GetMinHeight() ) sz.cy = pControl->GetMinHeight();
  633. if( sz.cy > pControl->GetMaxHeight() ) sz.cy = pControl->GetMaxHeight();
  634. RECT rcCtrl = { rc.left, rc.top, rc.left + sz.cx, rc.top + sz.cy };
  635. pControl->SetPos(rcCtrl, false);
  636. }
  637. }
  638. }
  639. void CContainerUI::SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue)
  640. {
  641. if( _tcsicmp(pstrName, _T("inset")) == 0 ) {
  642. RECT rcInset = { 0 };
  643. LPTSTR pstr = NULL;
  644. rcInset.left = _tcstol(pstrValue, &pstr, 10); ASSERT(pstr);
  645. rcInset.top = _tcstol(pstr + 1, &pstr, 10); ASSERT(pstr);
  646. rcInset.right = _tcstol(pstr + 1, &pstr, 10); ASSERT(pstr);
  647. rcInset.bottom = _tcstol(pstr + 1, &pstr, 10); ASSERT(pstr);
  648. SetInset(rcInset);
  649. }
  650. else if( _tcsicmp(pstrName, _T("mousechild")) == 0 ) SetMouseChildEnabled(_tcsicmp(pstrValue, _T("true")) == 0);
  651. else if( _tcsicmp(pstrName, _T("vscrollbar")) == 0 ) {
  652. EnableScrollBar(_tcsicmp(pstrValue, _T("true")) == 0, GetHorizontalScrollBar() != NULL);
  653. }
  654. else if( _tcsicmp(pstrName, _T("vscrollbarstyle")) == 0 ) {
  655. m_sVerticalScrollBarStyle = pstrValue;
  656. EnableScrollBar(TRUE, GetHorizontalScrollBar() != NULL);
  657. if( GetVerticalScrollBar() ) {
  658. LPCTSTR pStyle = m_pManager->GetStyle(m_sVerticalScrollBarStyle);
  659. if( pStyle ) {
  660. GetVerticalScrollBar()->ApplyAttributeList(pStyle);
  661. }
  662. else {
  663. GetVerticalScrollBar()->ApplyAttributeList(pstrValue);
  664. }
  665. }
  666. }
  667. else if( _tcsicmp(pstrName, _T("hscrollbar")) == 0 ) {
  668. EnableScrollBar(GetVerticalScrollBar() != NULL, _tcsicmp(pstrValue, _T("true")) == 0);
  669. }
  670. else if( _tcsicmp(pstrName, _T("hscrollbarstyle")) == 0 ) {
  671. m_sHorizontalScrollBarStyle = pstrValue;
  672. EnableScrollBar(TRUE, GetHorizontalScrollBar() != NULL);
  673. if( GetHorizontalScrollBar() ) {
  674. LPCTSTR pStyle = m_pManager->GetStyle(m_sHorizontalScrollBarStyle);
  675. if( pStyle ) {
  676. GetHorizontalScrollBar()->ApplyAttributeList(pStyle);
  677. }
  678. else {
  679. GetHorizontalScrollBar()->ApplyAttributeList(pstrValue);
  680. }
  681. }
  682. }
  683. else if( _tcsicmp(pstrName, _T("childpadding")) == 0 ) SetChildPadding(_ttoi(pstrValue));
  684. else if( _tcscmp(pstrName, _T("childalign")) == 0 ) {
  685. if( _tcscmp(pstrValue, _T("left")) == 0 ) m_iChildAlign = DT_LEFT;
  686. else if( _tcscmp(pstrValue, _T("center")) == 0 ) m_iChildAlign = DT_CENTER;
  687. else if( _tcscmp(pstrValue, _T("right")) == 0 ) m_iChildAlign = DT_RIGHT;
  688. }
  689. else if( _tcscmp(pstrName, _T("childvalign")) == 0 ) {
  690. if( _tcscmp(pstrValue, _T("top")) == 0 ) m_iChildVAlign = DT_TOP;
  691. else if( _tcscmp(pstrValue, _T("vcenter")) == 0 ) m_iChildVAlign = DT_VCENTER;
  692. else if( _tcscmp(pstrValue, _T("bottom")) == 0 ) m_iChildVAlign = DT_BOTTOM;
  693. }
  694. else if( _tcsicmp(pstrName, _T("scrollstepsize")) == 0 ) SetScrollStepSize(_ttoi(pstrValue));
  695. else if (_tcsicmp(pstrName, _T("fixedscrollbar")) == 0) SetFixedScrollbar(_tcsicmp(pstrValue, _T("true")) == 0);
  696. else if (_tcsicmp(pstrName, _T("showscrollbar")) == 0) SetShowScrollbar(_tcsicmp(pstrValue, _T("true")) == 0);
  697. else CControlUI::SetAttribute(pstrName, pstrValue);
  698. }
  699. void CContainerUI::SetManager(CPaintManagerUI* pManager, CControlUI* pParent, bool bInit)
  700. {
  701. for( int it = 0; it < m_items.GetSize(); it++ ) {
  702. static_cast<CControlUI*>(m_items[it])->SetManager(pManager, this, bInit);
  703. }
  704. if( m_pVerticalScrollBar != NULL ) m_pVerticalScrollBar->SetManager(pManager, this, bInit);
  705. if( m_pHorizontalScrollBar != NULL ) m_pHorizontalScrollBar->SetManager(pManager, this, bInit);
  706. CControlUI::SetManager(pManager, pParent, bInit);
  707. }
  708. CControlUI* CContainerUI::FindControl(FINDCONTROLPROC Proc, LPVOID pData, UINT uFlags)
  709. {
  710. if( (uFlags & UIFIND_VISIBLE) != 0 && !IsVisible() ) return NULL;
  711. if( (uFlags & UIFIND_ENABLED) != 0 && !IsEnabled() ) return NULL;
  712. if( (uFlags & UIFIND_HITTEST) != 0 && !::PtInRect(&m_rcItem, *(static_cast<LPPOINT>(pData))) ) return NULL;
  713. if( (uFlags & UIFIND_UPDATETEST) != 0 && Proc(this, pData) != NULL ) return NULL;
  714. CControlUI* pResult = NULL;
  715. if( (uFlags & UIFIND_ME_FIRST) != 0 ) {
  716. if( (uFlags & UIFIND_HITTEST) == 0 || IsMouseEnabled() ) pResult = Proc(this, pData);
  717. }
  718. if( pResult == NULL && m_pVerticalScrollBar != NULL ) {
  719. if( (uFlags & UIFIND_HITTEST) == 0 || IsMouseEnabled() ) pResult = m_pVerticalScrollBar->FindControl(Proc, pData, uFlags);
  720. }
  721. if( pResult == NULL && m_pHorizontalScrollBar != NULL ) {
  722. if( (uFlags & UIFIND_HITTEST) == 0 || IsMouseEnabled() ) pResult = m_pHorizontalScrollBar->FindControl(Proc, pData, uFlags);
  723. }
  724. if( pResult != NULL ) return pResult;
  725. if( (uFlags & UIFIND_HITTEST) == 0 || IsMouseChildEnabled() ) {
  726. RECT rc = m_rcItem;
  727. RECT rcInset = GetInset();
  728. rc.left += rcInset.left;
  729. rc.top += rcInset.top;
  730. rc.right -= rcInset.right;
  731. rc.bottom -= rcInset.bottom;
  732. if( m_pVerticalScrollBar && m_pVerticalScrollBar->IsVisible() ) rc.right -= m_pVerticalScrollBar->GetFixedWidth();
  733. if( m_pHorizontalScrollBar && m_pHorizontalScrollBar->IsVisible() ) rc.bottom -= m_pHorizontalScrollBar->GetFixedHeight();
  734. if( (uFlags & UIFIND_TOP_FIRST) != 0 ) {
  735. for( int it = m_items.GetSize() - 1; it >= 0; it-- ) {
  736. pResult = static_cast<CControlUI*>(m_items[it])->FindControl(Proc, pData, uFlags);
  737. if( pResult != NULL ) {
  738. if( (uFlags & UIFIND_HITTEST) != 0 && !pResult->IsFloat() && !::PtInRect(&rc, *(static_cast<LPPOINT>(pData))) )
  739. continue;
  740. else
  741. return pResult;
  742. }
  743. }
  744. }
  745. else {
  746. for( int it = 0; it < m_items.GetSize(); it++ ) {
  747. pResult = static_cast<CControlUI*>(m_items[it])->FindControl(Proc, pData, uFlags);
  748. if( pResult != NULL ) {
  749. if( (uFlags & UIFIND_HITTEST) != 0 && !pResult->IsFloat() && !::PtInRect(&rc, *(static_cast<LPPOINT>(pData))) )
  750. continue;
  751. else
  752. return pResult;
  753. }
  754. }
  755. }
  756. }
  757. pResult = NULL;
  758. if( pResult == NULL && (uFlags & UIFIND_ME_FIRST) == 0 ) {
  759. if( (uFlags & UIFIND_HITTEST) == 0 || IsMouseEnabled() ) pResult = Proc(this, pData);
  760. }
  761. return pResult;
  762. }
  763. bool CContainerUI::DoPaint(HDC hDC, const RECT& rcPaint, CControlUI* pStopControl)
  764. {
  765. RECT rcTemp = { 0 };
  766. if( !::IntersectRect(&rcTemp, &rcPaint, &m_rcItem) ) return true;
  767. CRenderClip clip;
  768. CRenderClip::GenerateClip(hDC, rcTemp, clip);
  769. CControlUI::DoPaint(hDC, rcPaint, pStopControl);
  770. if( m_items.GetSize() > 0 ) {
  771. RECT rcInset = GetInset();
  772. RECT rc = m_rcItem;
  773. rc.left += rcInset.left;
  774. rc.top += rcInset.top;
  775. rc.right -= rcInset.right;
  776. rc.bottom -= rcInset.bottom;
  777. if( m_pVerticalScrollBar && m_pVerticalScrollBar->IsVisible() ) rc.right -= m_pVerticalScrollBar->GetFixedWidth();
  778. if( m_pHorizontalScrollBar && m_pHorizontalScrollBar->IsVisible() ) rc.bottom -= m_pHorizontalScrollBar->GetFixedHeight();
  779. if( !::IntersectRect(&rcTemp, &rcPaint, &rc) ) {
  780. for( int it = 0; it < m_items.GetSize(); it++ ) {
  781. CControlUI* pControl = static_cast<CControlUI*>(m_items[it]);
  782. if( pControl == pStopControl ) return false;
  783. if( !pControl->IsVisible() ) continue;
  784. if( !::IntersectRect(&rcTemp, &rcPaint, &pControl->GetPos()) ) continue;
  785. if( pControl ->IsFloat() ) {
  786. if( !::IntersectRect(&rcTemp, &m_rcItem, &pControl->GetPos()) ) continue;
  787. if( !pControl->Paint(hDC, rcPaint, pStopControl) ) return false;
  788. }
  789. }
  790. }
  791. else {
  792. CRenderClip childClip;
  793. CRenderClip::GenerateClip(hDC, rcTemp, childClip);
  794. for( int it = 0; it < m_items.GetSize(); it++ ) {
  795. CControlUI* pControl = static_cast<CControlUI*>(m_items[it]);
  796. if( pControl == pStopControl ) return false;
  797. if( !pControl->IsVisible() ) continue;
  798. if( !::IntersectRect(&rcTemp, &rcPaint, &pControl->GetPos()) ) continue;
  799. if( pControl->IsFloat() ) {
  800. if( !::IntersectRect(&rcTemp, &m_rcItem, &pControl->GetPos()) ) continue;
  801. CRenderClip::UseOldClipBegin(hDC, childClip);
  802. if( !pControl->Paint(hDC, rcPaint, pStopControl) ) return false;
  803. CRenderClip::UseOldClipEnd(hDC, childClip);
  804. }
  805. else {
  806. if( !::IntersectRect(&rcTemp, &rc, &pControl->GetPos()) ) continue;
  807. if( !pControl->Paint(hDC, rcPaint, pStopControl) ) return false;
  808. }
  809. }
  810. }
  811. }
  812. if( m_pVerticalScrollBar != NULL && m_pVerticalScrollBar->IsVisible() ) {
  813. if( m_pVerticalScrollBar == pStopControl ) return false;
  814. if( ::IntersectRect(&rcTemp, &rcPaint, &m_pVerticalScrollBar->GetPos()) ) {
  815. if( !m_pVerticalScrollBar->Paint(hDC, rcPaint, pStopControl) ) return false;
  816. }
  817. }
  818. if( m_pHorizontalScrollBar != NULL && m_pHorizontalScrollBar->IsVisible() ) {
  819. if( m_pHorizontalScrollBar == pStopControl ) return false;
  820. if( ::IntersectRect(&rcTemp, &rcPaint, &m_pHorizontalScrollBar->GetPos()) ) {
  821. if( !m_pHorizontalScrollBar->Paint(hDC, rcPaint, pStopControl) ) return false;
  822. }
  823. }
  824. return true;
  825. }
  826. void CContainerUI::SetFloatPos(int iIndex)
  827. {
  828. // 因为CControlUI::SetPos对float的操作影响,这里不能对float组件添加滚动条的影响
  829. if( iIndex < 0 || iIndex >= m_items.GetSize() ) return;
  830. CControlUI* pControl = static_cast<CControlUI*>(m_items[iIndex]);
  831. if( !pControl->IsVisible() ) return;
  832. if( !pControl->IsFloat() ) return;
  833. SIZE szXY = pControl->GetFixedXY();
  834. SIZE sz = {pControl->GetFixedWidth(), pControl->GetFixedHeight()};
  835. int nParentWidth = m_rcItem.right - m_rcItem.left;
  836. int nParentHeight = m_rcItem.bottom - m_rcItem.top;
  837. UINT uAlign = pControl->GetFloatAlign();
  838. if(uAlign != 0) {
  839. RECT rcCtrl = {0, 0, sz.cx, sz.cy};
  840. if((uAlign & DT_CENTER) != 0) {
  841. ::OffsetRect(&rcCtrl, (nParentWidth - sz.cx) / 2, 0);
  842. }
  843. else if((uAlign & DT_RIGHT) != 0) {
  844. ::OffsetRect(&rcCtrl, nParentWidth - sz.cx, 0);
  845. }
  846. else {
  847. ::OffsetRect(&rcCtrl, szXY.cx, 0);
  848. }
  849. if((uAlign & DT_VCENTER) != 0) {
  850. ::OffsetRect(&rcCtrl, 0, (nParentHeight - sz.cy) / 2);
  851. }
  852. else if((uAlign & DT_BOTTOM) != 0) {
  853. ::OffsetRect(&rcCtrl, 0, nParentHeight - sz.cy);
  854. }
  855. else {
  856. ::OffsetRect(&rcCtrl, 0, szXY.cy);
  857. }
  858. ::OffsetRect(&rcCtrl, m_rcItem.left, m_rcItem.top);
  859. pControl->SetPos(rcCtrl, false);
  860. }
  861. else {
  862. TPercentInfo rcPercent = pControl->GetFloatPercent();
  863. LONG width = m_rcItem.right - m_rcItem.left;
  864. LONG height = m_rcItem.bottom - m_rcItem.top;
  865. LONG left = szXY.cx < 0 ? m_rcItem.right : m_rcItem.left;
  866. LONG top = szXY.cy < 0 ? m_rcItem.bottom : m_rcItem.top;
  867. RECT rcCtrl = { 0 };
  868. rcCtrl.left = (LONG)(width*rcPercent.left) + szXY.cx + left;
  869. rcCtrl.top = (LONG)(height*rcPercent.top) + szXY.cy + top;
  870. rcCtrl.right = (LONG)(width*rcPercent.right) + szXY.cx + sz.cx + left;
  871. rcCtrl.bottom = (LONG)(height*rcPercent.bottom) + szXY.cy + sz.cy + top;
  872. pControl->SetPos(rcCtrl, false);
  873. }
  874. }
  875. void CContainerUI::ProcessScrollBar(RECT rc, int cxRequired, int cyRequired)
  876. {
  877. while (m_pHorizontalScrollBar)
  878. {
  879. // Scroll needed
  880. if (cxRequired > rc.right - rc.left && !m_pHorizontalScrollBar->IsVisible())
  881. {
  882. m_pHorizontalScrollBar->SetVisible(true);
  883. m_pHorizontalScrollBar->SetScrollRange(cxRequired - (rc.right - rc.left));
  884. m_pHorizontalScrollBar->SetScrollPos(0);
  885. SetPos(m_rcItem);
  886. break;
  887. }
  888. // No scrollbar required
  889. if (!m_pHorizontalScrollBar->IsVisible()) break;
  890. // Scroll not needed anymore?
  891. int cxScroll = cxRequired - (rc.right - rc.left);
  892. if (cxScroll <= 0)
  893. {
  894. m_pHorizontalScrollBar->SetVisible(false);
  895. m_pHorizontalScrollBar->SetScrollPos(0);
  896. m_pHorizontalScrollBar->SetScrollRange(0);
  897. SetPos(m_rcItem);
  898. }
  899. else
  900. {
  901. RECT rcScrollBarPos = { rc.left, rc.bottom, rc.right, rc.bottom + m_pHorizontalScrollBar->GetFixedHeight() };
  902. m_pHorizontalScrollBar->SetPos(rcScrollBarPos);
  903. if (m_pHorizontalScrollBar->GetScrollRange() != cxScroll)
  904. {
  905. int iScrollPos = m_pHorizontalScrollBar->GetScrollPos();
  906. m_pHorizontalScrollBar->SetScrollRange(::abs(cxScroll)); // if scrollpos>range then scrollpos=range
  907. if(iScrollPos > m_pHorizontalScrollBar->GetScrollPos())
  908. {
  909. SetPos(m_rcItem);
  910. }
  911. }
  912. }
  913. break;
  914. }
  915. while (m_pVerticalScrollBar)
  916. {
  917. // Scroll needed
  918. if (cyRequired > rc.bottom - rc.top && !m_pVerticalScrollBar->IsVisible())
  919. {
  920. m_pVerticalScrollBar->SetVisible(true);
  921. m_pVerticalScrollBar->SetScrollRange(cyRequired - (rc.bottom - rc.top));
  922. m_pVerticalScrollBar->SetScrollPos(0);
  923. SetPos(m_rcItem);
  924. break;
  925. }
  926. // No scrollbar required
  927. if (!m_pVerticalScrollBar->IsVisible()) break;
  928. // Scroll not needed anymore?
  929. int cyScroll = cyRequired - (rc.bottom - rc.top);
  930. if (cyScroll <= 0)
  931. {
  932. m_pVerticalScrollBar->SetVisible(false);
  933. m_pVerticalScrollBar->SetScrollPos(0);
  934. m_pVerticalScrollBar->SetScrollRange(0);
  935. SetPos(m_rcItem);
  936. break;
  937. }
  938. RECT rcScrollBarPos = { rc.right, rc.top, rc.right + m_pVerticalScrollBar->GetFixedWidth(), rc.bottom };
  939. m_pVerticalScrollBar->SetPos(rcScrollBarPos);
  940. if (m_pVerticalScrollBar->GetScrollRange() != cyScroll)
  941. {
  942. int iScrollPos = m_pVerticalScrollBar->GetScrollPos();
  943. m_pVerticalScrollBar->SetScrollRange(::abs(cyScroll)); // if scrollpos>range then scrollpos=range
  944. if(iScrollPos > m_pVerticalScrollBar->GetScrollPos())
  945. {
  946. SetPos(m_rcItem);
  947. }
  948. }
  949. break;
  950. }
  951. }
  952. bool CContainerUI::SetSubControlText( LPCTSTR pstrSubControlName,LPCTSTR pstrText )
  953. {
  954. CControlUI* pSubControl=NULL;
  955. pSubControl=this->FindSubControl(pstrSubControlName);
  956. if (pSubControl!=NULL) {
  957. pSubControl->SetText(pstrText);
  958. return TRUE;
  959. }
  960. else return FALSE;
  961. }
  962. bool CContainerUI::SetSubControlFixedHeight( LPCTSTR pstrSubControlName,int cy )
  963. {
  964. CControlUI* pSubControl=NULL;
  965. pSubControl=this->FindSubControl(pstrSubControlName);
  966. if (pSubControl!=NULL) {
  967. pSubControl->SetFixedHeight(cy);
  968. return TRUE;
  969. }
  970. else return FALSE;
  971. }
  972. bool CContainerUI::SetSubControlFixedWdith( LPCTSTR pstrSubControlName,int cx )
  973. {
  974. CControlUI* pSubControl=NULL;
  975. pSubControl=this->FindSubControl(pstrSubControlName);
  976. if (pSubControl!=NULL) {
  977. pSubControl->SetFixedWidth(cx);
  978. return TRUE;
  979. }
  980. else return FALSE;
  981. }
  982. bool CContainerUI::SetSubControlUserData( LPCTSTR pstrSubControlName,LPCTSTR pstrText )
  983. {
  984. CControlUI* pSubControl=NULL;
  985. pSubControl=this->FindSubControl(pstrSubControlName);
  986. if (pSubControl!=NULL) {
  987. pSubControl->SetUserData(pstrText);
  988. return TRUE;
  989. }
  990. else return FALSE;
  991. }
  992. DuiLib::CDuiString CContainerUI::GetSubControlText( LPCTSTR pstrSubControlName )
  993. {
  994. CControlUI* pSubControl=NULL;
  995. pSubControl=this->FindSubControl(pstrSubControlName);
  996. if (pSubControl==NULL)
  997. return _T("");
  998. else
  999. return pSubControl->GetText();
  1000. }
  1001. int CContainerUI::GetSubControlFixedHeight( LPCTSTR pstrSubControlName )
  1002. {
  1003. CControlUI* pSubControl=NULL;
  1004. pSubControl=this->FindSubControl(pstrSubControlName);
  1005. if (pSubControl==NULL) return -1;
  1006. else return pSubControl->GetFixedHeight();
  1007. }
  1008. int CContainerUI::GetSubControlFixedWdith( LPCTSTR pstrSubControlName )
  1009. {
  1010. CControlUI* pSubControl=NULL;
  1011. pSubControl=this->FindSubControl(pstrSubControlName);
  1012. if (pSubControl==NULL) return -1;
  1013. else return pSubControl->GetFixedWidth();
  1014. }
  1015. const CDuiString CContainerUI::GetSubControlUserData( LPCTSTR pstrSubControlName )
  1016. {
  1017. CControlUI* pSubControl=NULL;
  1018. pSubControl=this->FindSubControl(pstrSubControlName);
  1019. if (pSubControl==NULL) return _T("");
  1020. else return pSubControl->GetUserData();
  1021. }
  1022. CControlUI* CContainerUI::FindSubControl( LPCTSTR pstrSubControlName )
  1023. {
  1024. CControlUI* pSubControl=NULL;
  1025. pSubControl = static_cast<CControlUI*>(GetManager()->FindSubControlByName(this, pstrSubControlName));
  1026. return pSubControl;
  1027. }
  1028. } // namespace DuiLib