UIContainer.cpp 33 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168
  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