UIContainer.cpp 36 KB

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