ExtControlsCommon.cpp
上传用户:sesekoo
上传日期:2020-07-18
资源大小:21543k
文件大小:275k
源码类别:

界面编程

开发平台:

Visual C++

  1. }
  2. else
  3. {
  4. if( ( TreeGetStyle() & __EXT_TREE_SUBTRACT_SELECTION ) != 0 )
  5. TreeModifyStyle( 0, __EXT_TREE_SUBTRACT_SELECTION );
  6. }
  7. }
  8. bool CExtTreeCtrl::FullRowSelectionGet() const
  9. {
  10. ASSERT_VALID(this);
  11. return ( ( GetStyle() & TVS_FULLROWSELECT ) != 0 ) ? true : false;
  12. }
  13. void CExtTreeCtrl::FullRowSelectionSet( bool bSet /*= true*/ )
  14. {
  15. ASSERT_VALID(this);
  16. if( bSet )
  17. {
  18. if( ( GetStyle() & TVS_FULLROWSELECT ) == 0 )
  19. ModifyStyle( 0, TVS_FULLROWSELECT );
  20. }
  21. else
  22. {
  23. if( ( GetStyle() & TVS_FULLROWSELECT ) != 0 )
  24. ModifyStyle( TVS_FULLROWSELECT, 0 );
  25. }
  26. }
  27. bool CExtTreeCtrl::HasButtonsGet() const
  28. {
  29. ASSERT_VALID(this);
  30. return ( ( GetStyle() & TVS_HASBUTTONS ) != 0 ) ? true : false;
  31. }
  32. void CExtTreeCtrl::HasButtonsSet( bool bSet /*= true*/ )
  33. {
  34. ASSERT_VALID(this);
  35. if( bSet )
  36. {
  37. if( ( GetStyle() & TVS_HASBUTTONS ) == 0 )
  38. ModifyStyle( 0, TVS_HASBUTTONS );
  39. }
  40. else
  41. {
  42. if( ( GetStyle() & TVS_HASBUTTONS ) != 0 )
  43. ModifyStyle( TVS_HASBUTTONS, 0 );
  44. }
  45. }
  46. bool CExtTreeCtrl::HasLinesGet() const
  47. {
  48. ASSERT_VALID(this);
  49. return ( ( GetStyle() & TVS_HASLINES ) != 0 ) ? true : false;
  50. }
  51. void CExtTreeCtrl::HasLinesSet( bool bSet /*= true*/ )
  52. {
  53. ASSERT_VALID(this);
  54. if( bSet )
  55. {
  56. if( ( GetStyle() & TVS_HASLINES ) == 0 )
  57. ModifyStyle( 0, TVS_HASLINES );
  58. }
  59. else
  60. {
  61. if( ( GetStyle() & TVS_HASLINES ) != 0 )
  62. ModifyStyle( TVS_HASLINES, 0 );
  63. }
  64. }
  65. bool CExtTreeCtrl::LinesAtRootGet() const
  66. {
  67. ASSERT_VALID(this);
  68. return ( ( GetStyle() & TVS_LINESATROOT ) != 0 ) ? true : false;
  69. }
  70. void CExtTreeCtrl::LinesAtRootSet( bool bSet /*= true*/ )
  71. {
  72. ASSERT_VALID(this);
  73. if( bSet )
  74. {
  75. if( ( GetStyle() & TVS_LINESATROOT ) == 0 )
  76. ModifyStyle( 0, TVS_LINESATROOT );
  77. }
  78. else
  79. {
  80. if( ( GetStyle() & TVS_LINESATROOT ) != 0 )
  81. ModifyStyle( TVS_LINESATROOT, 0 );
  82. }
  83. }
  84. bool CExtTreeCtrl::ShowSelectionAlwaysGet() const
  85. {
  86. ASSERT_VALID(this);
  87. return ( ( GetStyle() & TVS_SHOWSELALWAYS ) != 0 ) ? true : false;
  88. }
  89. void CExtTreeCtrl::ShowSelectionAlwaysSet( bool bSet /*= true*/ )
  90. {
  91. ASSERT_VALID(this);
  92. if( bSet )
  93. {
  94. if( ( GetStyle() & TVS_SHOWSELALWAYS ) == 0 )
  95. ModifyStyle( 0, TVS_SHOWSELALWAYS );
  96. }
  97. else
  98. {
  99. if( ( GetStyle() & TVS_SHOWSELALWAYS ) != 0 )
  100. ModifyStyle( TVS_SHOWSELALWAYS, 0 );
  101. }
  102. }
  103. bool CExtTreeCtrl::SingleExpandGet() const
  104. {
  105. ASSERT_VALID(this);
  106. return ( ( GetStyle() & TVS_SINGLEEXPAND ) != 0 ) ? true : false;
  107. }
  108. void CExtTreeCtrl::SingleExpandSet( bool bSet /*= true*/ )
  109. {
  110. ASSERT_VALID(this);
  111. if( bSet )
  112. {
  113. if( ( GetStyle() & TVS_SINGLEEXPAND ) == 0 )
  114. ModifyStyle( 0, TVS_SINGLEEXPAND );
  115. }
  116. else
  117. {
  118. if( ( GetStyle() & TVS_SINGLEEXPAND ) != 0 )
  119. ModifyStyle( TVS_SINGLEEXPAND, 0 );
  120. }
  121. }
  122. bool CExtTreeCtrl::TrackSelectionGet() const
  123. {
  124. ASSERT_VALID(this);
  125. return ( ( GetStyle() & TVS_TRACKSELECT ) != 0 ) ? true : false;
  126. }
  127. void CExtTreeCtrl::TrackSelectionSet( bool bSet /*= true*/ )
  128. {
  129. ASSERT_VALID(this);
  130. if( bSet )
  131. {
  132. if( ( GetStyle() & TVS_TRACKSELECT ) == 0 )
  133. ModifyStyle( 0, TVS_TRACKSELECT );
  134. }
  135. else
  136. {
  137. if( ( GetStyle() & TVS_TRACKSELECT ) != 0 )
  138. ModifyStyle( TVS_TRACKSELECT, 0 );
  139. }
  140. }
  141. //bool CExtTreeCtrl::CheckBoxesGet() const
  142. //{
  143. // ASSERT_VALID(this);
  144. // return ( ( GetStyle() & TVS_CHECKBOXES ) != 0 ) ? true : false;
  145. //}
  146. //void CExtTreeCtrl::CheckBoxesSet( bool bSet /*= true*/ )
  147. //{
  148. // ASSERT_VALID(this);
  149. // if( bSet )
  150. // {
  151. // if( ( GetStyle() & TVS_CHECKBOXES ) == 0 )
  152. // ModifyStyle( 0, TVS_CHECKBOXES );
  153. // }
  154. // else
  155. // {
  156. // if( ( GetStyle() & TVS_CHECKBOXES ) != 0 )
  157. // ModifyStyle( TVS_CHECKBOXES, 0 );
  158. // }
  159. //}
  160. bool CExtTreeCtrl::HoverDisabledItemsGet() const
  161. {
  162. ASSERT_VALID(this);
  163. return ( ( TreeGetStyle() & __EXT_TREE_HOVER_DISABLE_ITEMS ) != 0 ) ? true : false;
  164. }
  165. void CExtTreeCtrl::HoverDisabledItemsSet( bool bSet /*= true*/ )
  166. {
  167. ASSERT_VALID(this);
  168. if( bSet )
  169. {
  170. if( ( TreeGetStyle() & __EXT_TREE_HOVER_DISABLE_ITEMS ) == 0 )
  171. TreeModifyStyle( __EXT_TREE_HOVER_DISABLE_ITEMS, 0 );
  172. }
  173. else
  174. {
  175. if( ( TreeGetStyle() & __EXT_TREE_HOVER_DISABLE_ITEMS ) != 0 )
  176. TreeModifyStyle( 0, __EXT_TREE_HOVER_DISABLE_ITEMS );
  177. }
  178. }
  179. bool CExtTreeCtrl::AutoDisableChildrenItemsGet() const
  180. {
  181. ASSERT_VALID(this);
  182. return ( ( TreeGetStyle() & __EXT_TREE_AUTO_DISABLE_ITEMS_BY_PARENT ) != 0 ) ? true : false;
  183. }
  184. void CExtTreeCtrl::AutoDisableChildrenItemsSet( bool bSet /*= true*/ )
  185. {
  186. ASSERT_VALID(this);
  187. if( bSet )
  188. {
  189. if( ( TreeGetStyle() & __EXT_TREE_AUTO_DISABLE_ITEMS_BY_PARENT ) == 0 )
  190. TreeModifyStyle( __EXT_TREE_AUTO_DISABLE_ITEMS_BY_PARENT, 0 );
  191. }
  192. else
  193. {
  194. if( ( TreeGetStyle() & __EXT_TREE_AUTO_DISABLE_ITEMS_BY_PARENT ) != 0 )
  195. TreeModifyStyle( 0, __EXT_TREE_AUTO_DISABLE_ITEMS_BY_PARENT );
  196. }
  197. }
  198. bool CExtTreeCtrl::HoverTreeBoxesGet() const
  199. {
  200. ASSERT_VALID(this);
  201. return ( ( TreeGetStyleEx() & __EXT_TREE_EX_HOVER_TREE_BOXES ) != 0 ) ? true : false;
  202. }
  203. void CExtTreeCtrl::HoverTreeBoxesSet( bool bSet /*= true*/ )
  204. {
  205. ASSERT_VALID(this);
  206. if( bSet )
  207. {
  208. if( ( TreeGetStyleEx() & __EXT_TREE_EX_HOVER_TREE_BOXES ) == 0 )
  209. TreeModifyStyleEx( __EXT_TREE_EX_HOVER_TREE_BOXES, NULL );
  210. }
  211. else
  212. {
  213. if( ( TreeGetStyleEx() & __EXT_TREE_EX_HOVER_TREE_BOXES ) != 0 )
  214. TreeModifyStyleEx( NULL, __EXT_TREE_EX_HOVER_TREE_BOXES );
  215. }
  216. }
  217. bool CExtTreeCtrl::HoverCheckBoxesGet() const
  218. {
  219. ASSERT_VALID(this);
  220. return ( ( TreeGetStyleEx() & __EXT_TREE_EX_HOVER_CHECK_BOXES ) != 0 ) ? true : false;
  221. }
  222. void CExtTreeCtrl::HoverCheckBoxesSet( bool bSet /*= true*/ )
  223. {
  224. ASSERT_VALID(this);
  225. if( bSet )
  226. {
  227. if( ( TreeGetStyleEx() & __EXT_TREE_EX_HOVER_CHECK_BOXES ) == 0 )
  228. TreeModifyStyleEx( __EXT_TREE_EX_HOVER_CHECK_BOXES, NULL );
  229. }
  230. else
  231. {
  232. if( ( TreeGetStyleEx() & __EXT_TREE_EX_HOVER_CHECK_BOXES ) != 0 )
  233. TreeModifyStyleEx( NULL, __EXT_TREE_EX_HOVER_CHECK_BOXES );
  234. }
  235. }
  236. bool CExtTreeCtrl::HoverRadioBoxesGet() const
  237. {
  238. ASSERT_VALID(this);
  239. return ( ( TreeGetStyleEx() & __EXT_TREE_EX_HOVER_RADIO_BUTTONS ) != 0 ) ? true : false;
  240. }
  241. void CExtTreeCtrl::HoverRadioBoxesSet( bool bSet /*= true*/ )
  242. {
  243. ASSERT_VALID(this);
  244. if( bSet )
  245. {
  246. if( ( TreeGetStyleEx() & __EXT_TREE_EX_HOVER_RADIO_BUTTONS ) == 0 )
  247. TreeModifyStyleEx( __EXT_TREE_EX_HOVER_RADIO_BUTTONS, NULL );
  248. }
  249. else
  250. {
  251. if( ( TreeGetStyleEx() & __EXT_TREE_EX_HOVER_RADIO_BUTTONS ) != 0 )
  252. TreeModifyStyleEx( NULL, __EXT_TREE_EX_HOVER_RADIO_BUTTONS );
  253. }
  254. }
  255. INT CExtTreeCtrl::OnTreeItemCalcCheckBoxAreaWidth() const
  256. {
  257. ASSERT_VALID(this);
  258. INT nLevelIndent = (INT)GetIndent();
  259. INT nCheckBoxWidth = max( nLevelIndent, 16 );
  260. return nCheckBoxWidth;
  261. }
  262. bool CExtTreeCtrl::TreeItemRectsGet(
  263. HTREEITEM hti,
  264. CRect * pRectEntire,
  265. CRect * pRectLinesArea, // = NULL
  266. CRect * pRectExpandCollapseButton, // = NULL
  267. CRect * pRectCheckBox, // = NULL
  268. CRect * pRectIcon, // = NULL
  269. CRect * pRectLabel, // = NULL
  270. CRect * pRectControl, // = NULL
  271. CRect * pRectRightPart // = NULL
  272. ) const
  273. {
  274. ASSERT_VALID(this);
  275. CRect rcDefItemLabel;
  276. if( ! CTreeCtrl::GetItemRect( hti, &rcDefItemLabel, true ) )
  277. return false;
  278. CRect rcClient;
  279. GetClientRect( &rcClient );
  280. ((CWnd*)this)->CWnd::RepositionBars( 0, 0xFFFF, 0, CWnd::reposQuery, &rcClient, &rcClient );
  281. CRect rcEntire(
  282. rcClient.left,
  283. rcDefItemLabel.top,
  284. rcClient.right,
  285. rcDefItemLabel.bottom
  286. );
  287. if( pRectEntire != NULL )
  288. (*pRectEntire) = rcEntire;
  289. CRect rcLinesArea(
  290. rcClient.left,
  291. rcDefItemLabel.top - 1,
  292. rcDefItemLabel.left, // - nLevelIndent,
  293. rcDefItemLabel.bottom + 1
  294. );
  295. if( pRectLinesArea != NULL )
  296. (*pRectLinesArea) = rcLinesArea;
  297. INT nLevelIndent = (INT)GetIndent();
  298. CRect rcTreeBox(
  299. rcDefItemLabel.left - nLevelIndent,
  300. rcDefItemLabel.top - 1,
  301. rcDefItemLabel.left,
  302. rcDefItemLabel.bottom + 1
  303. );
  304. if( pRectExpandCollapseButton != NULL )
  305. (*pRectExpandCollapseButton) = rcTreeBox;
  306. const CExtCmdIcon * pIcon = OnTreeItemQueryIcon( hti );
  307. const TREEITEMINFO_t & _TII = TreeItemInfoGet( hti );
  308. INT _marginCheckBoxLeft = ( ( _TII.m_eCheckBoxType != e_cbt_none ) ? MarginCheckBoxLeftGet() : 0 ),
  309. _marginCheckBoxRight = ( ( _TII.m_eCheckBoxType != e_cbt_none ) ? MarginCheckBoxRightGet() : 0 ),
  310. _marginIconLeft = ( ( pIcon != NULL ) ? MarginIconLeftGet() : 0 ),
  311. _marginIconRight = ( ( pIcon != NULL ) ? MarginIconRightGet() : 0 ),
  312. _marginControlLabelLeft = ( ( _TII.m_nControlWidth > 0 && ( ! _TII.m_strEditText.IsEmpty() ) ) ? MarginControlLabelLeftGet() : 0 ),
  313. _marginControlLabelRight = ( ( _TII.m_nControlWidth > 0 && ( ! _TII.m_strEditText.IsEmpty() ) ) ? MarginControlLabelRightGet() : 0 );
  314. CRect rcCheckBox(
  315. rcDefItemLabel.left + _marginCheckBoxLeft,
  316. rcDefItemLabel.top,
  317. rcDefItemLabel.left + _marginCheckBoxLeft,
  318. rcDefItemLabel.bottom
  319. );
  320. if( _TII.m_eCheckBoxType != e_cbt_none )
  321. {
  322. INT nCheckBoxWidth = OnTreeItemCalcCheckBoxAreaWidth();
  323. rcCheckBox.right += nCheckBoxWidth;
  324. if( pRectCheckBox != NULL )
  325. (*pRectCheckBox) = rcCheckBox;
  326. }
  327. CRect rcIcon(
  328. rcCheckBox.right + _marginIconLeft + _marginCheckBoxRight,
  329. rcCheckBox.top,
  330. rcCheckBox.right + _marginIconLeft + _marginCheckBoxRight,
  331. rcCheckBox.bottom
  332. );
  333. if( pIcon != NULL )
  334. {
  335. CSize _sizeIcon = pIcon->GetSize();
  336. rcIcon.right += _sizeIcon.cx;
  337. if( pRectIcon != NULL )
  338. (*pRectIcon) = rcIcon;
  339. }
  340. CRect rcLabel(
  341. rcIcon.right + MarginLabelLeftGet() + ( ( pIcon != NULL ) ? _marginIconRight : _marginCheckBoxRight ),
  342. rcIcon.top,
  343. rcIcon.right + TreeItemCalcLabelWidth( hti ) + MarginLabelLeftGet() + ( ( pIcon != NULL ) ? _marginIconRight : _marginCheckBoxRight ),
  344. rcIcon.bottom
  345. );
  346. if( pRectLabel != NULL )
  347. (*pRectLabel) = rcLabel;
  348. CRect rcControl(
  349. rcLabel.right + _marginControlLabelLeft + MarginLabelRightGet(),
  350. rcLabel.top,
  351. rcLabel.right + _marginControlLabelLeft + MarginLabelRightGet(),
  352. rcLabel.bottom + __EXT_TREE_CTRL_BORDER_GAP
  353. );
  354. if( _TII.m_nControlWidth > 0 )
  355. rcControl.right += _TII.m_nControlWidth; //  + 6
  356. if( pRectControl != NULL )
  357. (*pRectControl) = rcControl;
  358. CRect rcRightPart(
  359. rcControl.right + ( ( _TII.m_nControlWidth > 0 && ( ! _TII.m_strEditText.IsEmpty() ) ) ? _marginControlLabelRight : 0 ),
  360. rcControl.top,
  361. rcClient.right,
  362. rcControl.bottom
  363. );
  364. if( pRectRightPart != NULL )
  365. (*pRectRightPart) = rcRightPart;
  366. return true;
  367. }
  368. bool CExtTreeCtrl::TreeItemRectGet(
  369. HTREEITEM hti,
  370. CRect & rcRetVal,
  371. CExtTreeCtrl::e_tree_item_rect_type_t eTIRT
  372. ) const
  373. {
  374. ASSERT_VALID(this);
  375. bool bRetVal = false;
  376. switch( eTIRT )
  377. {
  378. case e_tirt_entire:
  379. bRetVal = TreeItemRectsGet( hti, &rcRetVal );
  380. break;
  381. case e_tirt_line_area:
  382. bRetVal = TreeItemRectsGet( hti, NULL, &rcRetVal );
  383. break;
  384. case e_tirt_tree_box:
  385. bRetVal = TreeItemRectsGet( hti, NULL, NULL, &rcRetVal );
  386. break;
  387. case e_tirt_check_box:
  388. {
  389. const TREEITEMINFO_t & _TII = TreeItemInfoGet( hti );
  390. if( _TII.m_eCheckBoxType != e_cbt_none )
  391. bRetVal = TreeItemRectsGet( hti, NULL, NULL, NULL, &rcRetVal );
  392. }
  393. break;
  394. case e_tirt_icon:
  395. {
  396. const CExtCmdIcon * pIcon = OnTreeItemQueryIcon( hti );
  397. if( pIcon != NULL )
  398. bRetVal = TreeItemRectsGet( hti, NULL, NULL, NULL, NULL, &rcRetVal );
  399. }
  400. break;
  401. case e_tirt_label:
  402. bRetVal = TreeItemRectsGet( hti, NULL, NULL, NULL, NULL, NULL, &rcRetVal );
  403. break;
  404. case e_tirt_control:
  405. bRetVal = TreeItemRectsGet( hti, NULL, NULL, NULL, NULL, NULL, NULL, &rcRetVal );
  406. break;
  407. case e_tirt_right_part:
  408. bRetVal = TreeItemRectsGet( hti, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &rcRetVal );
  409. break;
  410. }; // switch( eTIRT )
  411. return bRetVal;
  412. }
  413. INT CExtTreeCtrl::TreeItemCalcLabelWidth(
  414. HTREEITEM hti
  415. ) const
  416. {
  417. ASSERT_VALID(this);
  418. INT nWidth = 0;
  419. CWindowDC dc( NULL );
  420. CExtSafeString strItemText = GetItemText( hti );
  421. if( ! strItemText.IsEmpty() )
  422. {
  423. const TREEITEMINFO_t & _TII = TreeItemInfoGet( hti );
  424. CFont * pFont = &m_fontNormal;
  425. if( _TII.m_bBold || _TII.m_bItalic )
  426. {
  427. if( _TII.m_bBold && _TII.m_bItalic )
  428. pFont = &m_fontBoldItalic;
  429. else if( _TII.m_bBold )
  430. pFont = &m_fontBold;
  431. else if( _TII.m_bItalic )
  432. pFont = &m_fontItalic;
  433. if( _TII.m_bItalic )
  434. nWidth += 3;
  435. }
  436. pFont = dc.SelectObject( pFont );
  437. CRect rcText( 0, 0, 0, 0 );
  438. dc.DrawText( LPCTSTR(strItemText), strItemText.GetLength(), rcText, DT_SINGLELINE | DT_LEFT | DT_TOP | DT_CALCRECT );
  439. dc.SelectObject( pFont );
  440. nWidth += rcText.Width();
  441. }
  442. return nWidth + PaddingLabelLeftGet() + PaddingLabelRightGet(); // + 6
  443. }
  444. HTREEITEM CExtTreeCtrl::TreeItemHitTest(
  445. CPoint ptClient,
  446. DWORD & dwHitTestFlags
  447. ) const
  448. {
  449. ASSERT_VALID(this);
  450. dwHitTestFlags = __EXT_TVHT_NOWHERE;
  451. CRect rcClient, rc;
  452. GetClientRect( &rcClient );
  453. HTREEITEM hti = GetNextItem( NULL, TVGN_FIRSTVISIBLE );
  454. for( ; hti != NULL; hti = GetNextItem( hti, TVGN_NEXTVISIBLE ) )
  455. {
  456. CRect rcEntire, rcLinesArea, rcTreeBox, rcCheckBox,
  457. rcIcon, rcLabel, rcControl, rcRightPart;
  458. if( ! CExtTreeCtrl::TreeItemRectsGet(
  459. hti,
  460. &rcEntire,
  461. &rcLinesArea,
  462. &rcTreeBox,
  463. &rcCheckBox,
  464. &rcIcon,
  465. &rcLabel,
  466. &rcControl,
  467. &rcRightPart
  468. )
  469. )
  470. continue;
  471. if( rcEntire.top > rcClient.bottom )
  472. break;
  473. if( ! rcEntire.PtInRect( ptClient ) )
  474. continue;
  475. if( (! rcLabel.IsRectEmpty() )
  476. && rcLabel.PtInRect( ptClient )
  477. )
  478. {
  479. dwHitTestFlags = __EXT_TVHT_ONITEMLABEL;
  480. return hti;
  481. }
  482. if( (! rcIcon.IsRectEmpty() )
  483. && rcIcon.PtInRect( ptClient )
  484. )
  485. {
  486. dwHitTestFlags = __EXT_TVHT_ONITEMICON;
  487. return hti;
  488. }
  489. if( (! rcCheckBox.IsRectEmpty() )
  490. && rcCheckBox.PtInRect( ptClient )
  491. )
  492. {
  493. dwHitTestFlags = __EXT_TVHT_ONCHECKBOX;
  494. return hti;
  495. }
  496. if( (! rcTreeBox.IsRectEmpty() )
  497. && rcTreeBox.PtInRect( ptClient )
  498. )
  499. {
  500. dwHitTestFlags = __EXT_TVHT_ONITEMBUTTON|__EXT_TVHT_ONITEMINDENT;
  501. return hti;
  502. }
  503. if( (! rcLinesArea.IsRectEmpty() )
  504. && rcLinesArea.PtInRect( ptClient )
  505. )
  506. {
  507. dwHitTestFlags = __EXT_TVHT_ONITEMINDENT;
  508. return hti;
  509. }
  510. if( (! rcControl.IsRectEmpty() )
  511. && rcControl.PtInRect( ptClient )
  512. )
  513. {
  514. dwHitTestFlags = __EXT_TVHT_ONCONTROL;
  515. return hti;
  516. }
  517. if( (! rcRightPart.IsRectEmpty() )
  518. && rcRightPart.PtInRect( ptClient )
  519. )
  520. {
  521. dwHitTestFlags = __EXT_TVHT_ONITEMRIGHT;
  522. return hti;
  523. }
  524. return hti;
  525. }
  526. return NULL;
  527. }
  528. void CExtTreeCtrl::_DoDelayedTreeIconInit()
  529. {
  530. ASSERT_VALID( this );
  531. }
  532. INT CExtTreeCtrl::TreeIconGetCount() const
  533. {
  534. ASSERT_VALID( this );
  535. ( const_cast < CExtTreeCtrl * > ( this ) ) -> _DoDelayedTreeIconInit();
  536. return (INT)m_arrIcons.GetSize();
  537. }
  538. void CExtTreeCtrl::TreeIconInsert(
  539. const CExtCmdIcon & _icon,
  540. INT nPos
  541. )
  542. {
  543. ASSERT_VALID( this );
  544. _DoDelayedTreeIconInit();
  545. if( nPos < 0 || nPos > TreeIconGetCount() )
  546. {
  547. ASSERT( FALSE );
  548. ::AfxThrowUserException();
  549. }
  550. m_arrIcons.InsertAt( nPos, new CExtCmdIcon( _icon ) );
  551. }
  552. void CExtTreeCtrl::TreeIconAdd(
  553. const CExtCmdIcon & _icon
  554. )
  555. {
  556. ASSERT_VALID( this );
  557. TreeIconInsert( _icon, TreeIconGetCount() );
  558. }
  559. void CExtTreeCtrl::TreeIconRemove(
  560. INT nPos,
  561. INT nCount // = 1
  562. )
  563. {
  564. ASSERT_VALID( this );
  565. if( nPos < 0 || nCount <= 0 )
  566. return;
  567. _DoDelayedTreeIconInit();
  568. INT nInconIndex, nIconCount = TreeIconGetCount();
  569. if( ( nPos + nCount ) > nIconCount )
  570. nCount = nIconCount - nPos;
  571. if( nCount <= 0 )
  572. return;
  573. for( nInconIndex = 0; nInconIndex < nCount; nInconIndex ++ )
  574. {
  575. CExtCmdIcon * pIcon = m_arrIcons[ nPos + nInconIndex ];
  576. ASSERT( pIcon != NULL );
  577. delete pIcon;
  578. }
  579. m_arrIcons.RemoveAt( nPos, nCount );
  580. }
  581. void CExtTreeCtrl::TreeIconRemoveAll()
  582. {
  583. ASSERT_VALID( this );
  584. TreeIconRemove( 0, TreeIconGetCount() );
  585. }
  586. CExtCmdIcon & CExtTreeCtrl::TreeIconGetAt( INT nPos )
  587. {
  588. ASSERT_VALID( this );
  589. _DoDelayedTreeIconInit();
  590. if( nPos < 0 || nPos >= TreeIconGetCount() )
  591. {
  592. ASSERT( FALSE );
  593. ::AfxThrowUserException();
  594. }
  595. CExtCmdIcon * pIcon = m_arrIcons[ nPos ];
  596. ASSERT( pIcon != NULL );
  597. return (*pIcon);
  598. }
  599. const CExtCmdIcon & CExtTreeCtrl::TreeIconGetAt( INT nPos ) const
  600. {
  601. ASSERT_VALID( this );
  602. return ( const_cast < CExtTreeCtrl * > ( this ) ) -> TreeIconGetAt( nPos );
  603. }
  604. LRESULT CExtTreeCtrl::OnSetFont( WPARAM wParam, LPARAM lParam )
  605. {
  606. ASSERT_VALID( this );
  607. wParam;
  608. lParam;
  609. LRESULT lr = Default();
  610. _FontsSync();
  611. return lr;
  612. }
  613. LRESULT CExtTreeCtrl::OnSettingChange( WPARAM wParam, LPARAM lParam )
  614. {
  615. ASSERT_VALID( this );
  616. wParam;
  617. lParam;
  618. LRESULT lr = Default();
  619. _FontsSync();
  620. return lr;
  621. }
  622. void CExtTreeCtrl::OnHScroll( UINT nSBCode, UINT nPos, CScrollBar* pScrollBar )
  623. {
  624. ASSERT_VALID( this );
  625. if( m_hWndChildControl != NULL )
  626. {
  627. SendMessage( WM_CANCELMODE );
  628. if( ::GetFocus() != m_hWnd )
  629. SetFocus();
  630. }
  631. CTreeCtrl::OnHScroll(nSBCode, nPos, pScrollBar);
  632. Invalidate();
  633. }
  634. void CExtTreeCtrl::OnVScroll( UINT nSBCode, UINT nPos, CScrollBar* pScrollBar )
  635. {
  636. ASSERT_VALID( this );
  637. if( m_hWndChildControl != NULL )
  638. {
  639. SendMessage( WM_CANCELMODE );
  640. if( ::GetFocus() != m_hWnd )
  641. SetFocus();
  642. }
  643. CTreeCtrl::OnVScroll(nSBCode, nPos, pScrollBar);
  644. }
  645. void CExtTreeCtrl::OnSize( UINT nType, int cx, int cy )
  646. {
  647. ASSERT_VALID( this );
  648. CTreeCtrl::OnSize(nType, cx, cy);
  649. if( nType == SIZE_MINIMIZED )
  650. return;
  651. CWnd::RepositionBars( 0, 0xFFFF, 0 );
  652. }
  653. LRESULT CExtTreeCtrl::OnStyleChanging( WPARAM wParam, LPARAM lParam )
  654. {
  655. ASSERT_VALID( this );
  656. wParam;
  657. lParam;
  658. m_wndContentExpand.Deactivate();
  659. LRESULT lr = Default();
  660. return lr;
  661. }
  662. LRESULT CExtTreeCtrl::OnStyleChanged( WPARAM wParam, LPARAM lParam )
  663. {
  664. ASSERT_VALID( this );
  665. wParam;
  666. lParam;
  667. LRESULT lr = Default();
  668. return lr;
  669. }
  670. void CExtTreeCtrl::_FontsSync()
  671. {
  672. ASSERT_VALID( this );
  673. _FontsDestroy();
  674. ASSERT( GetSafeHwnd() != NULL );
  675. HFONT hFont = (HFONT)SendMessage( WM_GETFONT );
  676. if( hFont == NULL )
  677. {
  678. hFont = (HFONT)::GetStockObject( DEFAULT_GUI_FONT );
  679. if( hFont == NULL )
  680. {
  681. hFont = (HFONT)::GetStockObject( SYSTEM_FONT );
  682. ASSERT( hFont != NULL );
  683. }
  684. }
  685. LOGFONT _lf;
  686. ::memset( &_lf, 0, sizeof(LOGFONT) );
  687. ::GetObject( (HANDLE)hFont, sizeof(LOGFONT), &_lf );
  688. LONG lfWeightSaved = _lf.lfWeight;
  689. m_fontNormal.CreateFontIndirect( &_lf );
  690. _lf.lfUnderline = TRUE;
  691. m_fontNormalUnderline.CreateFontIndirect( &_lf );
  692. _lf.lfUnderline = FALSE;
  693. if( _lf.lfWeight >= 700 )
  694. _lf.lfWeight = 900;
  695. else
  696. _lf.lfWeight = 700; // bold
  697. m_fontBold.CreateFontIndirect( &_lf );
  698. _lf.lfUnderline = TRUE;
  699. m_fontBoldUnderline.CreateFontIndirect( &_lf );
  700. _lf.lfUnderline = FALSE;
  701. _lf.lfItalic = BYTE(!0);
  702. m_fontBoldItalic.CreateFontIndirect( &_lf );
  703. _lf.lfUnderline = TRUE;
  704. m_fontBoldItalicUnderline.CreateFontIndirect( &_lf );
  705. _lf.lfUnderline = FALSE;
  706. _lf.lfWeight = lfWeightSaved;
  707. m_fontItalic.CreateFontIndirect( &_lf );
  708. _lf.lfUnderline = TRUE;
  709. m_fontItalicUnderline.CreateFontIndirect( &_lf );
  710. _lf.lfUnderline = FALSE;
  711. }
  712. void CExtTreeCtrl::_FontsDestroy()
  713. {
  714. ASSERT_VALID( this );
  715. if( m_fontNormal.GetSafeHandle() != NULL )
  716. m_fontNormal.DeleteObject();
  717. if( m_fontBold.GetSafeHandle() != NULL )
  718. m_fontBold.DeleteObject();
  719. if( m_fontItalic.GetSafeHandle() != NULL )
  720. m_fontItalic.DeleteObject();
  721. if( m_fontBoldItalic.GetSafeHandle() != NULL )
  722. m_fontBoldItalic.DeleteObject();
  723. if( m_fontNormalUnderline.GetSafeHandle() != NULL )
  724. m_fontNormalUnderline.DeleteObject();
  725. if( m_fontBoldUnderline.GetSafeHandle() != NULL )
  726. m_fontBoldUnderline.DeleteObject();
  727. if( m_fontItalicUnderline.GetSafeHandle() != NULL )
  728. m_fontItalicUnderline.DeleteObject();
  729. if( m_fontBoldItalicUnderline.GetSafeHandle() != NULL )
  730. m_fontBoldItalicUnderline.DeleteObject();
  731. }
  732. void CExtTreeCtrl::PreSubclassWindow()
  733. {
  734. ::memset( &m_nLastMouseButtonEventType, 0, sizeof(m_nLastMouseButtonEventType) );
  735. CTreeCtrl::PreSubclassWindow();
  736. _FontsSync();
  737. ModifyStyle( 0, WS_CLIPCHILDREN|WS_CLIPSIBLINGS, SWP_FRAMECHANGED );
  738. CWnd::RepositionBars( 0, 0xFFFF, 0 );
  739. }
  740. const CExtCmdIcon * CExtTreeCtrl::OnTreeItemQueryIcon(
  741. HTREEITEM hti
  742. ) const
  743. {
  744. ASSERT_VALID( this );
  745. if( hti == NULL )
  746. return NULL;
  747. const TREEITEMINFO_t & _TII = TreeItemInfoGet( hti );
  748. if( TreeItemIsExpanded( hti ) )
  749. {
  750. if( _TII.m_nIconIndexExpanded < 0 || _TII.m_nIconIndexExpanded >= TreeIconGetCount() )
  751. return NULL;
  752. const CExtCmdIcon & _icon = TreeIconGetAt( _TII.m_nIconIndexExpanded );
  753. if( _icon.IsEmpty() )
  754. return NULL;
  755. return (&_icon);
  756. }
  757. else
  758. {
  759. if( _TII.m_nIconIndexCollapsed < 0 || _TII.m_nIconIndexCollapsed >= TreeIconGetCount() )
  760. return NULL;
  761. const CExtCmdIcon & _icon = TreeIconGetAt( _TII.m_nIconIndexCollapsed );
  762. if( _icon.IsEmpty() )
  763. return NULL;
  764. return (&_icon);
  765. }
  766. }
  767. HWND CExtTreeCtrl::OnInplaceControlCreate(
  768. HTREEITEM hti,
  769. CRect rcControl
  770. )
  771. {
  772. ASSERT_VALID( this );
  773. const TREEITEMINFO_t & _TII = TreeItemInfoGet( hti );
  774. switch( _TII.m_eICT )
  775. {
  776. case __EICT_EDIT:
  777. {
  778. CInplaceEdit * pEdit = new CInplaceEdit( false );
  779. if( ! pEdit->Create(
  780.  WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN
  781. | ES_AUTOHSCROLL
  782. | _TII.m_dwAdditionalControlStyles
  783. ,
  784. rcControl,
  785. this,
  786. UINT(IDC_STATIC)
  787. )
  788. )
  789. return NULL;
  790. pEdit->SetFont( GetFont() );
  791. pEdit->SetWindowText( _TII.m_strEditText );
  792. pEdit->SetSel(0, -1);
  793. pEdit->SetFocus();
  794. return pEdit->m_hWnd;
  795. } // __EICT_EDIT
  796. case __EICT_DROPDOWN_COMBOBOX:
  797. case __EICT_DROPLIST_COMBOBOX:
  798. {
  799. CRect rcComboBox = rcControl;
  800. rcComboBox.bottom += _TII.m_nDropDownHeight;
  801. CInplaceComboBox * pCombo = new CInplaceComboBox;
  802. if( ! pCombo->Create(
  803. WS_CHILD | WS_VISIBLE | WS_BORDER | WS_CLIPSIBLINGS | WS_CLIPCHILDREN
  804. | CBS_AUTOHSCROLL
  805. | _TII.m_dwAdditionalControlStyles
  806. | ( ( _TII.m_eICT == __EICT_DROPDOWN_COMBOBOX ) ? CBS_DROPDOWN : CBS_DROPDOWNLIST )
  807. ,
  808. rcComboBox,
  809. this,
  810. UINT(IDC_STATIC)
  811. )
  812. )
  813. return NULL;
  814. pCombo->SetFont( GetFont() );
  815. INT nCount = _TII.ComboBoxItem_GetCount();
  816. if( nCount > 0 )
  817. {
  818. INT nIndex = 0;
  819. for( ; nIndex < nCount; nIndex ++ )
  820. {
  821. const COMBOBOXITEMDATA_t & _CID = _TII.ComboBoxItem_GetRefAt( nIndex );
  822. INT nY = pCombo->AddString( LPCTSTR(_CID.m_strLabel) );
  823. if( nY >= 0 )
  824. pCombo->SetItemData( nY, _CID.m_lParam );
  825. }
  826. nIndex = pCombo->FindStringExact( -1, LPCTSTR(_TII.m_strEditText) );
  827. if( nIndex < 0 )
  828. nIndex = pCombo->FindString( -1, LPCTSTR(_TII.m_strEditText) );
  829. if( nIndex < 0 )
  830. nIndex = 0;
  831. pCombo->SetCurSel( nIndex );
  832. } // if( nCount > 0 )
  833. pCombo->SetFocus();
  834. return pCombo->m_hWnd;
  835. } // __EICT_DROPDOWN_COMBOBOX
  836. case __EICT_PROGRESS_BAR_THEMED:
  837. case __EICT_PROGRESS_BAR_WITH_BOXES:
  838. case __EICT_PROGRESS_BAR_SMOOTH:
  839. case __EICT_PROGRESS_BAR_ENDLESS:
  840. return NULL;
  841. } // switch( _TII.m_eICT )
  842. return NULL;
  843. }
  844. void CExtTreeCtrl::OnInplaceControlCancel()
  845. {
  846. ASSERT_VALID( this );
  847. if( m_hWndChildControl == NULL )
  848. return;
  849. ::SendMessage( m_hWndChildControl, WM_CANCELMODE, 0L, 0L );
  850. if( ::IsWindow( m_hWndChildControl ) )
  851. ::DestroyWindow( m_hWndChildControl );
  852. m_hWndChildControl = NULL;
  853. m_htiInplaceEdited = NULL;
  854. }
  855. void CExtTreeCtrl::OnInplaceControlComplete(
  856. __EXT_MFC_SAFE_LPCTSTR strEditedText,
  857. bool bEditingLabel
  858. )
  859. {
  860. ASSERT_VALID( this );
  861. HTREEITEM hti = GetInPlaceEditedItem();
  862. if( hti == NULL )
  863. return;
  864. if( ! bEditingLabel )
  865. {
  866. TREEITEMINFO_t & _TII = TreeItemInfoGet( hti );
  867. _TII.m_strEditText = LPCTSTR(strEditedText);
  868. } // if( ! bEditingLabel )
  869. else
  870. {
  871. HWND hWndParent = ::GetParent( m_hWnd );
  872. UINT nOwnID = GetDlgCtrlID();
  873. CExtSafeString strItemText;
  874. TV_DISPINFO _data;
  875. ::memset( &_data, 0, sizeof(TV_DISPINFO) );
  876. _data.hdr.hwndFrom = m_hWnd;
  877. _data.hdr.idFrom = nOwnID;
  878. _data.hdr.code = TVN_ENDLABELEDIT;
  879. _data.item.mask = TVIF_CHILDREN|TVIF_HANDLE|TVIF_PARAM|TVIF_STATE;
  880. _data.item.hItem = hti;
  881. GetItem( &_data.item );
  882. strItemText = GetItemText( hti );
  883. bool bModeNotNULL = true;
  884. if( strItemText == LPCTSTR(strEditedText) )
  885. {
  886. bModeNotNULL = false;
  887. _data.item.cchTextMax = 0;
  888. _data.item.pszText = 0;
  889. }
  890. else
  891. {
  892. _data.item.cchTextMax = INT(strItemText.GetLength());
  893. _data.item.pszText = strItemText.IsEmpty() ? _T("") : LPTSTR(LPCTSTR(strItemText));
  894. _data.item.mask |= TVIF_TEXT;
  895. }
  896. if( ! ::SendMessage( hWndParent, WM_NOTIFY, WPARAM(nOwnID), LPARAM(&_data) ) != 0 )
  897. {
  898. if( bModeNotNULL )
  899. return;
  900. }
  901. SetItemText( hti, LPCTSTR(strEditedText) );
  902. } // else from if( ! bEditingLabel )
  903. }
  904. bool CExtTreeCtrl::OnQueryWindowFocusedState() const
  905. {
  906. ASSERT_VALID( this );
  907. HWND hWndOwn = GetSafeHwnd();
  908. if( hWndOwn == NULL )
  909. return false;
  910. HWND hWndFocus = ::GetFocus();
  911. if( hWndFocus == NULL )
  912. return false;
  913. if( hWndOwn == hWndFocus )
  914. return true;
  915. if( ::IsChild( hWndOwn, hWndFocus ) )
  916. return true;
  917. return false;
  918. }
  919. INT CExtTreeCtrl::MarginCheckBoxLeftGet() const
  920. {
  921. ASSERT_VALID( this );
  922. return m_nMarginCheckBoxLeft;
  923. }
  924. void CExtTreeCtrl::MarginCheckBoxLeftSet( INT nMargin )
  925. {
  926. ASSERT_VALID( this );
  927. m_nMarginCheckBoxLeft = nMargin;
  928. }
  929. INT CExtTreeCtrl::MarginCheckBoxRightGet() const
  930. {
  931. ASSERT_VALID( this );
  932. return m_nMarginCheckBoxRight;
  933. }
  934. void CExtTreeCtrl::MarginCheckBoxRightSet( INT nMargin )
  935. {
  936. ASSERT_VALID( this );
  937. m_nMarginCheckBoxRight = nMargin;
  938. }
  939. INT CExtTreeCtrl::MarginIconLeftGet() const
  940. {
  941. ASSERT_VALID( this );
  942. return m_nMarginIconLeft;
  943. }
  944. void CExtTreeCtrl::MarginIconLeftSet( INT nMargin )
  945. {
  946. ASSERT_VALID( this );
  947. m_nMarginIconLeft = nMargin;
  948. }
  949. INT CExtTreeCtrl::MarginIconRightGet() const
  950. {
  951. ASSERT_VALID( this );
  952. return m_nMarginIconRight;
  953. }
  954. void CExtTreeCtrl::MarginIconRightSet( INT nMargin )
  955. {
  956. ASSERT_VALID( this );
  957. m_nMarginIconRight = nMargin;
  958. }
  959. INT CExtTreeCtrl::MarginLabelLeftGet() const
  960. {
  961. ASSERT_VALID( this );
  962. return m_nMarginLabelLeft;
  963. }
  964. void CExtTreeCtrl::MarginLabelLeftSet( INT nMargin )
  965. {
  966. ASSERT_VALID( this );
  967. m_nMarginLabelLeft = nMargin;
  968. }
  969. INT CExtTreeCtrl::MarginLabelRightGet() const
  970. {
  971. ASSERT_VALID( this );
  972. return m_nMarginLabelRight;
  973. }
  974. void CExtTreeCtrl::MarginLabelRightSet( INT nMargin )
  975. {
  976. ASSERT_VALID( this );
  977. m_nMarginLabelRight = nMargin;
  978. }
  979. INT CExtTreeCtrl::MarginControlLabelLeftGet() const
  980. {
  981. ASSERT_VALID( this );
  982. return m_nMarginControlLabelLeft;
  983. }
  984. void CExtTreeCtrl::MarginControlLabelLeftSet( INT nMargin )
  985. {
  986. ASSERT_VALID( this );
  987. m_nMarginControlLabelLeft = nMargin;
  988. }
  989. INT CExtTreeCtrl::MarginControlLabelRightGet() const
  990. {
  991. ASSERT_VALID( this );
  992. return m_nMarginControlLabelRight;
  993. }
  994. void CExtTreeCtrl::MarginControlLabelRightSet( INT nMargin )
  995. {
  996. ASSERT_VALID( this );
  997. m_nMarginControlLabelRight = nMargin;
  998. }
  999. INT CExtTreeCtrl::PaddingLabelLeftGet() const
  1000. {
  1001. ASSERT_VALID( this );
  1002. return m_nPaddingLabelLeft;
  1003. }
  1004. void CExtTreeCtrl::PaddingLabelLeftSet( INT nPadding )
  1005. {
  1006. ASSERT_VALID( this );
  1007. m_nPaddingLabelLeft = nPadding;
  1008. }
  1009. INT CExtTreeCtrl::PaddingLabelRightGet() const
  1010. {
  1011. ASSERT_VALID( this );
  1012. return m_nPaddingLabelRight;
  1013. }
  1014. void CExtTreeCtrl::PaddingLabelRightSet( INT nPadding )
  1015. {
  1016. ASSERT_VALID( this );
  1017. m_nPaddingLabelRight = nPadding;
  1018. }
  1019. void CExtTreeCtrl::OnMouseMove( UINT nFlags, CPoint point )
  1020. {
  1021. ASSERT_VALID( this );
  1022. OnTreeMouseMove( nFlags, point );
  1023. }
  1024. void CExtTreeCtrl::OnTreeMouseMove( UINT nFlags, CPoint point )
  1025. {
  1026. ASSERT_VALID( this );
  1027. nFlags;
  1028. bool bTrackSelection =
  1029. ( ( ( GetStyle() & TVS_TRACKSELECT ) != 0) 
  1030. || ( ( TreeGetStyleEx() & (__EXT_TREE_EX_HOVER_TREE_BOXES|__EXT_TREE_EX_HOVER_CHECK_BOXES|__EXT_TREE_EX_HOVER_RADIO_BUTTONS) ) != 0 ) 
  1031. ? true: false;
  1032. if( ! bTrackSelection )
  1033. return;
  1034. bool bInfoTip = ( ( GetStyle() & TVS_INFOTIP ) != 0 ) ? true: false;
  1035. DWORD dwHitTestFlagsNew = 0;
  1036. HTREEITEM htiHoverNew = NULL;
  1037. CPoint ptScreen = point;
  1038. ClientToScreen( &ptScreen );
  1039. HWND hWndFromPoint = ::WindowFromPoint( ptScreen );
  1040. if( hWndFromPoint != NULL
  1041. && ( hWndFromPoint == m_hWnd
  1042. || hWndFromPoint == m_wndContentExpand.GetSafeHwnd()
  1043. )
  1044. )
  1045. htiHoverNew = TreeItemHitTest( point, dwHitTestFlagsNew );
  1046. if( htiHoverNew == m_htiHover
  1047. && dwHitTestFlagsNew == m_dwLastHoverHitTestFlags
  1048. )
  1049. return;
  1050. if( m_htiHover != NULL )
  1051. {
  1052. CRect rcItemEntire;
  1053. TreeItemRectGet( m_htiHover, rcItemEntire, e_tirt_entire );
  1054. InvalidateRect( &rcItemEntire );
  1055. }
  1056. if( htiHoverNew != NULL )
  1057. {
  1058. if( m_htiHover != htiHoverNew )
  1059. {
  1060. CRect rcItemEntire;
  1061. TreeItemRectGet( htiHoverNew, rcItemEntire, e_tirt_entire );
  1062. InvalidateRect( &rcItemEntire );
  1063. }
  1064. if( GetCapture() != this )
  1065. SetCapture();
  1066. }
  1067. else
  1068. {
  1069. if( GetCapture() == this )
  1070. ReleaseCapture();
  1071. }
  1072. if ( htiHoverNew != NULL )
  1073. CWnd::SetCapture();
  1074. else
  1075. ReleaseCapture();
  1076. OnTreeItemSetCursor(
  1077. htiHoverNew,
  1078. dwHitTestFlagsNew
  1079. );
  1080. OnTreeItemHoverChanged(
  1081. htiHoverNew,
  1082. dwHitTestFlagsNew,
  1083. m_htiHover,
  1084. m_dwLastHoverHitTestFlags
  1085. );
  1086. m_htiHover = htiHoverNew;
  1087. m_dwLastHoverHitTestFlags = dwHitTestFlagsNew;
  1088. if( bInfoTip )
  1089. {
  1090. bool bDeactivate = true;
  1091. if( htiHoverNew != NULL )
  1092. {
  1093. CRect rcLabel;
  1094. TreeItemRectGet( htiHoverNew, rcLabel, e_tirt_label );
  1095. if( rcLabel.PtInRect( point ) )
  1096. {
  1097. CRect rcClient;
  1098. GetClientRect( &rcClient );
  1099. CWnd::RepositionBars( 0, 0xFFFF, 0, CWnd::reposQuery, &rcClient, &rcClient );
  1100. if( rcLabel.left < rcClient.left
  1101. || rcLabel.right > rcClient.right
  1102. )
  1103. {
  1104. bDeactivate = false;
  1105. m_wndContentExpand.Activate(
  1106. rcLabel,
  1107. this,
  1108. __ECWAF_DEF_EXPANDED_ITEM_PAINTER|__ECWAF_NO_CAPTURE
  1109. );
  1110. SetTimer( __EXT_TREE_CONTROL_TIMER_ID_TRACKHOVER, 100, NULL );
  1111. }
  1112. }
  1113. }
  1114. if( bDeactivate )
  1115. m_wndContentExpand.Deactivate();
  1116. } // if( bInfoTip )
  1117. }
  1118. BOOL CExtTreeCtrl::OnSetCursor( CWnd* pWnd, UINT nHitTest, UINT message )
  1119. {
  1120. // return CTreeCtrl::OnSetCursor(pWnd, nHitTest, message);
  1121. pWnd;
  1122. nHitTest;
  1123. message;
  1124. CPoint ptScreen;
  1125. if( ! ::GetCursorPos( &ptScreen ) )
  1126. return FALSE;
  1127. if( ::WindowFromPoint( ptScreen ) != m_hWnd )
  1128. return FALSE;
  1129. CPoint point = ptScreen;
  1130. ScreenToClient( &point );
  1131. DWORD dwHitTestFlags = 0;
  1132. HTREEITEM htiHover = TreeItemHitTest( point, dwHitTestFlags );
  1133. OnTreeItemSetCursor( htiHover, dwHitTestFlags );
  1134. return TRUE;
  1135. }
  1136. void CExtTreeCtrl::OnTreeItemHoverChanged(
  1137. HTREEITEM htiHoverNew,
  1138. DWORD dwHitTestFlagsNew,
  1139. HTREEITEM htiHoverOld,
  1140. DWORD dwHitTestFlagsOld
  1141. )
  1142. {
  1143. ASSERT_VALID( this );
  1144. htiHoverNew;
  1145. dwHitTestFlagsNew;
  1146. htiHoverOld;
  1147. dwHitTestFlagsOld;
  1148. }
  1149. void CExtTreeCtrl::OnTreeItemSetCursor(
  1150. HTREEITEM htiHover,
  1151. DWORD dwHitTestFlags
  1152. )
  1153. {
  1154. ASSERT_VALID( this );
  1155. HCURSOR hCursor = NULL;
  1156. if( htiHover != NULL
  1157. && ( dwHitTestFlags & __EXT_TVHT_ONITEMLABEL ) != 0
  1158. && ( GetStyle() & TVS_TRACKSELECT ) != 0
  1159. && ( ( TreeGetStyleEx() & __EXT_TREE_HOVER_DISABLE_ITEMS ) != 0
  1160. || OnQueryItemEnabledState( htiHover )
  1161. )
  1162. )
  1163. {
  1164. hCursor = m_hCursorHand;
  1165. }
  1166. if( hCursor == NULL )
  1167. hCursor = ::LoadCursor( NULL, IDC_ARROW );
  1168. ::SetCursor( hCursor );
  1169. }
  1170. void CExtTreeCtrl::LoadWinXPTreeBox()
  1171. {
  1172. ASSERT_VALID( this );
  1173. VERIFY( m_bmpTreeBoxCollapsed .LoadBMP_Resource( MAKEINTRESOURCE( IDB_EXT_BITMAP_TREE_BOX_COLLAPSED_XP ) ) );
  1174. VERIFY( m_bmpTreeBoxCollapsedHover .LoadBMP_Resource( MAKEINTRESOURCE( IDB_EXT_BITMAP_TREE_BOX_COLLAPSED_HOVER_XP ) ) );
  1175. VERIFY( m_bmpTreeBoxExpanded .LoadBMP_Resource( MAKEINTRESOURCE( IDB_EXT_BITMAP_TREE_BOX_EXPANDED_XP ) ) );
  1176. VERIFY( m_bmpTreeBoxExpandedHover .LoadBMP_Resource( MAKEINTRESOURCE( IDB_EXT_BITMAP_TREE_BOX_EXPANDED_HOVER_XP ) ) );
  1177. }
  1178. void CExtTreeCtrl::LoadWinVistaTreeBox()
  1179. {
  1180. ASSERT_VALID( this );
  1181. VERIFY( m_bmpTreeBoxCollapsed .LoadBMP_Resource( MAKEINTRESOURCE( IDB_EXT_BITMAP_TREE_BOX_COLLAPSED_VISTA ) ) );
  1182. VERIFY( m_bmpTreeBoxCollapsedHover .LoadBMP_Resource( MAKEINTRESOURCE( IDB_EXT_BITMAP_TREE_BOX_COLLAPSED_HOVER_VISTA ) ) );
  1183. VERIFY( m_bmpTreeBoxExpanded .LoadBMP_Resource( MAKEINTRESOURCE( IDB_EXT_BITMAP_TREE_BOX_EXPANDED_VISTA ) ) );
  1184. VERIFY( m_bmpTreeBoxExpandedHover .LoadBMP_Resource( MAKEINTRESOURCE( IDB_EXT_BITMAP_TREE_BOX_EXPANDED_HOVER_VISTA ) ) );
  1185. }
  1186. #if _MFC_VER < 0x700
  1187. void CExtTreeCtrl::OnActivateApp(BOOL bActive, HTASK hTask)
  1188. #else
  1189. void CExtTreeCtrl::OnActivateApp(BOOL bActive, DWORD hTask)
  1190. #endif
  1191. {
  1192. ASSERT_VALID( this );
  1193. CTreeCtrl::OnActivateApp(bActive, hTask);
  1194. if( ! bActive )
  1195. SendMessage( WM_CANCELMODE );
  1196. }
  1197. void CExtTreeCtrl::OnCancelMode()
  1198. {
  1199. ASSERT_VALID( this );
  1200. CTreeCtrl::OnCancelMode();
  1201. if( m_bCanceling )
  1202. return;
  1203. m_bCanceling = true;
  1204. KillTimer( m_nDelayedEditingTimerID );
  1205. OnInplaceControlCancel();
  1206. HWND hWndCapture = ::GetCapture();
  1207. if( hWndCapture == m_hWnd )
  1208. ::ReleaseCapture();
  1209. // m_wndContentExpand.Deactivate();
  1210. m_bCanceling = false;
  1211. }
  1212. BOOL CExtTreeCtrl::OnMouseWheel( UINT nFlags, short zDelta, CPoint pt )
  1213. {
  1214. ASSERT_VALID( this );
  1215. if( m_hWndChildControl != NULL )
  1216. SendMessage( WM_CANCELMODE );
  1217. BOOL bRetVal = CTreeCtrl::OnMouseWheel(nFlags, zDelta, pt);
  1218. return bRetVal;
  1219. }
  1220. UINT CExtTreeCtrl::OnGetDlgCode()
  1221. {
  1222. return CTreeCtrl::OnGetDlgCode();
  1223. //return DLGC_WANTALLKEYS;
  1224. }
  1225. LRESULT CExtTreeCtrl::_OnPaintExpanedItemContent( WPARAM wParam, LPARAM lParam )
  1226. {
  1227. ASSERT_VALID( this );
  1228. lParam;
  1229. CExtContentExpandWnd::PAINT_ITEM_CONTENT_DATA * p_picd =
  1230. (CExtContentExpandWnd::PAINT_ITEM_CONTENT_DATA *)wParam;
  1231. ASSERT( p_picd != NULL );
  1232. ASSERT( p_picd->m_dc.GetSafeHdc() != NULL );
  1233. if( m_htiHover != NULL )
  1234. {
  1235. COLORREF clrTreeBkColor = TreeBkColorGet();
  1236. if( clrTreeBkColor == COLORREF(-1L) )
  1237. clrTreeBkColor = ::GetSysColor( COLOR_WINDOW );
  1238. //p_picd->m_dc.FillSolidRect( &rcClient, clrTreeBkColor );
  1239. CFont * pOldFont = p_picd->m_dc.SelectObject( &m_fontNormal );
  1240. COLORREF clrBackgroundOld = p_picd->m_dc.SetBkColor( clrTreeBkColor );
  1241. COLORREF clrText = ::GetSysColor( COLOR_BTNTEXT );
  1242. COLORREF clrTextOld = p_picd->m_dc.SetTextColor( clrText );
  1243. int nOldBkMode = p_picd->m_dc.SetBkMode( TRANSPARENT );
  1244. bool bFocusedWindow = OnQueryWindowFocusedState();
  1245. bool bDisabledItem = ! OnQueryItemEnabledState( m_htiHover );
  1246. bool bFocusedItem = ( m_htiHover == GetFocusedItem() ) ? true : false;
  1247. bool bSelectedItem = IsItemSelected( m_htiHover );
  1248. CRect rcItemEntire, rcItemLabel;
  1249. // TreeItemRectGet( m_htiHover, rcItemEntire, e_tirt_entire );
  1250. TreeItemRectGet( m_htiHover, rcItemLabel, e_tirt_label );
  1251. m_wndContentExpand.GetClientRect( &rcItemEntire );
  1252. m_wndContentExpand.ClientToScreen( &rcItemEntire );
  1253. ScreenToClient( &rcItemEntire );
  1254. p_picd->m_dc.OffsetViewportOrg( -rcItemLabel.left, -rcItemLabel.top );
  1255. OnPaintTreeItem(
  1256. m_htiHover, 
  1257. p_picd->m_dc, 
  1258. rcItemEntire,
  1259. bFocusedWindow, 
  1260. bDisabledItem, 
  1261. bSelectedItem,
  1262. bFocusedItem,
  1263. false
  1264. );
  1265. p_picd->m_dc.OffsetViewportOrg( rcItemLabel.left, rcItemLabel.top );
  1266. p_picd->m_dc.SetBkMode( nOldBkMode );
  1267. p_picd->m_dc.SetTextColor( clrTextOld );
  1268. p_picd->m_dc.SetBkColor( clrBackgroundOld );
  1269. p_picd->m_dc.SelectObject( pOldFont );
  1270. }
  1271. return (!0);
  1272. }
  1273. void CExtTreeCtrl::OnContextMenu(CWnd* pWnd, CPoint point) 
  1274. {
  1275. if (pWnd->GetSafeHwnd() != m_hWnd)
  1276. {
  1277. Default();
  1278. return;
  1279. }
  1280. DWORD dwHitTestFlags = 0;
  1281. ScreenToClient( &point );
  1282. HTREEITEM hti = TreeItemHitTest( point, dwHitTestFlags );
  1283. if( hti == NULL )
  1284. return;
  1285. SelectDropTarget( hti );
  1286. OnTreeItemContextMenu( hti, point, dwHitTestFlags );
  1287. SelectDropTarget( NULL );
  1288. }
  1289. void CExtTreeCtrl::OnTreeItemContextMenu(
  1290. HTREEITEM hti,
  1291. CPoint point, // client coordinates
  1292. DWORD dwHitTestFlags
  1293. )
  1294. {
  1295. ASSERT_VALID( this );
  1296. hti;
  1297. point;
  1298. dwHitTestFlags;
  1299. }
  1300. void CExtTreeCtrl::OnTimer( __EXT_MFC_UINT_PTR nIDEvent )
  1301. {
  1302. ASSERT_VALID( this );
  1303. if( nIDEvent == m_nDelayedFocusTimerID )
  1304. {
  1305. KillTimer( m_nDelayedFocusTimerID );
  1306. if( m_htiDelayedFocus == NULL )
  1307. return;
  1308. HTREEITEM htiDelayedFocus = m_htiDelayedFocus;
  1309. m_htiDelayedFocus = NULL;
  1310. if( GetFocusedItem() != htiDelayedFocus )
  1311. return;
  1312. //CString sTmp = GetItemText( htiDelayedFocus );
  1313. //TRACE1( "Delated focus event for "%s" tree itemrn", LPCTSTR(sTmp) );
  1314. OnTreeItemDelayedFocus( htiDelayedFocus, false );
  1315. return;
  1316. } // if( nIDEvent == m_nDelayedFocusTimerID )
  1317. if( nIDEvent == __EXT_TREE_CONTROL_TIMER_ID_TRACKHOVER )
  1318. {
  1319. if( m_wndContentExpand.GetSafeHwnd() != NULL )
  1320. {
  1321. CPoint ptCursor;
  1322. if( GetCursorPos( &ptCursor ) )
  1323. {
  1324. CPoint point = ptCursor;
  1325. ScreenToClient( &point );
  1326. HWND hWndFromPoint = ::WindowFromPoint( ptCursor );
  1327. if( hWndFromPoint == m_hWndChildControl
  1328. || hWndFromPoint == m_wndContentExpand.m_hWnd
  1329. )
  1330. {
  1331. CRect rcClient;
  1332. GetClientRect( &rcClient );
  1333. CWnd::RepositionBars( 0, 0xFFFF, 0, CWnd::reposQuery, &rcClient, &rcClient );
  1334. if( rcClient.PtInRect( point ) )
  1335. return;
  1336. }
  1337. KillTimer( __EXT_TREE_CONTROL_TIMER_ID_TRACKHOVER );
  1338. OnTreeMouseMove( 0, point );
  1339. return;
  1340. }
  1341. }
  1342. KillTimer( __EXT_TREE_CONTROL_TIMER_ID_TRACKHOVER );
  1343. m_wndContentExpand.Deactivate();
  1344. return;
  1345. }
  1346. if( nIDEvent == m_nDelayedEditingTimerID )
  1347. {
  1348. HTREEITEM hti = GetFocusedItem();
  1349. EditLabel( hti );
  1350. return;
  1351. }
  1352. CTreeCtrl::OnTimer( nIDEvent );
  1353. }
  1354. void CExtTreeCtrl::OnTreeItemDelayedFocus(
  1355. HTREEITEM hti,
  1356. bool bStartWaiting,
  1357. bool bMouseClickEvent // = false
  1358. )
  1359. {
  1360. ASSERT_VALID( this );
  1361. if( bStartWaiting )
  1362. {
  1363. m_htiDelayedFocus = hti;
  1364. KillTimer( m_nDelayedFocusTimerID );
  1365. SetTimer( m_nDelayedFocusTimerID, m_nDelayedFocusTime, NULL );
  1366. LPARAM lParam = LPARAM(__PARM_DELAYED_FOCUS_BEGIN_WAITING);
  1367. if( bMouseClickEvent )
  1368. lParam |= LPARAM(__PARM_DELAYED_FOCUS_MOUSE_CLICK);
  1369. GetParent()->SendMessage( g_nMsgTreeItemDelayedFocus, WPARAM(this), lParam );
  1370. }
  1371. else
  1372. {
  1373. KillTimer( m_nDelayedFocusTimerID );
  1374. m_htiDelayedFocus = NULL;
  1375. GetParent()->SendMessage( g_nMsgTreeItemDelayedFocus, (WPARAM)this, 0L );
  1376. }
  1377. }
  1378. bool CExtTreeCtrl::_NeedsChildren( HTREEITEM hti ) const
  1379. {
  1380. ASSERT_VALID( this );
  1381. return ( GetChildItem( hti ) == NULL ) ? true : false;
  1382. }
  1383. void CExtTreeCtrl::_DeleteChildren( HTREEITEM hti )
  1384. {
  1385. ASSERT_VALID( this );
  1386. HTREEITEM hti2 = GetChildItem( hti );
  1387. for( ; hti2 != NULL; )
  1388. {
  1389. HTREEITEM hti3 = GetNextSiblingItem( hti2 );
  1390. DeleteItem( hti2 );
  1391. hti2 = hti3;
  1392. }
  1393. }
  1394. bool CExtTreeCtrl::ReadOnlyLabelsGet() const
  1395. {
  1396. ASSERT_VALID( this );
  1397. return m_bReadOnlyLabels;
  1398. }
  1399. void CExtTreeCtrl::ReadOnlyLabelsSet( bool bReadOnlyLabels )
  1400. {
  1401. ASSERT_VALID( this );
  1402. m_bReadOnlyLabels = bReadOnlyLabels;
  1403. }
  1404. void CExtTreeCtrl::_CheckDeepFocusBegin(
  1405. CList < HTREEITEM, HTREEITEM > & _listFocusPath
  1406. )
  1407. {
  1408. ASSERT_VALID( this );
  1409. _listFocusPath.RemoveAll();
  1410. if( GetSafeHwnd() == NULL )
  1411. return;
  1412. HTREEITEM hti = GetFocusedItem();
  1413. if( hti == NULL )
  1414. return;
  1415. ASSERT( HasItem( hti ) );
  1416. for( ; hti != NULL; hti = GetNextItem( hti, TVGN_PARENT ) )
  1417. _listFocusPath.AddHead( hti );
  1418. }
  1419. HTREEITEM CExtTreeCtrl::_CheckDeepFocusEnd(
  1420. CList < HTREEITEM, HTREEITEM > & _listFocusPath
  1421. )
  1422. {
  1423. ASSERT_VALID( this );
  1424. if( GetSafeHwnd() == NULL )
  1425. return NULL;
  1426. HTREEITEM htiRetVal = NULL;
  1427. POSITION pos = _listFocusPath.GetHeadPosition();
  1428. for( ; pos != NULL; )
  1429. {
  1430. HTREEITEM hti = _listFocusPath.GetNext( pos );
  1431. if( hti == NULL
  1432. || ( ! HasItem( hti ) )
  1433. )
  1434. break;
  1435. htiRetVal = hti;
  1436. }
  1437. return htiRetVal;
  1438. }
  1439. HTREEITEM CExtTreeCtrl::FindItemByText(
  1440. HTREEITEM htiStartWalk,
  1441. __EXT_MFC_SAFE_LPCTSTR strText,
  1442. UINT nStartWalkCode, // = TVGN_CHILD
  1443. UINT nContinueWalkCode // = TVGN_NEXT
  1444. )
  1445. {
  1446. ASSERT_VALID( this );
  1447. if( GetSafeHwnd() == NULL )
  1448. return NULL;
  1449. if( htiStartWalk == NULL || htiStartWalk == TVI_ROOT )
  1450. {
  1451. htiStartWalk = GetRootItem();
  1452. if( htiStartWalk == NULL )
  1453. return NULL;
  1454. }
  1455. if( strText == NULL )
  1456. strText = _T("");
  1457. HTREEITEM hti = GetNextItem( htiStartWalk, nStartWalkCode );
  1458. for( ; hti != NULL; hti = GetNextItem( hti, nContinueWalkCode ) )
  1459. {
  1460. CString s = GetItemText( hti );
  1461. if( s == LPCTSTR(strText) )
  1462. return hti;
  1463. }
  1464. return NULL;
  1465. }
  1466. CExtTreeCtrl::COMBOBOXITEMDATA_t::COMBOBOXITEMDATA_t(
  1467. __EXT_MFC_SAFE_LPCTSTR strLabel, // = NULL
  1468. LPARAM lParam // = 0L
  1469. )
  1470. : m_strLabel( ( strLabel == NULL) ? _T("") : strLabel )
  1471. , m_lParam( lParam )
  1472. {
  1473. }
  1474. CExtTreeCtrl::COMBOBOXITEMDATA_t::COMBOBOXITEMDATA_t( const CExtTreeCtrl::COMBOBOXITEMDATA_t & other )
  1475. {
  1476. m_strLabel = other.m_strLabel;
  1477. m_lParam = other.m_lParam;
  1478. }
  1479. CExtTreeCtrl::COMBOBOXITEMDATA_t::~COMBOBOXITEMDATA_t()
  1480. {
  1481. }
  1482. CExtTreeCtrl::COMBOBOXITEMDATA_t & CExtTreeCtrl::COMBOBOXITEMDATA_t::operator = ( const CExtTreeCtrl::COMBOBOXITEMDATA_t & other )
  1483. {
  1484. m_strLabel = other.m_strLabel;
  1485. m_lParam = other.m_lParam;
  1486. return (*this);
  1487. }
  1488. CExtTreeCtrl::TREEITEMINFO_t::TREEITEMINFO_t()
  1489. {
  1490. Init();
  1491. }
  1492. CExtTreeCtrl::TREEITEMINFO_t::TREEITEMINFO_t( const CExtTreeCtrl::TREEITEMINFO_t & other )
  1493. {
  1494. Init();
  1495. AssignFromOther( other );
  1496. }
  1497. CExtTreeCtrl::TREEITEMINFO_t::~TREEITEMINFO_t()
  1498. {
  1499. ComboBoxItem_RemoveAt();
  1500. }
  1501. void CExtTreeCtrl::TREEITEMINFO_t::Init()
  1502. {
  1503. m_clrTextNormal = COLORREF(-1L);
  1504. m_clrBackgroundNormal = COLORREF(-1L);
  1505. m_clrTextSelected = COLORREF(-1L);
  1506. m_clrBackgroundSelected = COLORREF(-1L);
  1507. m_clrTextDisabled = COLORREF(-1L);
  1508. m_clrBackgroundDisabled = COLORREF(-1L);
  1509. m_clrTextHover = COLORREF(-1L);
  1510. m_bSelected = false;
  1511. m_bDisabled = false;
  1512. m_bBold = false;
  1513. m_bItalic = false;
  1514. m_bUnderline = false;
  1515. m_eCheckBoxType         = e_cbt_none;
  1516. m_eICT = __EICT_NONE;
  1517. m_nCheckBoxState        = 0;
  1518. m_strRadioGroupName.Empty();
  1519. m_lParam = 0L;
  1520. m_nIconIndexCollapsed   = -1;
  1521. m_nIconIndexExpanded    = -1;
  1522. m_nControlWidth = 0;
  1523. m_nDropDownHeight = 200;
  1524. m_dwAdditionalControlStyles = 0;
  1525. m_dwAdditionalLabelEditorStyles = 0;
  1526. m_strEditText.Empty();
  1527. m_nProgressMin = 0;
  1528. m_nProgressMax = 100;
  1529. m_nProgressPos = 0;
  1530. }
  1531. void CExtTreeCtrl::TREEITEMINFO_t::AssignFromOther( const CExtTreeCtrl::TREEITEMINFO_t & other )
  1532. {
  1533. m_clrTextNormal = other.m_clrTextNormal;
  1534. m_clrBackgroundNormal = other.m_clrBackgroundNormal;
  1535. m_clrTextSelected = other.m_clrTextSelected;
  1536. m_clrBackgroundSelected = other.m_clrBackgroundSelected;
  1537. m_clrTextDisabled = other.m_clrTextDisabled;
  1538. m_clrBackgroundDisabled = other.m_clrBackgroundDisabled;
  1539. m_clrTextHover = other.m_clrTextHover;
  1540. m_bSelected = other.m_bSelected;
  1541. m_bDisabled = other.m_bDisabled;
  1542. m_bBold = other.m_bBold;
  1543. m_bItalic = other.m_bItalic;
  1544. m_bUnderline = other.m_bUnderline;
  1545. m_eCheckBoxType         = other.m_eCheckBoxType;
  1546. m_eICT = other.m_eICT;
  1547. m_nCheckBoxState        = other.m_nCheckBoxState;
  1548. m_strRadioGroupName     = other.m_strRadioGroupName;
  1549. m_lParam = other.m_lParam;
  1550. m_nIconIndexCollapsed   = other.m_nIconIndexCollapsed;
  1551. m_nIconIndexExpanded    = other.m_nIconIndexExpanded;
  1552. m_nControlWidth = other.m_nControlWidth;
  1553. m_nDropDownHeight = other.m_nDropDownHeight;
  1554. m_dwAdditionalControlStyles = other.m_dwAdditionalControlStyles;
  1555. m_dwAdditionalLabelEditorStyles = other.m_dwAdditionalLabelEditorStyles;
  1556. m_strEditText = other.m_strEditText;
  1557. m_nProgressMin = other.m_nProgressMin;
  1558. m_nProgressMax = other.m_nProgressMax;
  1559. m_nProgressPos = other.m_nProgressPos;
  1560. ComboBoxItem_RemoveAt();
  1561. INT nCount = other.ComboBoxItem_GetCount();
  1562. if( nCount > 0 )
  1563. {
  1564. try
  1565. {
  1566. m_arrComboBoxItems.InsertAt( 0, NULL, nCount );
  1567. INT nIndex = 0;
  1568. for( ; nIndex < nCount; nIndex++ )
  1569. {
  1570. const COMBOBOXITEMDATA_t & _CID = other.ComboBoxItem_GetRefAt( nIndex );
  1571. COMBOBOXITEMDATA_t * pCID = new COMBOBOXITEMDATA_t( _CID );
  1572. m_arrComboBoxItems.SetAt( nIndex, pCID );
  1573. }
  1574. }
  1575. catch( CException * pException )
  1576. {
  1577. pException->Delete();
  1578. ComboBoxItem_RemoveAt();
  1579. }
  1580. }
  1581. }
  1582. CExtTreeCtrl::TREEITEMINFO_t & CExtTreeCtrl::TREEITEMINFO_t::operator = ( const CExtTreeCtrl::TREEITEMINFO_t & other )
  1583. {
  1584. AssignFromOther( other );
  1585. return ( * this );
  1586. }
  1587. INT CExtTreeCtrl::TREEITEMINFO_t::ComboBoxItem_GetCount() const
  1588. {
  1589. return INT( m_arrComboBoxItems.GetSize() );
  1590. }
  1591. CExtTreeCtrl::COMBOBOXITEMDATA_t * CExtTreeCtrl::TREEITEMINFO_t::ComboBoxItem_GetAt( INT nIndex )
  1592. {
  1593. if( nIndex < 0 || nIndex >= ComboBoxItem_GetCount() )
  1594. return NULL;
  1595. COMBOBOXITEMDATA_t * pCID = m_arrComboBoxItems[ nIndex ];
  1596. ASSERT( pCID != NULL );
  1597. return pCID;
  1598. }
  1599. const CExtTreeCtrl::COMBOBOXITEMDATA_t * CExtTreeCtrl::TREEITEMINFO_t::ComboBoxItem_GetAt( INT nIndex ) const
  1600. {
  1601. return ( const_cast < TREEITEMINFO_t * > ( this ) ) -> ComboBoxItem_GetAt( nIndex );
  1602. }
  1603. CExtTreeCtrl::COMBOBOXITEMDATA_t & CExtTreeCtrl::TREEITEMINFO_t::ComboBoxItem_GetRefAt( INT nIndex )
  1604. {
  1605. COMBOBOXITEMDATA_t * pCID = ComboBoxItem_GetAt( nIndex );
  1606. if( pCID == NULL )
  1607. ::AfxThrowUserException();
  1608. return (*pCID);
  1609. }
  1610. const CExtTreeCtrl::COMBOBOXITEMDATA_t & CExtTreeCtrl::TREEITEMINFO_t::ComboBoxItem_GetRefAt( INT nIndex ) const
  1611. {
  1612. return ( const_cast < TREEITEMINFO_t * > ( this ) ) -> ComboBoxItem_GetRefAt( nIndex );
  1613. }
  1614. void CExtTreeCtrl::TREEITEMINFO_t::ComboBoxItem_InsertAt(
  1615. INT nIndex,
  1616. CExtTreeCtrl::COMBOBOXITEMDATA_t * pCID,
  1617. bool bInsertClonedCopy // = true
  1618. )
  1619. {
  1620. ASSERT( pCID != NULL );
  1621. INT nCount = ComboBoxItem_GetCount();
  1622. if( nIndex < 0 || nIndex > nCount )
  1623. nIndex = nCount;
  1624. if( bInsertClonedCopy )
  1625. pCID = new COMBOBOXITEMDATA_t( *pCID );
  1626. m_arrComboBoxItems.InsertAt( nIndex, pCID );
  1627. }
  1628. void CExtTreeCtrl::TREEITEMINFO_t::ComboBoxItem_InsertAt(
  1629. INT nIndex,
  1630. const CExtTreeCtrl::COMBOBOXITEMDATA_t & _CID
  1631. )
  1632. {
  1633. COMBOBOXITEMDATA_t * pCID = new CExtTreeCtrl::COMBOBOXITEMDATA_t( _CID );
  1634. ComboBoxItem_InsertAt( nIndex, pCID, false );
  1635. }
  1636. void CExtTreeCtrl::TREEITEMINFO_t::ComboBoxItem_Add(
  1637. CExtTreeCtrl::COMBOBOXITEMDATA_t * pCID,
  1638. bool bInsertClonedCopy // = true
  1639. )
  1640. {
  1641. ASSERT( pCID != NULL );
  1642. ComboBoxItem_InsertAt( -1, pCID, bInsertClonedCopy );
  1643. }
  1644. void CExtTreeCtrl::TREEITEMINFO_t::ComboBoxItem_Add( const CExtTreeCtrl::COMBOBOXITEMDATA_t & _CID )
  1645. {
  1646. COMBOBOXITEMDATA_t * pCID = new COMBOBOXITEMDATA_t( _CID );
  1647. ComboBoxItem_InsertAt( -1, pCID, false );
  1648. }
  1649. INT CExtTreeCtrl::TREEITEMINFO_t::ComboBoxItem_RemoveAt(
  1650. INT nIndex, // = 0
  1651. INT nCountToRemove // = -1
  1652. ) // default parameters - remove all, returns removed count
  1653. {
  1654. INT nCount = ComboBoxItem_GetCount();
  1655. if( nCountToRemove < 0 )
  1656. nCountToRemove = nCount;
  1657. if( nIndex < 0 || nIndex >= nCountToRemove || nCountToRemove == 0 )
  1658. return 0;
  1659. if( ( nIndex + nCountToRemove ) > nCount )
  1660. {
  1661. nCountToRemove = nCount - nIndex;
  1662. ASSERT( nCountToRemove > 0 );
  1663. }
  1664. INT nPos = nIndex, nLast = nIndex + nCountToRemove - 1;
  1665. for( ; nPos <= nLast; nPos ++ )
  1666. {
  1667. COMBOBOXITEMDATA_t * pCID = ComboBoxItem_GetAt( nPos );
  1668. if( pCID != NULL )
  1669. delete pCID;
  1670. }
  1671. m_arrComboBoxItems.RemoveAt( nIndex, nCountToRemove );
  1672. return nCountToRemove;
  1673. }
  1674. CExtTreeCtrl::CInplaceEdit::CInplaceEdit( bool bEditingLabel )
  1675. : m_bEditingLabel( bEditingLabel )
  1676. , m_bResultSaved( false )
  1677. {
  1678. }
  1679. void CExtTreeCtrl::CInplaceEdit::PreSubclassWindow()
  1680. {
  1681. CExtEdit::PreSubclassWindow();
  1682. HookSpyRegister( __EHSEF_KEYBOARD );
  1683. }
  1684. void CExtTreeCtrl::CInplaceEdit::PostNcDestroy()
  1685. {
  1686. HookSpyUnregister();
  1687. CExtEdit::PostNcDestroy();
  1688. delete this;
  1689. }
  1690. bool CExtTreeCtrl::CInplaceEdit::OnHookSpyKeyMsg(
  1691. MSG * pMSG
  1692. )
  1693. {
  1694. if( pMSG->hwnd == m_hWnd
  1695. && ( GetStyle() & WS_VISIBLE ) != 0
  1696. )
  1697. {
  1698. if( pMSG->message == WM_KEYDOWN )
  1699. {
  1700. if( pMSG->wParam == VK_RETURN || pMSG->wParam == VK_ESCAPE )
  1701. {
  1702. HWND hWndParent = ::GetParent( m_hWnd );
  1703. HWND hWndOwn = m_hWnd;
  1704. if( hWndParent != NULL )
  1705. {
  1706. if( pMSG->wParam == VK_RETURN )
  1707. {
  1708. if( ! m_bResultSaved )
  1709. {
  1710. m_bResultSaved = true;
  1711. CString strText;
  1712. GetWindowText( strText );
  1713. ((CExtTreeCtrl*)CWnd::FromHandlePermanent(hWndParent)) ->
  1714. OnInplaceControlComplete( LPCTSTR(strText), m_bEditingLabel );
  1715. }
  1716. }
  1717. ::InvalidateRect( hWndParent, NULL, FALSE );
  1718. }
  1719. if( ::IsWindow( hWndOwn ) )
  1720. DestroyWindow();
  1721. ::SendMessage( hWndParent, WM_CANCELMODE, 0L, 0L );
  1722. return true;
  1723. }
  1724. }
  1725. }
  1726. return false;
  1727. }
  1728. LRESULT CExtTreeCtrl::CInplaceEdit::WindowProc( UINT message, WPARAM wParam, LPARAM lParam )
  1729. {
  1730. LRESULT lResult = CExtEdit::WindowProc( message, wParam, lParam );
  1731. switch( message )
  1732. {
  1733. case WM_ACTIVATEAPP:
  1734. if( wParam == 0 )
  1735. SendMessage( WM_CANCELMODE );
  1736. break;
  1737. case WM_NCCALCSIZE:
  1738. {
  1739. if( wParam )
  1740. {
  1741. NCCALCSIZE_PARAMS * myNCSIZE = (NCCALCSIZE_PARAMS*)lParam;
  1742. myNCSIZE->rgrc[0].left += 3 * __EXT_TREE_CTRL_BORDER_GAP;
  1743. myNCSIZE->rgrc[0].top += 2 * __EXT_TREE_CTRL_BORDER_GAP;
  1744. myNCSIZE->rgrc[0].right -= 2 * __EXT_TREE_CTRL_BORDER_GAP;
  1745. myNCSIZE->rgrc[0].bottom -= 2 * __EXT_TREE_CTRL_BORDER_GAP;
  1746. }
  1747. else
  1748. {
  1749. RECT * myRect2 = (RECT*)lParam;
  1750. myRect2->left += 3 * __EXT_TREE_CTRL_BORDER_GAP;
  1751. myRect2->top += 2 * __EXT_TREE_CTRL_BORDER_GAP;
  1752. myRect2->right -= 2 * __EXT_TREE_CTRL_BORDER_GAP;
  1753. myRect2->bottom -= 2 * __EXT_TREE_CTRL_BORDER_GAP;
  1754. }
  1755. return 0;
  1756. }
  1757. break;
  1758. case WM_NCPAINT:
  1759. {
  1760. CRect nonClientRect;
  1761. CRect clientRect;
  1762. CWindowDC dc( this );
  1763. GetWindowRect( &nonClientRect );
  1764. GetClientRect( &clientRect );
  1765. ClientToScreen( &clientRect );
  1766. OffsetRect( &clientRect, - nonClientRect.left, - nonClientRect.top );
  1767. dc.ExcludeClipRect( clientRect.left, clientRect.top, clientRect.right, clientRect.bottom );
  1768. dc.Rectangle( 0, 0, nonClientRect.right - nonClientRect.left, nonClientRect.bottom - nonClientRect.top );
  1769. }
  1770. break;
  1771. case WM_CANCELMODE:
  1772. case WM_KILLFOCUS:
  1773. {
  1774. HWND hWndParent = ::GetParent( m_hWnd );
  1775. if( hWndParent != NULL )
  1776. ::InvalidateRect( hWndParent, NULL, FALSE );
  1777. //((CExtTreeCtrl*)CWnd::FromHandlePermanent(hWndParent)) ->
  1778. // OnInplaceControlCancel();
  1779. if( ! m_bResultSaved )
  1780. {
  1781. m_bResultSaved = true;
  1782. CString strText;
  1783. GetWindowText( strText );
  1784. ((CExtTreeCtrl*)CWnd::FromHandlePermanent(hWndParent)) ->
  1785. OnInplaceControlComplete( LPCTSTR(strText), m_bEditingLabel );
  1786. }
  1787. DestroyWindow();
  1788. ::SendMessage( hWndParent, WM_CANCELMODE, 0L, 0L );
  1789. }
  1790. break;
  1791. case WM_GETDLGCODE:
  1792. return ( lResult | DLGC_WANTALLKEYS );
  1793. } // switch( message )
  1794. return lResult;
  1795. }
  1796. CExtTreeCtrl::CInplaceComboBox::CInplaceComboBox()
  1797. : m_bResultSaved( false )
  1798. {
  1799. }
  1800. void CExtTreeCtrl::CInplaceComboBox::PreSubclassWindow()
  1801. {
  1802. CExtComboBox::PreSubclassWindow();
  1803. //HookSpyRegister();
  1804. }
  1805. void CExtTreeCtrl::CInplaceComboBox::PostNcDestroy()
  1806. {
  1807. //HookSpyUnregister();
  1808. CExtComboBox::PostNcDestroy();
  1809. delete this;
  1810. }
  1811. bool CExtTreeCtrl::CInplaceComboBox::OnHookSpyKeyMsg(
  1812. MSG * pMSG
  1813. )
  1814. {
  1815. if( ( pMSG->hwnd == m_hWnd
  1816. || ::IsChild( m_hWnd, pMSG->hwnd )
  1817. )
  1818. && ( GetStyle() & WS_VISIBLE ) != 0
  1819. )
  1820. {
  1821. if( pMSG->message == WM_KEYDOWN )
  1822. {
  1823. if( pMSG->wParam == VK_RETURN || pMSG->wParam == VK_ESCAPE )
  1824. {
  1825. HWND hWndParent = ::GetParent( m_hWnd );
  1826. if( hWndParent != NULL )
  1827. {
  1828. if( pMSG->wParam == VK_RETURN )
  1829. {
  1830. if( ! m_bResultSaved )
  1831. {
  1832. m_bResultSaved = true;
  1833. CString strText;
  1834. GetWindowText( strText );
  1835. ((CExtTreeCtrl*)CWnd::FromHandlePermanent(hWndParent)) ->
  1836. OnInplaceControlComplete( LPCTSTR(strText), false );
  1837. }
  1838. }
  1839. ::InvalidateRect( hWndParent, NULL, FALSE );
  1840. }
  1841. DestroyWindow();
  1842. return TRUE;
  1843. }
  1844. }
  1845. }
  1846. return CExtComboBox::OnHookSpyKeyMsg( pMSG );
  1847. }
  1848. LRESULT CExtTreeCtrl::CInplaceComboBox::WindowProc( UINT message, WPARAM wParam, LPARAM lParam )
  1849. {
  1850. HWND hWndOwn = m_hWnd;
  1851. switch( message )
  1852. {
  1853. case WM_ACTIVATEAPP:
  1854. if( wParam == 0 )
  1855. SendMessage( WM_CANCELMODE );
  1856. return 0;
  1857. case WM_CANCELMODE:
  1858. if( ! m_bResultSaved )
  1859. {
  1860. m_bResultSaved = true;
  1861. HWND hWndParent = ::GetParent( m_hWnd );
  1862. if( hWndParent != NULL )
  1863. {
  1864. if( ! m_bResultSaved )
  1865. {
  1866. m_bResultSaved = true;
  1867. CString strText;
  1868. GetWindowText( strText );
  1869. ((CExtTreeCtrl*)CWnd::FromHandlePermanent(hWndParent)) ->
  1870. OnInplaceControlComplete( LPCTSTR(strText), false );
  1871. }
  1872. }
  1873. }
  1874. DestroyWindow();
  1875. return 0;
  1876. case WM_KILLFOCUS:
  1877. {
  1878. HWND hWndParent = ::GetParent( hWndOwn );
  1879. if( hWndParent != NULL )
  1880. {
  1881. ::InvalidateRect( hWndParent, NULL, FALSE );
  1882. HWND hWndFocus = (HWND)wParam;
  1883. if( ! ( hWndFocus == m_hWnd
  1884. || ::IsChild( m_hWnd, hWndFocus )
  1885. )
  1886. )
  1887. {
  1888. PostMessage( WM_CANCELMODE );
  1889. if( ! m_bResultSaved )
  1890. {
  1891. m_bResultSaved = true;
  1892. CString strText;
  1893. GetWindowText( strText );
  1894. ((CExtTreeCtrl*)CWnd::FromHandlePermanent(hWndParent)) ->
  1895. OnInplaceControlComplete( LPCTSTR(strText), false );
  1896. }
  1897. return 0L;
  1898. }
  1899. }
  1900. }
  1901. break;
  1902. } // switch( message )
  1903. if( ! ::IsWindow( hWndOwn ) )
  1904. return 0L;
  1905. LRESULT lResult = CExtComboBox::WindowProc( message, wParam, lParam );
  1906. switch( message )
  1907. {
  1908. case WM_GETDLGCODE:
  1909. return ( lResult | DLGC_WANTALLKEYS );
  1910. } // switch( message )
  1911. return lResult;
  1912. }
  1913. #endif // ( ! defined __EXT_MFC_NO_TREE_VIEW_CTRL )
  1914. #if (! defined __EXT_MFC_NO_MSG_BOX )
  1915. //////////////////////////////////////////////////////////////////////////////
  1916. // CExtMsgBox window
  1917. IMPLEMENT_DYNCREATE( CExtMsgBox, CExtResizableDialog );
  1918. __EXT_MFC_SAFE_LPCTSTR CExtMsgBox::g_strRegSectionName = _T("ExtMsgBox");
  1919. CExtMsgBox::CExtMsgBox(
  1920. HWND hWndParent, // = NULL
  1921. __EXT_MFC_SAFE_LPCTSTR strUniqueID // = NULL // for __EXT_MB_DO_NOT_DISPLAY_AGAIN and __EXT_MB_DO_NOT_ASK_AGAIN
  1922. )
  1923. : m_wndEditMsgBoxMessageText( true )
  1924. , m_hWndParentFromCTOR( hWndParent )
  1925. , m_nMsgBoxStyle( __EXT_MB_DEFAULT_STYLES )
  1926. , m_nMsgBoxStyleEx( __EXT_MB_EX_DEFAULT_STYLES )
  1927. , m_nHelpID( 0 )
  1928. , m_nTimeoutSeconds( 0 )
  1929. , m_bIsDisabledTimeout( false )
  1930. , m_nTimeoutTimer( 0 )
  1931. , m_nDefaultButtonDlgCtrlID( UINT(IDC_STATIC) )
  1932. , m_nEscapeButtonDlgCtrlID( UINT(IDC_STATIC) )
  1933. , m_sizeMessageText( 0, 0 )
  1934. , m_sizeCheckBox( 0, 0 )
  1935. , m_sizeButton( 0, 0 )
  1936. , m_strUniqueID( LPCTSTR(strUniqueID) != NULL ? LPCTSTR(strUniqueID) : _T("") ) // for __EXT_MB_DO_NOT_DISPLAY_AGAIN and __EXT_MB_DO_NOT_ASK_AGAIN
  1937. , m_sizeBorder( __EXT_MSG_BOX_DEFAULT_WINDOW_BORDER_WIDTH, __EXT_MSG_BOX_DEFAULT_WINDOW_BORDER_HEIGHT )
  1938. , m_sizeStdButton( __EXT_MSG_BOX_DEFAULT_BUTTON_WIDTH, __EXT_MSG_BOX_DEFAULT_BUTTON_HEIGHT )
  1939. , m_sizeStdButtonBorder( __EXT_MSG_BOX_DEFAULT_BUTTON_BORDER_WIDTH, __EXT_MSG_BOX_DEFAULT_BUTTON_BORDER_HEIGHT )
  1940. , m_nCheckBoxGap( __EXT_MSG_BOX_CHECK_BOX_ADDITIONAL_SPACE )
  1941. , m_nButtonSpace( __EXT_MSG_BOX_BTN_SPACE )
  1942. , m_nMinEditCtrlHeight( __EXT_MSG_BOX_DEFAULT_EDITOR_MIN_HEIGHT_PX )
  1943. , m_nMaxEditCtrlHeight( __EXT_MSG_BOX_DEFAULT_EDITOR_MAX_HEIGHT_PX )
  1944. , m_bDynamicIcon( false )
  1945. , m_clrEditorText( __EXT_MSG_BOX_DEFAULT_EDITOR_COLOR_TEXT )
  1946. , m_clrEditorBkgnd( __EXT_MSG_BOX_DEFAULT_EDITOR_COLOR_BKGND )
  1947. {
  1948. _AddDefaultIconStyle();
  1949. SetAutoSubclassChildControls();
  1950. }
  1951. CExtMsgBox::CExtMsgBox(
  1952. HWND hWndParent,
  1953. __EXT_MFC_SAFE_LPCTSTR strMessageText,
  1954. __EXT_MFC_SAFE_LPCTSTR strCaption, // = NULL
  1955. UINT nMsgBoxStyle, // = __EXT_MB_DEFAULT_STYLES
  1956. UINT nHelpID, // = 0
  1957. __EXT_MFC_SAFE_LPCTSTR strUniqueID, // = NULL // for __EXT_MB_DO_NOT_DISPLAY_AGAIN and __EXT_MB_DO_NOT_ASK_AGAIN
  1958. UINT nMsgBoxStyleEx // = __EXT_MB_EX_DEFAULT_STYLES
  1959. )
  1960. : m_wndEditMsgBoxMessageText( true )
  1961. , m_hWndParentFromCTOR( hWndParent )
  1962. , m_strMessageText( ( strMessageText == NULL ) ? _T("") : LPCTSTR(strMessageText) )
  1963. , m_strCaption( ( strCaption == NULL || _tcslen(strCaption) == 0 ) ? LPCTSTR( ::AfxGetAppName() ) : LPCTSTR(strCaption) )
  1964. , m_nMsgBoxStyle( nMsgBoxStyle )
  1965. , m_nMsgBoxStyleEx( nMsgBoxStyleEx )
  1966. , m_nHelpID( nHelpID )
  1967. , m_nTimeoutSeconds( 0 )
  1968. , m_bIsDisabledTimeout( false )
  1969. , m_nTimeoutTimer( 0 )
  1970. , m_nDefaultButtonDlgCtrlID( UINT(IDC_STATIC) )
  1971. , m_nEscapeButtonDlgCtrlID( UINT(IDC_STATIC) )
  1972. , m_sizeMessageText( 0, 0 )
  1973. , m_sizeCheckBox( 0, 0 )
  1974. , m_sizeButton( 0, 0 )
  1975. , m_strUniqueID( LPCTSTR(strUniqueID) != NULL ? LPCTSTR(strUniqueID) : _T("") ) // for __EXT_MB_DO_NOT_DISPLAY_AGAIN and __EXT_MB_DO_NOT_ASK_AGAIN
  1976. , m_sizeBorder( __EXT_MSG_BOX_DEFAULT_WINDOW_BORDER_WIDTH, __EXT_MSG_BOX_DEFAULT_WINDOW_BORDER_HEIGHT )
  1977. , m_sizeStdButton( __EXT_MSG_BOX_DEFAULT_BUTTON_WIDTH, __EXT_MSG_BOX_DEFAULT_BUTTON_HEIGHT )
  1978. , m_sizeStdButtonBorder( __EXT_MSG_BOX_DEFAULT_BUTTON_BORDER_WIDTH, __EXT_MSG_BOX_DEFAULT_BUTTON_BORDER_HEIGHT )
  1979. , m_nCheckBoxGap( __EXT_MSG_BOX_CHECK_BOX_ADDITIONAL_SPACE )
  1980. , m_nButtonSpace( __EXT_MSG_BOX_BTN_SPACE )
  1981. , m_nMinEditCtrlHeight( __EXT_MSG_BOX_DEFAULT_EDITOR_MIN_HEIGHT_PX )
  1982. , m_nMaxEditCtrlHeight( __EXT_MSG_BOX_DEFAULT_EDITOR_MAX_HEIGHT_PX )
  1983. , m_bDynamicIcon( false )
  1984. , m_clrEditorText( __EXT_MSG_BOX_DEFAULT_EDITOR_COLOR_TEXT )
  1985. , m_clrEditorBkgnd( __EXT_MSG_BOX_DEFAULT_EDITOR_COLOR_BKGND )
  1986. {
  1987. _AddDefaultIconStyle();
  1988. SetAutoSubclassChildControls();
  1989. }
  1990. CExtMsgBox::CExtMsgBox(
  1991. HWND hWndParent,
  1992. UINT nMessageResourceID,
  1993. UINT nCaptionResourceID, // = 0
  1994. UINT nMsgBoxStyle, // = __EXT_MB_DEFAULT_STYLES
  1995. UINT nHelpID, // = 0
  1996. __EXT_MFC_SAFE_LPCTSTR strUniqueID, // = NULL // for __EXT_MB_DO_NOT_DISPLAY_AGAIN and __EXT_MB_DO_NOT_ASK_AGAIN
  1997. UINT nMsgBoxStyleEx // = __EXT_MB_EX_DEFAULT_STYLES
  1998. )
  1999. : m_wndEditMsgBoxMessageText( true )
  2000. , m_hWndParentFromCTOR( hWndParent )
  2001. , m_nMsgBoxStyle( nMsgBoxStyle )
  2002. , m_nMsgBoxStyleEx( nMsgBoxStyleEx )
  2003. , m_nHelpID( nHelpID )
  2004. , m_nTimeoutSeconds( 0 )
  2005. , m_bIsDisabledTimeout( false )
  2006. , m_nTimeoutTimer( 0 )
  2007. , m_nDefaultButtonDlgCtrlID( UINT(IDC_STATIC) )
  2008. , m_nEscapeButtonDlgCtrlID( UINT(IDC_STATIC) )
  2009. , m_sizeMessageText( 0, 0 )
  2010. , m_sizeCheckBox( 0, 0 )
  2011. , m_sizeButton( 0, 0 )
  2012. , m_strUniqueID( LPCTSTR(strUniqueID) != NULL ? LPCTSTR(strUniqueID) : _T("") ) // for __EXT_MB_DO_NOT_DISPLAY_AGAIN and __EXT_MB_DO_NOT_ASK_AGAIN
  2013. , m_sizeBorder( __EXT_MSG_BOX_DEFAULT_WINDOW_BORDER_WIDTH, __EXT_MSG_BOX_DEFAULT_WINDOW_BORDER_HEIGHT )
  2014. , m_sizeStdButton( __EXT_MSG_BOX_DEFAULT_BUTTON_WIDTH, __EXT_MSG_BOX_DEFAULT_BUTTON_HEIGHT )
  2015. , m_sizeStdButtonBorder( __EXT_MSG_BOX_DEFAULT_BUTTON_BORDER_WIDTH, __EXT_MSG_BOX_DEFAULT_BUTTON_BORDER_HEIGHT )
  2016. , m_nCheckBoxGap( __EXT_MSG_BOX_CHECK_BOX_ADDITIONAL_SPACE )
  2017. , m_nButtonSpace( __EXT_MSG_BOX_BTN_SPACE )
  2018. , m_nMinEditCtrlHeight( __EXT_MSG_BOX_DEFAULT_EDITOR_MIN_HEIGHT_PX )
  2019. , m_nMaxEditCtrlHeight( __EXT_MSG_BOX_DEFAULT_EDITOR_MAX_HEIGHT_PX )
  2020. , m_bDynamicIcon( false )
  2021. , m_clrEditorText( __EXT_MSG_BOX_DEFAULT_EDITOR_COLOR_TEXT )
  2022. , m_clrEditorBkgnd( __EXT_MSG_BOX_DEFAULT_EDITOR_COLOR_BKGND )
  2023. {
  2024. _AddDefaultIconStyle();
  2025. SetAutoSubclassChildControls();
  2026. if( nCaptionResourceID == 0 )
  2027. m_strCaption = LPCTSTR( ::AfxGetAppName() );
  2028. else
  2029. {
  2030. VERIFY( g_ResourceManager->LoadString( m_strCaption, nCaptionResourceID ) );
  2031. }
  2032. VERIFY( g_ResourceManager->LoadString( m_strMessageText, nMessageResourceID ) );
  2033. }
  2034. CExtMsgBox::~CExtMsgBox()
  2035. {
  2036. m_bmpIcon.Empty();
  2037. UnRegisterAllButtons();
  2038. }
  2039. void CExtMsgBox::_AddDefaultIconStyle()
  2040. {
  2041. ASSERT_VALID( this );
  2042. if( ! m_bmpIcon.IsEmpty() )
  2043. return;
  2044. UINT nMsgBoxStyleEx = MsgBoxStyleExGet();
  2045. if( ( nMsgBoxStyleEx & __EXT_MB_EX_NO_DEFAULT_ICON_STYLE ) != 0 )
  2046. return;
  2047. UINT nMsgBoxStyle = MsgBoxStyleGet();
  2048. UINT nMsgBoxIconType = nMsgBoxStyle & __EXT_MB_ICONMASK;
  2049. if( nMsgBoxIconType == 0 )
  2050. {
  2051. UINT nMsgBoxType = nMsgBoxStyle & __EXT_MB_TYPEMASK;
  2052. switch( nMsgBoxType )
  2053. {
  2054. case __EXT_MB_OK:
  2055. case __EXT_MB_OKCANCEL:
  2056. case __EXT_MB_YESNO:
  2057. case __EXT_MB_YESNOCANCEL:
  2058. MsgBoxStyleSet( nMsgBoxStyle | __EXT_MB_ICONEXCLAMATION );
  2059. break;
  2060. }
  2061. }
  2062. }
  2063. void CExtMsgBox::DoDataExchange( CDataExchange * pDX )
  2064. {
  2065. #if ( _MFC_VER == 0x700 )
  2066. CExtResizableDialog
  2067. #else
  2068. CExtNCW < CExtResizableDialog >
  2069. #endif
  2070. :: DoDataExchange( pDX );
  2071. //{{AFX_DATA_MAP(CExtNCW)
  2072. //}}AFX_DATA_MAP
  2073. }
  2074. BEGIN_MESSAGE_MAP( CExtMsgBox, CExtResizableDialog )
  2075. //{{AFX_MSG_MAP(CExtShellDialogCreateFolder)
  2076. //}}AFX_MSG_MAP
  2077. ON_WM_TIMER()
  2078. END_MESSAGE_MAP()
  2079. UINT CExtMsgBox::MsgBoxStyleGet() const
  2080. {
  2081. ASSERT_VALID( this );
  2082. return m_nMsgBoxStyle;
  2083. }
  2084. void CExtMsgBox::MsgBoxStyleSet( UINT nMsgBoxStyle )
  2085. {
  2086. ASSERT_VALID( this );
  2087. m_nMsgBoxStyle = nMsgBoxStyle;
  2088. }
  2089. UINT CExtMsgBox::MsgBoxStyleExGet() const
  2090. {
  2091. ASSERT_VALID( this );
  2092. return m_nMsgBoxStyleEx;
  2093. }
  2094. void CExtMsgBox::MsgBoxStyleExSet( UINT nMsgBoxStyleEx )
  2095. {
  2096. ASSERT_VALID( this );
  2097. m_nMsgBoxStyleEx = nMsgBoxStyleEx;
  2098. }
  2099. INT CExtMsgBox::MinEditCtrlHeightGet() const
  2100. {
  2101. ASSERT_VALID( this );
  2102. return m_nMinEditCtrlHeight;
  2103. }
  2104. void CExtMsgBox::MinEditCtrlHeightSet( INT nMinEditCtrlHeight )
  2105. {
  2106. ASSERT_VALID( this );
  2107. m_nMinEditCtrlHeight = nMinEditCtrlHeight;
  2108. }
  2109. INT CExtMsgBox::MaxEditCtrlHeightGet() const
  2110. {
  2111. ASSERT_VALID( this );
  2112. return m_nMaxEditCtrlHeight;
  2113. }
  2114. void CExtMsgBox::MaxEditCtrlHeightSet( INT nMaxEditCtrlHeight )
  2115. {
  2116. ASSERT_VALID( this );
  2117. m_nMaxEditCtrlHeight = nMaxEditCtrlHeight;
  2118. }
  2119. CExtSafeString CExtMsgBox::MessageGet() const
  2120. {
  2121. ASSERT_VALID( this );
  2122. return m_strMessageText;
  2123. }
  2124. void CExtMsgBox::MessageSet( __EXT_MFC_SAFE_LPCTSTR strMessageText )
  2125. {
  2126. ASSERT_VALID( this );
  2127. m_strMessageText = ( strMessageText == NULL ) ? _T("") : LPCTSTR(strMessageText);
  2128. }
  2129. void CExtMsgBox::MessageSet( UINT nMessageResourceID )
  2130. {
  2131. ASSERT_VALID( this );
  2132. CExtSafeString str;
  2133. VERIFY( g_ResourceManager->LoadString( str, nMessageResourceID ) );
  2134. MessageSet( LPCTSTR(str) );
  2135. }
  2136. CExtSafeString CExtMsgBox::CaptionGet() const
  2137. {
  2138. ASSERT_VALID( this );
  2139. return m_strCaption;
  2140. }
  2141. void CExtMsgBox::CaptionSet( __EXT_MFC_SAFE_LPCTSTR strCaption )
  2142. {
  2143. ASSERT_VALID( this );
  2144. m_strCaption = ( strCaption == NULL ) ? _T("") : LPCTSTR(strCaption);
  2145. }
  2146. void CExtMsgBox::CaptionSet( UINT nCaptionResourceID )
  2147. {
  2148. ASSERT_VALID( this );
  2149. CExtSafeString str;
  2150. VERIFY( g_ResourceManager->LoadString( str, nCaptionResourceID ) );
  2151. CaptionSet( LPCTSTR(str) );
  2152. }
  2153. UINT CExtMsgBox::TimeoutGet(
  2154. bool * p_bIsDisabled // = NULL
  2155. ) const
  2156. {
  2157. ASSERT_VALID( this );
  2158. if( p_bIsDisabled != NULL )
  2159. (*p_bIsDisabled) = m_bIsDisabledTimeout;
  2160. return m_nTimeoutSeconds;
  2161. }
  2162. void CExtMsgBox::TimeoutSet(
  2163. UINT nTimeoutSeconds,
  2164. bool bIsDisabledTimeout // = false
  2165. )
  2166. {
  2167. ASSERT_VALID( this );
  2168. m_nTimeoutSeconds = nTimeoutSeconds;
  2169. m_bIsDisabledTimeout = bIsDisabledTimeout;
  2170. }
  2171. bool CExtMsgBox::IsDisabledTimeout() const
  2172. {
  2173. ASSERT_VALID( this );
  2174. bool bIsDisabledTimeout = true;
  2175. TimeoutGet( &bIsDisabledTimeout );
  2176. return bIsDisabledTimeout;
  2177. }
  2178. bool CExtMsgBox::OnMsgBoxTimeoutDecrease()
  2179. {
  2180. bool bIsDisabledTimeout = true;
  2181. UINT nTimeoutSeconds = TimeoutGet( &bIsDisabledTimeout );
  2182. if( nTimeoutSeconds == 0 )
  2183. return true;
  2184. nTimeoutSeconds --;
  2185. TimeoutSet( nTimeoutSeconds, bIsDisabledTimeout );
  2186. if( nTimeoutSeconds == 0 )
  2187. return true;
  2188. else
  2189. return false;
  2190. }
  2191. __EXT_MFC_INT_PTR CExtMsgBox::DoModal()
  2192. {
  2193. __PROF_UIS_MANAGE_STATE;
  2194. ASSERT_VALID( this );
  2195. UINT nMsgBoxStyle = MsgBoxStyleGet();
  2196. if( ( nMsgBoxStyle & (__EXT_MB_DO_NOT_DISPLAY_AGAIN|__EXT_MB_DO_NOT_ASK_AGAIN) ) != 0 )
  2197. {
  2198. CExtSafeString strRegVarName = OnMsgBoxGetRegVarName();
  2199. int nResult = ::AfxGetApp()->GetProfileInt( g_strRegSectionName, LPCTSTR(strRegVarName), (-1) );
  2200. if( nResult != (-1) )
  2201. return nResult;
  2202. }
  2203. __EXT_MFC_INT_PTR nRetVal = (__EXT_MFC_INT_PTR)m_nEscapeButtonDlgCtrlID;
  2204. const WORD nDlgItems = 0;
  2205. DLGTEMPLATE dlgTmpl;
  2206. dlgTmpl.x = 0;
  2207. dlgTmpl.y = 0;
  2208. dlgTmpl.cx = 225;
  2209. dlgTmpl.cy = 152;
  2210. dlgTmpl.style = WS_CAPTION|WS_POPUP|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_SYSMENU|DS_3DLOOK|DS_MODALFRAME|DS_SETFONT;
  2211. bool bRTL = ( (g_ResourceManager->OnQueryLangLayout()&LAYOUT_RTL) != 0 ) ? true : false;
  2212. dlgTmpl.dwExtendedStyle = bRTL ? WS_EX_LAYOUTRTL : 0;
  2213. dlgTmpl.cdit = nDlgItems; // nDlgItems dialog items in the dialog
  2214. // The first step is to allocate memory to define the dialog. The information to be stored in the allocated buffer is the following:
  2215. // 1. DLGTEMPLATE structure
  2216. // 2. 0x0000 (Word) indicating the dialog has no menu
  2217. // 3. 0x0000 (Word) Let windows assign default class to the dialog
  2218. // 4. (Caption)  Null terminated UNICODE string
  2219. WCHAR szBoxCaption[] = L"";
  2220. WCHAR szFontName[] = L"MS Sans Serif";
  2221. TRY
  2222. {
  2223. // The following expressions have unnecessary parenthesis trying to make the comments more clear.
  2224. int nBufferSize =  sizeof(DLGTEMPLATE) + (2 * sizeof(WORD)) /*menu and class*/ + sizeof(szBoxCaption);
  2225. nBufferSize += sizeof(WORD) + sizeof(szFontName); /* font information*/
  2226. HLOCAL hLocal = ::LocalAlloc( LHND, nBufferSize );
  2227. if( hLocal == NULL )
  2228. ::AfxThrowMemoryException();
  2229. BYTE * pBuffer = (BYTE*)::LocalLock( hLocal );
  2230. if( pBuffer == NULL )
  2231. {
  2232. ::LocalFree( hLocal );
  2233. ::AfxThrowMemoryException();
  2234. }
  2235. BYTE * pdest = pBuffer;
  2236. // transfer DLGTEMPLATE structure to the buffer
  2237. __EXT_MFC_MEMCPY( pdest, nBufferSize, &dlgTmpl, sizeof(DLGTEMPLATE) );
  2238. pdest += sizeof(DLGTEMPLATE);
  2239. *(WORD*)pdest = 0; // no menu
  2240. *(WORD*)(pdest + sizeof(WORD)) = 0; // use default window class
  2241. pdest += 2 * sizeof(WORD);
  2242. __EXT_MFC_MEMCPY( pdest, nBufferSize, szBoxCaption, sizeof(szBoxCaption) );
  2243. pdest += sizeof(szBoxCaption);
  2244. *(WORD*)pdest = 8; // font size
  2245. pdest += sizeof(WORD);
  2246. __EXT_MFC_MEMCPY( pdest, nBufferSize, szFontName, sizeof(szFontName) );
  2247. pdest += sizeof(szFontName);
  2248. HWND hWndParent = m_hWndParentFromCTOR;
  2249. if( hWndParent == NULL || (! ::IsWindow( hWndParent ) ) )
  2250. hWndParent = ::AfxGetMainWnd() -> GetSafeHwnd();
  2251. InitModalIndirect( (DLGTEMPLATE*)pBuffer, CWnd::FromHandle( hWndParent ) );
  2252. #if (defined _DEBUG)
  2253. #if (_MFC_VER < 0x700)
  2254. CWinThread * pWT = ::AfxGetThread();
  2255. int nSavedWTDisablePumpCount = pWT->m_nDisablePumpCount;
  2256. pWT->m_nDisablePumpCount = 0;
  2257. #else
  2258. _AFX_THREAD_STATE * pATH = ::AfxGetThreadState();
  2259. int nSavedWTDisablePumpCount = pATH->m_nDisablePumpCount;
  2260. pATH->m_nDisablePumpCount = 0;
  2261. #endif
  2262. #endif
  2263. nRetVal = CDialog::DoModal();
  2264. #if (defined _DEBUG)
  2265. #if (_MFC_VER < 0x700)
  2266. pWT->m_nDisablePumpCount = nSavedWTDisablePumpCount;
  2267. #else
  2268. pATH->m_nDisablePumpCount = nSavedWTDisablePumpCount;
  2269. #endif
  2270. #endif
  2271. ::LocalUnlock( hLocal );
  2272. ::LocalFree( hLocal );
  2273. }
  2274. CATCH( CMemoryException,  e)
  2275. {
  2276. TRACE0("Memory allocation for dialog template failed in CExtMsgBox::DoModal().");
  2277. }
  2278. END_CATCH
  2279. return nRetVal;
  2280. }
  2281. void CExtMsgBox::EndDialog( int nResult )
  2282. {
  2283. ASSERT_VALID( this );
  2284. bool bDoNotDisplayAgain = false;
  2285. CExtCheckBox * pWndCheckBoxDoNotDisplayAgain = DYNAMIC_DOWNCAST( CExtCheckBox, GetDlgItem( ID_EXT_MBB_CHECK_BOX ) );
  2286. if( pWndCheckBoxDoNotDisplayAgain != NULL )
  2287. {
  2288. ASSERT_VALID( pWndCheckBoxDoNotDisplayAgain );
  2289. bDoNotDisplayAgain = ( pWndCheckBoxDoNotDisplayAgain->GetCheck() == BST_CHECKED ) ? true : false;
  2290. }
  2291. UINT nMsgBoxStyle = MsgBoxStyleGet();
  2292. if( ( ( nMsgBoxStyle & __EXT_MB_DO_NOT_DISPLAY_AGAIN ) != 0 && bDoNotDisplayAgain )
  2293. || ( ( nMsgBoxStyle & __EXT_MB_DO_NOT_ASK_AGAIN ) != 0 && bDoNotDisplayAgain )
  2294. )
  2295. {
  2296. CExtSafeString strRegVarName = OnMsgBoxGetRegVarName();
  2297. ::AfxGetApp()->WriteProfileInt( g_strRegSectionName, LPCTSTR(strRegVarName), nResult );
  2298. }
  2299. if( m_bDynamicIcon )
  2300. {
  2301. m_bmpIcon.Empty();
  2302. m_bDynamicIcon = false;
  2303. }
  2304. #if ( _MFC_VER == 0x700 )
  2305. CExtResizableDialog
  2306. #else
  2307. CExtNCW < CExtResizableDialog >
  2308. #endif
  2309. :: EndDialog(nResult);
  2310. }
  2311. BOOL CExtMsgBox::OnInitDialog()
  2312. {
  2313. if ( !
  2314. #if ( _MFC_VER == 0x700 )
  2315. CExtResizableDialog
  2316. #else
  2317. CExtNCW < CExtResizableDialog >
  2318. #endif
  2319. :: OnInitDialog()
  2320. )
  2321. return FALSE;
  2322. ModifyStyle( 0, WS_CLIPCHILDREN|WS_CLIPSIBLINGS );
  2323. SetWindowText( LPCTSTR(CaptionGet()) );
  2324. SetHelpID( m_nHelpID );
  2325. OnMsgBoxRegisterButtons();
  2326. VERIFY( OnMsgBoxCreateIconLabel() );
  2327. VERIFY( OnMsgBoxCreateMessageLabel() );
  2328. VERIFY( OnMsgBoxCreateCheckBox() );
  2329. VERIFY( OnMsgBoxCreateButtons() );
  2330. SubclassChildControls();
  2331. OnMsgBoxLayout();
  2332. UINT nMsgBoxStyle = MsgBoxStyleGet();
  2333. if( ( nMsgBoxStyle & __EXT_MB_NO_SOUND ) == 0 )
  2334. {
  2335. UINT nMsgBoxIconType = nMsgBoxStyle & __EXT_MB_ICONMASK;
  2336. MessageBeep( nMsgBoxIconType );
  2337. }
  2338. if( ( nMsgBoxStyle & __EXT_MB_SYSTEMMODAL ) != 0 )
  2339. ModifyStyle(0, DS_SYSMODAL);
  2340. if( ( nMsgBoxStyle & __EXT_MB_SETFOREGROUND ) != 0 )
  2341. SetForegroundWindow();
  2342. if( ( nMsgBoxStyle & __EXT_MB_TOPMOST ) != 0 )
  2343. ModifyStyleEx(0, WS_EX_TOPMOST);
  2344. if( m_nEscapeButtonDlgCtrlID == UINT(IDC_STATIC) )
  2345. GetSystemMenu( FALSE ) -> EnableMenuItem( SC_CLOSE, MF_GRAYED );
  2346. bool bIsDisabledTimeout = true;
  2347. UINT nTimeoutSeconds = TimeoutGet( &bIsDisabledTimeout );
  2348. if( nTimeoutSeconds > 0 )
  2349. {
  2350. if( bIsDisabledTimeout )
  2351. {
  2352. INT nButtonIndex, nButtonsCount( INT( m_arrMsgBoxButtons.GetSize() ) );
  2353. for( nButtonIndex = 0; nButtonIndex < nButtonsCount; nButtonIndex ++ )
  2354. {
  2355. CWnd * pWndButton = GetDlgItem( m_arrMsgBoxButtons[ nButtonIndex ] -> m_nButtonDlgCtrlID );
  2356. if( pWndButton != NULL )
  2357. {
  2358. ASSERT_VALID( pWndButton );
  2359. pWndButton->EnableWindow( FALSE );
  2360. }
  2361. }
  2362. CExtCheckBox * pWndCheckBoxDoNotDisplayAgain = DYNAMIC_DOWNCAST( CExtCheckBox, GetDlgItem( ID_EXT_MBB_CHECK_BOX ) );
  2363. if( pWndCheckBoxDoNotDisplayAgain != NULL )
  2364. {
  2365. ASSERT_VALID( pWndCheckBoxDoNotDisplayAgain );
  2366. pWndCheckBoxDoNotDisplayAgain->EnableWindow( FALSE );
  2367. }
  2368. }
  2369. m_nTimeoutTimer = (UINT)SetTimer( 678, 1000, NULL );
  2370. }
  2371. if( m_nDefaultButtonDlgCtrlID != UINT(IDC_STATIC) )
  2372. {
  2373. CWnd * pWndButton = GetDlgItem( m_nDefaultButtonDlgCtrlID );
  2374. if( pWndButton != NULL )
  2375. {
  2376. ASSERT_VALID( pWndButton );
  2377. pWndButton->SetFocus();
  2378. }
  2379. //SetDefID( m_nDefaultButtonDlgCtrlID );
  2380. return FALSE; // focus is set
  2381. }
  2382. return TRUE;
  2383. }
  2384. BOOL CExtMsgBox::OnCmdMsg( UINT nID, int nCode, void * pExtra, AFX_CMDHANDLERINFO * pHandlerInfo )
  2385. {
  2386. ASSERT_VALID( this );
  2387. if( ( nID == ID_EXT_MBB_HELP ) && ( nCode == CN_COMMAND ) )
  2388. {
  2389. OnMsgBoxHelp();
  2390. return TRUE;
  2391. }
  2392. if( ( nID != UINT(IDC_STATIC) ) && ( nID != ID_EXT_MBB_CHECK_BOX ) && ( nCode == CN_COMMAND ) )
  2393. {
  2394. if( nID == ID_EXT_MBB_EX_COPY_BUTTON )
  2395. OnMsgBoxCopyToClipboard();
  2396. else
  2397. EndDialog( nID );
  2398. return TRUE;
  2399. }
  2400. return
  2401. #if ( _MFC_VER == 0x700 )
  2402. CExtResizableDialog
  2403. #else
  2404. CExtNCW < CExtResizableDialog >
  2405. #endif
  2406. :: OnCmdMsg( nID, nCode, pExtra, pHandlerInfo );
  2407. }
  2408. BOOL CExtMsgBox::PreTranslateMessage( MSG * pMsg )
  2409. {
  2410. if( pMsg->message == WM_KEYDOWN )
  2411. {
  2412. bool bIsDisabledTimeout = true;
  2413. UINT nTimeoutSeconds = TimeoutGet( &bIsDisabledTimeout );
  2414. if ( bIsDisabledTimeout && nTimeoutSeconds > 0 )
  2415. return TRUE;
  2416. if( pMsg->wParam == VK_RETURN )
  2417. {
  2418. CWnd * pFocusWnd = GetFocus();
  2419. if( pFocusWnd != NULL )
  2420. {
  2421. UINT nDlgCtrlID = UINT( pFocusWnd->GetDlgCtrlID() );
  2422. INT nButtonIndex, nButtonsCount( INT( m_arrMsgBoxButtons.GetSize() ) );
  2423. for( nButtonIndex = 0; nButtonIndex < nButtonsCount; nButtonIndex ++ )
  2424. {
  2425. if ( m_arrMsgBoxButtons[ nButtonIndex ] -> m_nButtonDlgCtrlID == nDlgCtrlID )
  2426. {
  2427. m_nDefaultButtonDlgCtrlID = nDlgCtrlID;
  2428. break;
  2429. }
  2430. }
  2431. EndDialog( m_nDefaultButtonDlgCtrlID );
  2432. return TRUE;
  2433. }
  2434. }
  2435. else if( pMsg->wParam == VK_ESCAPE || pMsg->wParam == VK_CANCEL )
  2436. {
  2437. if( m_nEscapeButtonDlgCtrlID != UINT(IDC_STATIC) )
  2438. EndDialog( m_nEscapeButtonDlgCtrlID );
  2439. return TRUE;
  2440. }
  2441. else if(
  2442. ( pMsg->wParam == WPARAM('C') || pMsg->wParam == VK_INSERT )
  2443. && ( HIWORD(pMsg->lParam) & KF_ALTDOWN ) == 0
  2444. && ( ::GetKeyState(VK_SHIFT) & 0x80000000 ) == 0
  2445. && ( ::GetKeyState(VK_CONTROL) & 0x80000000 ) != 0
  2446. )
  2447. {
  2448. UINT nMsgBoxStyleEx = MsgBoxStyleExGet();
  2449. if( ( nMsgBoxStyleEx & __EXT_MB_EX_DISABLE_KEYBOARD_COPY_ACCEL ) == 0 )
  2450. OnMsgBoxCopyToClipboard();
  2451. return TRUE;
  2452. }
  2453. else if( pMsg->wParam == VK_F1 )
  2454. {
  2455. UINT nMsgBoxStyle = MsgBoxStyleExGet();
  2456. if( ( nMsgBoxStyle & __EXT_MB_HELP ) != 0 )
  2457. OnMsgBoxHelp();
  2458. return TRUE;
  2459. }
  2460. }
  2461. return
  2462. #if ( _MFC_VER == 0x700 )
  2463. CExtResizableDialog
  2464. #else
  2465. CExtNCW < CExtResizableDialog >
  2466. #endif
  2467. :: PreTranslateMessage( pMsg );
  2468. }
  2469. void CExtMsgBox::OnTimer( __EXT_MFC_UINT_PTR nIDEvent )
  2470. {
  2471. if( nIDEvent == 678 )
  2472. {
  2473. INT nButtonIndex, nButtonsCount( INT( m_arrMsgBoxButtons.GetSize() ) );
  2474. if( OnMsgBoxTimeoutDecrease() )
  2475. {
  2476. KillTimer( m_nTimeoutTimer );
  2477. if ( IsDisabledTimeout() )
  2478. {
  2479. for( nButtonIndex = 0; nButtonIndex < nButtonsCount; nButtonIndex ++ )
  2480. {
  2481. CWnd * pWndButton = GetDlgItem( m_arrMsgBoxButtons[ nButtonIndex ] -> m_nButtonDlgCtrlID );
  2482. if( pWndButton != NULL )
  2483. {
  2484. ASSERT_VALID( pWndButton );
  2485. pWndButton->EnableWindow( TRUE );
  2486. }
  2487. }
  2488. CExtCheckBox * pWndCheckBoxDoNotDisplayAgain = DYNAMIC_DOWNCAST( CExtCheckBox, GetDlgItem( ID_EXT_MBB_CHECK_BOX ) );
  2489. if( pWndCheckBoxDoNotDisplayAgain != NULL )
  2490. {
  2491. ASSERT_VALID( pWndCheckBoxDoNotDisplayAgain );
  2492. pWndCheckBoxDoNotDisplayAgain->EnableWindow( TRUE );
  2493. }
  2494. }
  2495. else
  2496. EndDialog( m_nDefaultButtonDlgCtrlID );
  2497. }
  2498. for( nButtonIndex = 0; nButtonIndex < nButtonsCount; nButtonIndex ++ )
  2499. {
  2500. if ( m_arrMsgBoxButtons[ nButtonIndex ] -> m_nButtonDlgCtrlID == m_nDefaultButtonDlgCtrlID )
  2501. {
  2502. CExtSafeString strButtonText = m_arrMsgBoxButtons[ nButtonIndex ] -> m_strCaption;
  2503. CExtSafeString strFullText = strButtonText;
  2504. UINT nTimeoutSeconds = TimeoutGet();
  2505. if( nTimeoutSeconds > 0 )
  2506. strFullText.Format( _T("%s = %d"), strButtonText, nTimeoutSeconds );
  2507. CWnd * pWndButton = GetDlgItem( m_arrMsgBoxButtons[ nButtonIndex ] -> m_nButtonDlgCtrlID );
  2508. if( pWndButton != NULL )
  2509. {
  2510. ASSERT_VALID( pWndButton );
  2511. pWndButton->SetWindowText( strFullText );
  2512. }
  2513. }
  2514. }
  2515. }
  2516. #if ( _MFC_VER == 0x700 )
  2517. CExtResizableDialog
  2518. #else
  2519. CExtNCW < CExtResizableDialog >
  2520. #endif
  2521. :: OnTimer( nIDEvent );
  2522. }
  2523. BOOL CExtMsgBox::OnWndMsg( UINT message, WPARAM wParam, LPARAM lParam, LRESULT * pResult )
  2524. {
  2525. ASSERT_VALID( this );
  2526. if ( message == WM_CLOSE )
  2527. {
  2528. bool bIsDisabledTimeout = true;
  2529. UINT nTimeoutSeconds = TimeoutGet( &bIsDisabledTimeout );
  2530. if ( bIsDisabledTimeout && nTimeoutSeconds > 0 )
  2531. return TRUE;
  2532. if( m_nEscapeButtonDlgCtrlID != UINT(IDC_STATIC) )
  2533. EndDialog( m_nEscapeButtonDlgCtrlID );
  2534. return TRUE;
  2535. }
  2536. return
  2537. #if ( _MFC_VER == 0x700 )
  2538. CExtResizableDialog
  2539. #else
  2540. CExtNCW < CExtResizableDialog >
  2541. #endif
  2542. :: OnWndMsg( message, wParam, lParam, pResult );
  2543. }
  2544. void CExtMsgBox::RegisterButton(
  2545. UINT nButtonDlgCtrlID,
  2546. __EXT_MFC_SAFE_LPCTSTR strCaption,
  2547. bool bIsDefault, //  = false
  2548. bool bIsEscape // = false
  2549. )
  2550. {
  2551. ASSERT_VALID( this );
  2552. msgbox_button_info_t * p_mbbi = new msgbox_button_info_t( nButtonDlgCtrlID, strCaption );
  2553. m_arrMsgBoxButtons.Add( p_mbbi );
  2554. if( bIsDefault )
  2555. m_nDefaultButtonDlgCtrlID = nButtonDlgCtrlID;
  2556. if( bIsEscape )
  2557. m_nEscapeButtonDlgCtrlID = nButtonDlgCtrlID;
  2558. }
  2559. void CExtMsgBox::RegisterButton(
  2560. UINT nButtonDlgCtrlID,
  2561. UINT nCaptionResourceID,
  2562. bool bIsDefault, //  = false
  2563. bool bIsEscape // = false
  2564. )
  2565. {
  2566. ASSERT_VALID( this );
  2567. CExtSafeString strCaption;
  2568. VERIFY( g_ResourceManager->LoadString( strCaption, nCaptionResourceID ) );
  2569. RegisterButton( nButtonDlgCtrlID, LPCTSTR(strCaption), bIsDefault, bIsEscape );
  2570. }
  2571. void CExtMsgBox::UnRegisterAllButtons()
  2572. {
  2573. ASSERT_VALID( this );
  2574. INT nButtonIndex, nButtonsCount( INT( m_arrMsgBoxButtons.GetSize() ) );
  2575. for( nButtonIndex = 0; nButtonIndex < nButtonsCount; nButtonIndex ++ )
  2576. {
  2577. msgbox_button_info_t * p_mbbi = m_arrMsgBoxButtons[ nButtonIndex ];
  2578. ASSERT( p_mbbi != NULL );
  2579. delete p_mbbi;
  2580. }
  2581. m_arrMsgBoxButtons.RemoveAll();
  2582. }
  2583. CExtSafeString CExtMsgBox::OnMsgBoxGetRegVarName() const // for __EXT_MB_DO_NOT_DISPLAY_AGAIN and __EXT_MB_DO_NOT_ASK_AGAIN
  2584. {
  2585. ASSERT_VALID( this );
  2586. CExtSafeString strMessageText = MessageGet();
  2587. INT nChar, nLen = INT( strMessageText.GetLength() ), nChecksum = 0;
  2588. for( nChar = 0; nChar < nLen; nChar++ )
  2589. nChecksum += INT(strMessageText.GetAt(nChar)) * nChar;
  2590. CExtSafeString strRegVarName;
  2591. strRegVarName.Format(
  2592. _T("msgbox-%s-helpid-%d-chksum-%d"),
  2593. m_strUniqueID.IsEmpty() ? _T("not-unique") : LPCTSTR(m_strUniqueID),
  2594. m_nHelpID,
  2595. nChecksum
  2596. );
  2597. return strRegVarName;
  2598. }
  2599. void CExtMsgBox::OnMsgBoxRegisterButtons()
  2600. {
  2601. ASSERT_VALID( this );
  2602. UINT nMsgBoxStyle = MsgBoxStyleGet();
  2603. UINT nMsgBoxStyleEx = MsgBoxStyleExGet();
  2604. if( ( nMsgBoxStyleEx & (__EXT_MB_EX_COPY_BUTTON|__EXT_MB_EX_COPY_BTN_FIRST) ) == (__EXT_MB_EX_COPY_BUTTON|__EXT_MB_EX_COPY_BTN_FIRST) )
  2605. RegisterButton( ID_EXT_MBB_EX_COPY_BUTTON, IDS_EX_MB_EX_COPY_BUTTON );
  2606. UINT nMsgBoxType = nMsgBoxStyle & __EXT_MB_TYPEMASK;
  2607. switch( nMsgBoxType )
  2608. {
  2609. case __EXT_MB_OKCANCEL:
  2610. RegisterButton( ID_EXT_MBB_OK, IDS_EX_MB_OK, true );
  2611. RegisterButton( ID_EXT_MBB_CANCEL, IDS_EX_MB_CANCEL, false, true );
  2612. break;
  2613. case __EXT_MB_ABORTRETRYIGNORE:
  2614. RegisterButton( ID_EXT_MBB_ABORT, IDS_EX_MB_ABORT, true );
  2615. RegisterButton( ID_EXT_MBB_RETRY, IDS_EX_MB_RETRY );
  2616. RegisterButton( ID_EXT_MBB_IGNORE, IDS_EX_MB_IGNORE );
  2617. break;
  2618. case __EXT_MB_YESNOCANCEL:
  2619. RegisterButton( ID_EXT_MBB_YES, IDS_EX_MB_YES, true );
  2620. if( ( nMsgBoxStyle & __EXT_MB_YES_TO_ALL ) != 0 )
  2621. RegisterButton( ID_EXT_MBB_YES_TO_ALL, IDS_EX_MB_YES_TO_ALL );
  2622. RegisterButton( ID_EXT_MBB_NO, IDS_EX_MB_NO );
  2623. if( ( nMsgBoxStyle & __EXT_MB_NO_TO_ALL ) != 0 )
  2624. RegisterButton( ID_EXT_MBB_NO_TO_ALL, IDS_EX_MB_NO_TO_ALL );
  2625. RegisterButton( ID_EXT_MBB_CANCEL, IDS_EX_MB_CANCEL, false, true );
  2626. break;
  2627. case __EXT_MB_YESNO:
  2628. RegisterButton( ID_EXT_MBB_YES, IDS_EX_MB_YES, true );
  2629. if( ( nMsgBoxStyle & __EXT_MB_YES_TO_ALL ) != 0 )
  2630. RegisterButton( ID_EXT_MBB_YES_TO_ALL, IDS_EX_MB_YES_TO_ALL );
  2631. RegisterButton( ID_EXT_MBB_NO, IDS_EX_MB_NO );
  2632. if( ( nMsgBoxStyle & __EXT_MB_NO_TO_ALL ) != 0 )
  2633. RegisterButton( ID_EXT_MBB_NO_TO_ALL, IDS_EX_MB_NO_TO_ALL );
  2634. break;
  2635. case __EXT_MB_RETRYCANCEL:
  2636. RegisterButton( ID_EXT_MBB_RETRY, IDS_EX_MB_RETRY, true );
  2637. RegisterButton( ID_EXT_MBB_CANCEL, IDS_EX_MB_CANCEL, false, true );
  2638. break;
  2639. case __EXT_MB_CANCELTRYCONTINUE:
  2640. RegisterButton( ID_EXT_MBB_CANCEL, IDS_EX_MB_CANCEL, true, true );
  2641. RegisterButton( ID_EXT_MBB_TRY_AGAIN, IDS_EX_MB_RETRY );
  2642. RegisterButton( ID_EXT_MBB_CONTINUE, IDS_EX_MB_CONTINUE );
  2643. break;
  2644. case __EXT_MB_CONTINUEABORT:
  2645. RegisterButton( ID_EXT_MBB_CONTINUE, IDS_EX_MB_CONTINUE, true );
  2646. RegisterButton( ID_EXT_MBB_ABORT, IDS_EX_MB_ABORT );
  2647. break;
  2648. case __EXT_MB_SKIPSKIPALLCANCEL:
  2649. RegisterButton( ID_EXT_MBB_SKIP, IDS_EX_MB_SKIP, true );
  2650. RegisterButton( ID_EXT_MBB_SKIP_ALL, IDS_EX_MB_SKIPALL );
  2651. RegisterButton( ID_EXT_MBB_CANCEL, IDS_EX_MB_CANCEL, false, true );
  2652. break;
  2653. case __EXT_MB_IGNOREIGNOREALLCANCEL:
  2654. RegisterButton( ID_EXT_MBB_IGNORE, IDS_EX_MB_IGNORE, true );
  2655. RegisterButton( ID_EXT_MBB_IGNORE_ALL, IDS_EX_MB_IGNOREALL );
  2656. RegisterButton( ID_EXT_MBB_CANCEL, IDS_EX_MB_CANCEL, FALSE, true );
  2657. break;
  2658. case __EXT_MB_OK:
  2659. default:
  2660. RegisterButton( ID_EXT_MBB_OK, IDS_EX_MB_OK, true, true );
  2661. break;
  2662. }
  2663. if( ( nMsgBoxStyle & __EXT_MB_HELP ) != 0 )
  2664. RegisterButton( ID_EXT_MBB_HELP, IDS_EX_MB_HELP );
  2665. if( ( nMsgBoxStyleEx & (__EXT_MB_EX_COPY_BUTTON|__EXT_MB_EX_COPY_BTN_FIRST) ) == __EXT_MB_EX_COPY_BUTTON )
  2666. RegisterButton( ID_EXT_MBB_EX_COPY_BUTTON, IDS_EX_MB_EX_COPY_BUTTON );
  2667. UINT nDefStyle = nMsgBoxStyle & __EXT_MB_DEFMASK;
  2668. if( nDefStyle != 0 )
  2669. {
  2670. int nDefaultIndex = 0;
  2671. switch( nDefStyle )
  2672. {
  2673. case __EXT_MB_DEFBUTTON1: nDefaultIndex = 0; break;
  2674. case __EXT_MB_DEFBUTTON2: nDefaultIndex = 1; break;
  2675. case __EXT_MB_DEFBUTTON3: nDefaultIndex = 2; break;
  2676. case __EXT_MB_DEFBUTTON4: nDefaultIndex = 3; break;
  2677. case __EXT_MB_DEFBUTTON5: nDefaultIndex = 4; break;
  2678. case __EXT_MB_DEFBUTTON6: nDefaultIndex = 5; break;
  2679. }
  2680. if ( m_arrMsgBoxButtons.GetSize() >= ( nDefaultIndex + 1 ) )
  2681. m_nDefaultButtonDlgCtrlID = m_arrMsgBoxButtons[ nDefaultIndex ] -> m_nButtonDlgCtrlID;
  2682. }
  2683. m_bDynamicIcon = m_bmpIcon.IsEmpty() ? true : false;
  2684. if( m_bDynamicIcon )
  2685. {
  2686. UINT nMsgBoxIconType = nMsgBoxStyle & __EXT_MB_ICONMASK;
  2687. if( nMsgBoxIconType != 0 )
  2688. {
  2689. LPCTSTR strStdIconID = NULL;
  2690. switch( nMsgBoxIconType )
  2691. {
  2692. case __EXT_MB_ICONEXCLAMATION: strStdIconID = IDI_EXCLAMATION; break;
  2693. case __EXT_MB_ICONHAND:        strStdIconID = IDI_HAND;        break;
  2694. case __EXT_MB_ICONQUESTION:    strStdIconID = IDI_QUESTION;    break;
  2695. case __EXT_MB_ICONASTERISK:    strStdIconID = IDI_ASTERISK;    break;
  2696. }
  2697. if( strStdIconID != NULL )
  2698. {
  2699. HICON hIcon = ::AfxGetApp() -> LoadStandardIcon( strStdIconID );
  2700. if( hIcon != NULL )
  2701. {
  2702. m_bmpIcon.AssignFromHICON( hIcon );
  2703. ::DestroyIcon( hIcon );
  2704. }
  2705. }
  2706. }
  2707. }
  2708. m_bDynamicIcon = m_bmpIcon.IsEmpty() ? true : false;
  2709. }
  2710. bool CExtMsgBox::OnMsgBoxCreateIconLabel()
  2711. {
  2712. ASSERT_VALID( this );
  2713. ASSERT( GetSafeHwnd() != NULL );
  2714. if( m_bmpIcon.IsEmpty() )
  2715. return true;
  2716. CRect rc( 0, 0, 0, 0 );
  2717. DWORD dwStyle =
  2718. WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN|WS_CLIPSIBLINGS|WS_DISABLED
  2719. |SS_CENTER|SS_CENTERIMAGE;
  2720. if( ! m_wndLabelMsgBoxIcon.Create( NULL, dwStyle, rc, this, UINT(IDC_STATIC) ) )
  2721. return false;
  2722. m_wndLabelMsgBoxIcon.SetBitmapEx( &m_bmpIcon );
  2723. m_wndLabelMsgBoxIcon.SetImageMode( CExtLabel::eAlign );
  2724. return true;
  2725. }
  2726. bool CExtMsgBox::OnMsgBoxCreateMessageLabel()
  2727. {
  2728. ASSERT_VALID( this );
  2729. ASSERT( GetSafeHwnd() != NULL );
  2730. CDC dcDisplay;
  2731. if( ! dcDisplay.CreateDC(_T("DISPLAY"), NULL, NULL, NULL) )
  2732. return false;
  2733. UINT nMsgBoxStyle = MsgBoxStyleGet();
  2734. UINT nMsgBoxStyleEx = MsgBoxStyleExGet();
  2735. CFont * pOldFont = dcDisplay.SelectObject( GetFont() );
  2736. int nMaxWidth = ( ::GetSystemMetrics( SM_CXSCREEN ) / 2 ) + 100;
  2737. CSize sizeIcon = m_bmpIcon.GetSize();
  2738. if( sizeIcon.cx > 0 )
  2739. nMaxWidth -= sizeIcon.cx + 2 * _DLU2PxHorz( m_sizeBorder.cx );
  2740. CRect rcMessage( 0, 0, nMaxWidth, nMaxWidth );
  2741. dcDisplay.DrawText( LPCTSTR(m_strMessageText), m_strMessageText.GetLength(), rcMessage, DT_LEFT|DT_NOPREFIX|DT_WORDBREAK|DT_EXPANDTABS|DT_CALCRECT );
  2742. m_sizeMessageText = rcMessage.Size();
  2743. dcDisplay.SelectObject( pOldFont );
  2744. dcDisplay.DeleteDC();
  2745. if( ( nMsgBoxStyleEx & __EXT_MB_EX_USE_EDIT_CONTROL ) != 0 )
  2746. {
  2747. if( ( nMsgBoxStyleEx & __EXT_MB_EX_SCROLLABLE_EDIT ) !=0 )
  2748. m_sizeMessageText.cx += ::GetSystemMetrics( SM_CXVSCROLL );
  2749. INT nMinEditCtrlHeight = MinEditCtrlHeightGet();
  2750. if( nMinEditCtrlHeight > 0 )
  2751. m_sizeMessageText.cy = max( m_sizeMessageText.cy, nMinEditCtrlHeight );
  2752. INT nMaxEditCtrlHeight = MaxEditCtrlHeightGet();
  2753. if( nMaxEditCtrlHeight > 0 )
  2754. m_sizeMessageText.cy = min( m_sizeMessageText.cy, nMaxEditCtrlHeight );
  2755. }
  2756. CRect rc( 0, 0, 0, 0 );
  2757. DWORD dwStyle = WS_CHILD|WS_VISIBLE;
  2758. CExtSafeString strMessageText = MessageGet();
  2759. if( ( nMsgBoxStyleEx & __EXT_MB_EX_USE_EDIT_CONTROL ) != 0 )
  2760. {
  2761. if( ( nMsgBoxStyle & __EXT_MB_RIGHT ) != 0 )
  2762. dwStyle |= ES_RIGHT;
  2763. else
  2764. dwStyle |= ES_LEFT;
  2765. dwStyle |=
  2766. WS_CLIPCHILDREN|WS_CLIPSIBLINGS|WS_TABSTOP
  2767. |ES_MULTILINE|ES_NOHIDESEL|ES_READONLY|ES_AUTOVSCROLL;
  2768. if( ( nMsgBoxStyleEx & __EXT_MB_EX_SCROLLABLE_EDIT ) != 0 )
  2769. dwStyle |= WS_VSCROLL;
  2770. if( ! m_wndEditMsgBoxMessageText.Create( dwStyle, rc, this, UINT(IDC_STATIC) ) )
  2771. return false;
  2772. if( m_clrEditorText != COLORREF(-1L) )
  2773. m_wndEditMsgBoxMessageText.SetTextColor( m_clrEditorText );
  2774. if( m_clrEditorBkgnd != COLORREF(-1L) )
  2775. m_wndEditMsgBoxMessageText.SetBkColor( m_clrEditorBkgnd );
  2776. if( ( nMsgBoxStyle & __EXT_MB_RTLREADING ) != 0 )
  2777. m_wndEditMsgBoxMessageText.ModifyStyleEx( 0, WS_EX_RTLREADING );
  2778. m_wndEditMsgBoxMessageText.SetFont( GetFont() );
  2779. m_wndEditMsgBoxMessageText.SetWindowText( LPCTSTR(strMessageText) );
  2780. }
  2781. else
  2782. {
  2783. dwStyle |= SS_NOPREFIX;
  2784. if( ( nMsgBoxStyle & __EXT_MB_RIGHT ) != 0 )
  2785. dwStyle |= SS_RIGHT;
  2786. else
  2787. dwStyle |= SS_LEFT;
  2788. if( ! m_wndLabelMsgBoxMessageText.Create( LPCTSTR(strMessageText),  dwStyle|WS_CLIPCHILDREN|WS_CLIPSIBLINGS, rc, this, UINT(IDC_STATIC) ) )
  2789. return false;
  2790. if( ( nMsgBoxStyle & __EXT_MB_RTLREADING ) != 0 )
  2791. m_wndLabelMsgBoxMessageText.ModifyStyleEx( 0, WS_EX_RTLREADING );
  2792. m_wndLabelMsgBoxMessageText.SetFont( GetFont() );
  2793. }
  2794. return true;
  2795. }
  2796. bool CExtMsgBox::OnMsgBoxCreateCheckBox()
  2797. {
  2798. ASSERT_VALID( this );
  2799. ASSERT( GetSafeHwnd() != NULL );
  2800. UINT nMsgBoxStyle = MsgBoxStyleGet();
  2801. UINT nMsgBoxStyleEx = MsgBoxStyleExGet();
  2802. if( ( nMsgBoxStyle & (__EXT_MB_DO_NOT_DISPLAY_AGAIN|__EXT_MB_DO_NOT_ASK_AGAIN) ) != 0 )
  2803. {
  2804. CExtSafeString strCheckboxCaption;
  2805. if( ( nMsgBoxStyle & __EXT_MB_DO_NOT_DISPLAY_AGAIN ) != 0 )
  2806. {
  2807. VERIFY( g_ResourceManager->LoadString( strCheckboxCaption, IDS_EX_MB_DO_NOT_DISPLAY_AGAIN ) );
  2808. }
  2809. else if( ( nMsgBoxStyle & __EXT_MB_DO_NOT_ASK_AGAIN ) != 0 )
  2810. {
  2811. VERIFY( g_ResourceManager->LoadString( strCheckboxCaption, IDS_EX_MB_DO_NOT_ASK_AGAIN ) );
  2812. }
  2813. CClientDC dc( this );
  2814. CFont * pWndFont = GetFont();
  2815. CFont * pOldFont = dc.SelectObject( pWndFont );
  2816. m_sizeCheckBox = dc.GetTextExtent( LPCTSTR(strCheckboxCaption), strCheckboxCaption.GetLength() );
  2817. m_sizeCheckBox.cx += _DLU2PxHorz( m_nCheckBoxGap );
  2818. dc.SelectObject( pOldFont );
  2819. CRect rc( 0, 0, 0, 0 );
  2820. CButton wnd;
  2821. if( ! wnd.Create( LPCTSTR(strCheckboxCaption), WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN|WS_CLIPSIBLINGS|WS_TABSTOP|BS_AUTOCHECKBOX, rc, this, ID_EXT_MBB_CHECK_BOX ) )
  2822. return false;
  2823. if( ( nMsgBoxStyle & __EXT_MB_CHECK_BOX_PRESENT ) != 0 )
  2824. wnd.SetCheck( ( ( nMsgBoxStyleEx & __EXT_MB_EX_CHECK_BOX_IS_NOT_CHECKED_INTIALLY ) == 0 ) ? BST_CHECKED : BST_UNCHECKED );
  2825. wnd.SetFont( pWndFont );
  2826. wnd.UnsubclassWindow();
  2827. }
  2828. return true;
  2829. }
  2830. bool CExtMsgBox::OnMsgBoxCreateButtons()
  2831. {
  2832. ASSERT_VALID( this );
  2833. ASSERT( GetSafeHwnd() != NULL );
  2834. m_sizeButton.cx = _DLU2PxHorz( m_sizeStdButton.cx );
  2835. m_sizeButton.cy = _DLU2PxVert( m_sizeStdButton.cy );
  2836. CClientDC dc( this );
  2837. CFont * pWndFont = GetFont();
  2838. CFont * pOldFont = dc.SelectObject( pWndFont );
  2839. CRect rc( 0, 0, 0, 0 );
  2840. INT nButtonIndex, nButtonsCount( INT( m_arrMsgBoxButtons.GetSize() ) );
  2841. for( nButtonIndex = 0; nButtonIndex < nButtonsCount; nButtonIndex ++ )
  2842. {
  2843. CExtSafeString strButtonCaption = m_arrMsgBoxButtons[ nButtonIndex ] -> m_strCaption;
  2844. CExtSafeString strLengthTest = strButtonCaption;
  2845. UINT nTimeoutSeconds = TimeoutGet();
  2846. if ( nTimeoutSeconds > 0 )
  2847. {
  2848. CString strTimeoutText;
  2849. strTimeoutText.Format( _T("%s = %d"), strLengthTest, nTimeoutSeconds );
  2850. strLengthTest = strTimeoutText;
  2851. }
  2852. CSize sButtonText = dc.GetTextExtent( LPCTSTR(strLengthTest), strLengthTest.GetLength() );
  2853. m_sizeButton.cx = max( m_sizeButton.cx, sButtonText.cx );
  2854. m_sizeButton.cy = max( m_sizeButton.cy, sButtonText.cy );
  2855. CButton wnd;
  2856. if( ! wnd.Create(
  2857. LPCTSTR(strButtonCaption),
  2858. WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN|WS_CLIPSIBLINGS|WS_TABSTOP
  2859. | ( ( m_arrMsgBoxButtons[ nButtonIndex ] -> m_nButtonDlgCtrlID == m_nDefaultButtonDlgCtrlID ) ? BS_DEFPUSHBUTTON : BS_PUSHBUTTON )
  2860. ,
  2861. rc,
  2862. this,
  2863. m_arrMsgBoxButtons[ nButtonIndex ] -> m_nButtonDlgCtrlID
  2864. )
  2865. )
  2866. return false;
  2867. wnd.SetFont( pWndFont );
  2868. wnd.UnsubclassWindow();
  2869. }
  2870. m_sizeButton.cx += 2 * _DLU2PxHorz( m_sizeStdButtonBorder.cx );
  2871. m_sizeButton.cy += 2 * _DLU2PxVert( m_sizeStdButtonBorder.cy );
  2872. dc.SelectObject( pOldFont );
  2873. return true;
  2874. }
  2875. void CExtMsgBox::OnMsgBoxHelp()
  2876. {
  2877. ASSERT_VALID( this );
  2878. ASSERT( GetSafeHwnd() != NULL );
  2879. OnHelp();
  2880. }
  2881. void CExtMsgBox::OnMsgBoxLayout()
  2882. {
  2883. ASSERT_VALID( this );
  2884. ASSERT( GetSafeHwnd() != NULL );
  2885. INT nButtonIndex, nButtonsCount( INT( m_arrMsgBoxButtons.GetSize() ) );
  2886. CSize sizeBorderPX( _DLU2PxHorz( m_sizeBorder.cx ), _DLU2PxVert( m_sizeBorder.cy ) );
  2887. CSize sizeClient = CSize( 2 * sizeBorderPX.cx, 2 * sizeBorderPX.cy );
  2888. CPoint ptPos( sizeBorderPX.cx, sizeBorderPX.cy );
  2889. CSize sizeIcon = m_bmpIcon.GetSize();
  2890. if( sizeIcon.cx > 0 )
  2891. {
  2892. m_wndLabelMsgBoxIcon.MoveWindow( sizeBorderPX.cx, sizeBorderPX.cy, sizeIcon.cx, sizeIcon.cy );
  2893. sizeClient.cx += sizeIcon.cx + sizeBorderPX.cx;
  2894. sizeClient.cy += sizeIcon.cy + sizeBorderPX.cy;
  2895. ptPos.x += sizeIcon.cx + sizeBorderPX.cx;
  2896. }
  2897. sizeClient.cx += m_sizeMessageText.cx + sizeBorderPX.cx;
  2898. sizeClient.cy = max( sizeClient.cy, m_sizeMessageText.cy + 2 *  sizeBorderPX.cy + _DLU2PxVert( m_sizeBorder.cy / 2 ) );
  2899. if( m_wndLabelMsgBoxMessageText.GetSafeHwnd() != NULL )
  2900. m_wndLabelMsgBoxMessageText.MoveWindow( ptPos.x, ptPos.y, m_sizeMessageText.cx, m_sizeMessageText.cy );
  2901. if( m_wndEditMsgBoxMessageText.GetSafeHwnd() != NULL )
  2902. m_wndEditMsgBoxMessageText.MoveWindow( ptPos.x, ptPos.y, m_sizeMessageText.cx, m_sizeMessageText.cy );
  2903. ptPos.y += m_sizeMessageText.cy + sizeBorderPX.cy + _DLU2PxVert( m_sizeBorder.cy / 2 );
  2904. UINT nMsgBoxStyle = MsgBoxStyleGet();
  2905. if( ( nMsgBoxStyle & (__EXT_MB_DO_NOT_DISPLAY_AGAIN|__EXT_MB_DO_NOT_ASK_AGAIN) ) != 0 )
  2906. {
  2907. CExtCheckBox * pWndCheckBoxDoNotDisplayAgain = DYNAMIC_DOWNCAST( CExtCheckBox, GetDlgItem( ID_EXT_MBB_CHECK_BOX ) );
  2908. if( pWndCheckBoxDoNotDisplayAgain != NULL )
  2909. {
  2910. ASSERT_VALID( pWndCheckBoxDoNotDisplayAgain );
  2911. pWndCheckBoxDoNotDisplayAgain->MoveWindow( ptPos.x, ptPos.y, m_sizeCheckBox.cx, m_sizeCheckBox.cy );
  2912. sizeClient.cx = max( sizeClient.cx, ptPos.x + m_sizeCheckBox.cx + sizeBorderPX.cx );
  2913. sizeClient.cy = max( sizeClient.cy, ptPos.y + m_sizeCheckBox.cy + sizeBorderPX.cy );
  2914. ptPos.y += m_sizeCheckBox.cy + sizeBorderPX.cy;
  2915. }
  2916. }
  2917. INT nButtonSpacePX = _DLU2PxHorz( m_nButtonSpace );
  2918. INT cxButtons = ( nButtonsCount - 1 ) * nButtonSpacePX + nButtonsCount * m_sizeButton.cx;
  2919. INT cyButtons = m_sizeButton.cy;
  2920. sizeClient.cx = max(sizeClient.cx, 2 * sizeBorderPX.cx + cxButtons);
  2921. sizeClient.cy += cyButtons + sizeBorderPX.cy;
  2922. INT nXButtonPosition = ( sizeClient.cx - cxButtons ) / 2;
  2923. INT nYButtonPosition = sizeClient.cy - sizeBorderPX.cy - m_sizeButton.cy;
  2924. if( ( nMsgBoxStyle & __EXT_MB_RIGHT_ALIGN ) != 0 )
  2925. nXButtonPosition = sizeClient.cx - cxButtons - sizeBorderPX.cx;
  2926. for( nButtonIndex = 0; nButtonIndex < nButtonsCount; nButtonIndex ++ )
  2927. {
  2928. CWnd * pWndButton = GetDlgItem( m_arrMsgBoxButtons[ nButtonIndex ] -> m_nButtonDlgCtrlID );
  2929. if ( pWndButton != NULL )
  2930. {
  2931. ASSERT_VALID( pWndButton );
  2932. pWndButton->MoveWindow( nXButtonPosition, nYButtonPosition, m_sizeButton.cx, m_sizeButton.cy );
  2933. nXButtonPosition += m_sizeButton.cx + nButtonSpacePX;
  2934. }
  2935. }
  2936. CRect rcClient( 0, 0, sizeClient.cx, sizeClient.cy );
  2937. CalcWindowRect( rcClient );
  2938. MoveWindow( rcClient );
  2939. CenterWindow();
  2940. }
  2941. bool CExtMsgBox::OnMsgBoxCopyToClipboard()
  2942. {
  2943. ASSERT_VALID( this );
  2944. ASSERT( GetSafeHwnd() != NULL );
  2945. CExtSafeString strMessageText = MessageGet();
  2946. INT nMessageTextLength = INT( strMessageText.GetLength() );
  2947. if( ! ::OpenClipboard( m_hWnd ) )
  2948. return false;
  2949. ::EmptyClipboard();
  2950. bool bRetVal = false;
  2951. HGLOBAL hGlobal =
  2952. ::GlobalAlloc( 
  2953. GMEM_DDESHARE, 
  2954. ( nMessageTextLength + 1 ) * sizeof(TCHAR) 
  2955. );
  2956. ASSERT( hGlobal != NULL );
  2957. if( hGlobal != NULL )
  2958. {
  2959. LPTSTR lpszBuffer = 
  2960. (LPTSTR) ::GlobalLock( hGlobal );
  2961. __EXT_MFC_STRCPY(
  2962. lpszBuffer, 
  2963. nMessageTextLength + 1,
  2964. ( nMessageTextLength == 0 ) ? _T("") : LPCTSTR(strMessageText)
  2965. );
  2966. ::GlobalUnlock( hGlobal );
  2967. if( ::SetClipboardData( 
  2968. #if (defined _UNICODE)
  2969. CF_UNICODETEXT
  2970. #else
  2971. CF_TEXT
  2972. #endif
  2973. hGlobal 
  2974. ) != NULL 
  2975. )
  2976. bRetVal = true;
  2977. }
  2978. ::CloseClipboard();
  2979. return bRetVal;
  2980. }
  2981. void CExtMsgBox::ResetAllMsgBoxes()
  2982. {
  2983. CWinApp * pApp = ::AfxGetApp();
  2984. ASSERT_VALID( pApp );
  2985. CString strKey = _T("Software\");
  2986. strKey += pApp->m_pszRegistryKey;
  2987. strKey += _T("\");
  2988. strKey += pApp->m_pszProfileName;
  2989. strKey += _T("\");
  2990. strKey += g_strRegSectionName;
  2991. pApp->DelRegTree( HKEY_CURRENT_USER, strKey );
  2992. }
  2993. void CExtMsgBox::ResetMsgBox()
  2994. {
  2995. ASSERT_VALID( this );
  2996. CExtSafeString strRegVarName = OnMsgBoxGetRegVarName();
  2997. ::AfxGetApp()->WriteProfileInt( g_strRegSectionName, LPCTSTR(strRegVarName), -1 );
  2998. }
  2999. int CExtMsgBox::DoMsgBox(
  3000. HWND hWndParent,
  3001. UINT nMessageResourceID,
  3002. UINT nCaptionResourceID, // = 0
  3003. UINT nMsgBoxStyle, // = __EXT_MB_DEFAULT_STYLES
  3004. UINT nHelpID, // = 0
  3005. __EXT_MFC_SAFE_LPCTSTR strUniqueID, // = NULL // for __EXT_MB_DO_NOT_DISPLAY_AGAIN and __EXT_MB_DO_NOT_ASK_AGAIN
  3006. UINT nMsgBoxStyleEx, // = __EXT_MB_EX_DEFAULT_STYLES
  3007. UINT nTimeoutSeconds, // = 0
  3008. bool bIsDisabledTimeout, // = false
  3009. CExtBitmap * pBmpIcon // = NULL
  3010. )
  3011. {
  3012. __PROF_UIS_MANAGE_STATE;
  3013. CExtSafeString strCaption, strMessageText;
  3014. if( nCaptionResourceID == 0 )
  3015. strCaption = LPCTSTR( ::AfxGetAppName() );
  3016. else
  3017. {
  3018. VERIFY( g_ResourceManager->LoadString( strCaption, nCaptionResourceID ) );
  3019. }
  3020. VERIFY( g_ResourceManager->LoadString( strMessageText, nMessageResourceID ) );
  3021. return DoMsgBox( hWndParent, strMessageText, strCaption, nMsgBoxStyle, nHelpID, strUniqueID, nMsgBoxStyleEx, nTimeoutSeconds, bIsDisabledTimeout, pBmpIcon );
  3022. }
  3023. int CExtMsgBox::DoMsgBox(
  3024. HWND hWndParent,
  3025. __EXT_MFC_SAFE_LPCTSTR strMessageText,
  3026. __EXT_MFC_SAFE_LPCTSTR strCaption, // = NULL
  3027. UINT nMsgBoxStyle, // = __EXT_MB_DEFAULT_STYLES
  3028. UINT nHelpID, // = 0
  3029. __EXT_MFC_SAFE_LPCTSTR strUniqueID, // = NULL // for __EXT_MB_DO_NOT_DISPLAY_AGAIN and __EXT_MB_DO_NOT_ASK_AGAIN
  3030. UINT nMsgBoxStyleEx, // = __EXT_MB_EX_DEFAULT_STYLES
  3031. UINT nTimeoutSeconds, // = 0
  3032. bool bIsDisabledTimeout, // = false
  3033. CExtBitmap * pBmpIcon // = NULL
  3034. )
  3035. {
  3036. __PROF_UIS_MANAGE_STATE;
  3037. if( ::GetCapture() != NULL )
  3038. ::ReleaseCapture(); // force release mouse capture
  3039. CExtMsgBox dlg( hWndParent, strMessageText, strCaption, nMsgBoxStyle, nHelpID, strUniqueID, nMsgBoxStyleEx );
  3040. if( nTimeoutSeconds > 0 )
  3041. dlg.TimeoutSet( nTimeoutSeconds, bIsDisabledTimeout );
  3042. if( pBmpIcon != NULL && ( ! pBmpIcon->IsEmpty() ) )
  3043. dlg.m_bmpIcon = (*pBmpIcon);
  3044. //HWND hWndFocusRestore = ::GetFocus();
  3045. int nRetVal = int( dlg.DoModal() );
  3046. // if( hWndFocusRestore != NULL
  3047. // && ::IsWindow( hWndFocusRestore )
  3048. // && ::IsWindowEnabled( hWndFocusRestore )
  3049. // && ( ( ::__EXT_MFC_GetWindowLong( hWndFocusRestore, GWL_STYLE ) ) & WS_VISIBLE ) != 0
  3050. // && ::GetFocus() != hWndFocusRestore
  3051. // )
  3052. // {
  3053. // CExtPopupMenuWnd::PassMsgLoop( false );
  3054. // if( ::IsWindow( hWndFocusRestore )
  3055. // && ::IsWindowEnabled( hWndFocusRestore )
  3056. // && ( ( ::__EXT_MFC_GetWindowLong( hWndFocusRestore, GWL_STYLE ) ) & WS_VISIBLE ) != 0
  3057. // && ::GetFocus() != hWndFocusRestore
  3058. // )
  3059. // ::SetFocus( hWndFocusRestore );
  3060. // }
  3061. return nRetVal;
  3062. }
  3063. int ProfUISMsgBox(
  3064. HWND hWndParent,
  3065. UINT nMessageResourceID,
  3066. UINT nCaptionResourceID, // = 0
  3067. UINT nMsgBoxStyle, // = __EXT_MB_DEFAULT_STYLES
  3068. UINT nHelpID, // = 0
  3069. __EXT_MFC_SAFE_LPCTSTR strUniqueID, // = NULL // for __EXT_MB_DO_NOT_DISPLAY_AGAIN and __EXT_MB_DO_NOT_ASK_AGAIN
  3070. UINT nMsgBoxStyleEx, // = __EXT_MB_EX_DEFAULT_STYLES
  3071. UINT nTimeoutSeconds, // = 0
  3072. bool bIsDisabledTimeout, // = false
  3073. CExtBitmap * pBmpIcon // = NULL
  3074. )
  3075. {
  3076. __PROF_UIS_MANAGE_STATE;
  3077. return CExtMsgBox::DoMsgBox( hWndParent, nMessageResourceID, nCaptionResourceID, nMsgBoxStyle, nHelpID, strUniqueID, nMsgBoxStyleEx, nTimeoutSeconds, bIsDisabledTimeout, pBmpIcon );
  3078. }
  3079. int ProfUISMsgBox(
  3080. HWND hWndParent,
  3081. __EXT_MFC_SAFE_LPCTSTR strMessageText,
  3082. __EXT_MFC_SAFE_LPCTSTR strCaption, // = NULL
  3083. UINT nMsgBoxStyle, // = __EXT_MB_DEFAULT_STYLES
  3084. UINT nHelpID, // = 0
  3085. __EXT_MFC_SAFE_LPCTSTR strUniqueID, // = NULL // for __EXT_MB_DO_NOT_DISPLAY_AGAIN and __EXT_MB_DO_NOT_ASK_AGAIN
  3086. UINT nMsgBoxStyleEx, // = __EXT_MB_EX_DEFAULT_STYLES
  3087. UINT nTimeoutSeconds, // = 0
  3088. bool bIsDisabledTimeout, // = false
  3089. CExtBitmap * pBmpIcon // = NULL
  3090. )
  3091. {
  3092. __PROF_UIS_MANAGE_STATE;
  3093. return CExtMsgBox::DoMsgBox( hWndParent, strMessageText, strCaption, nMsgBoxStyle, nHelpID, strUniqueID, nMsgBoxStyleEx, nTimeoutSeconds, bIsDisabledTimeout, pBmpIcon );
  3094. }
  3095. #endif // (! defined __EXT_MFC_NO_MSG_BOX )