XTPReBar.cpp
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:16k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // XTPReBar.cpp : implementation file
  2. //
  3. // This file is a part of the XTREME COMMANDBARS MFC class library.
  4. // (c)1998-2008 Codejock Software, All Rights Reserved.
  5. //
  6. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  7. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  8. // CONSENT OF CODEJOCK SOFTWARE.
  9. //
  10. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  11. // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  12. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  13. // SINGLE COMPUTER.
  14. //
  15. // CONTACT INFORMATION:
  16. // support@codejock.com
  17. // http://www.codejock.com
  18. //
  19. /////////////////////////////////////////////////////////////////////////////
  20. #include "stdafx.h"
  21. #include "Common/XTPVC80Helpers.h"
  22. #include "Common/XTPDrawHelpers.h"
  23. #include "XTPReBar.h"
  24. #include "XTPToolBar.h"
  25. #include "XTPDockBar.h"
  26. #ifndef VERSION_IE401
  27. #define VERSION_IE401   MAKELONG(72, 4)
  28. #endif
  29. #ifdef _DEBUG
  30. #define new DEBUG_NEW
  31. #undef THIS_FILE
  32. static char THIS_FILE[] = __FILE__;
  33. #endif
  34. const LPCTSTR CXTPReBar::m_lpszStateInfoEntry = _T("RebarStateInfo");
  35. const LPCTSTR CXTPReBar::m_lpszStateInfoFormat = _T("wID=%04X, cx=%d, fStyle=%08X");
  36. //////////////////////////////////////////////////////////////////////////
  37. //
  38. #if _MSC_VER < 1200 // MFC 6.0
  39. /////////////////////////////////////////////////////////////////////////////
  40. // CXTPReBarBase
  41. IMPLEMENT_DYNAMIC(CXTPReBarBase, CControlBar)
  42. BEGIN_MESSAGE_MAP(CXTPReBarBase, CControlBar)
  43. //{{AFX_MSG_MAP(CXTPReBarBase)
  44. ON_WM_NCCREATE()
  45. ON_WM_NCCALCSIZE()
  46. ON_WM_NCPAINT()
  47. ON_NOTIFY_REFLECT(RBN_HEIGHTCHANGE, OnHeightChange)
  48. ON_NOTIFY_REFLECT(RBN_ENDDRAG, OnHeightChange)
  49. ON_MESSAGE(RB_SHOWBAND, OnShowBand)
  50. ON_MESSAGE_VOID(WM_RECALCPARENT, OnRecalcParent)
  51. //}}AFX_MSG_MAP
  52. END_MESSAGE_MAP()
  53. CXTPReBarBase::CXTPReBarBase()
  54. {
  55. m_cxLeftBorder = m_cxRightBorder = m_cyTopBorder = m_cyBottomBorder = 0;
  56. m_iComCtlVersion = XTPSystemVersion()->GetComCtlVersion();
  57. }
  58. void CXTPReBarBase::OnRecalcParent()
  59. {
  60. CFrameWnd* pFrameWnd = GetParentFrame();
  61. ASSERT(pFrameWnd != NULL);
  62. pFrameWnd->RecalcLayout();
  63. }
  64. void CXTPReBarBase::OnHeightChange(NMHDR* /*pNMHDR*/, LRESULT* pResult)
  65. {
  66. // gives us access to protected member m_bInRecalcLayout.
  67. class CFriendFrameWnd : public CFrameWnd
  68. {
  69. friend class CXTPReBarBase;
  70. };
  71. // does the CXTPReBarBase have a frame ?
  72. CFriendFrameWnd* pFrameWnd = (CFriendFrameWnd*)GetParentFrame();
  73. if (pFrameWnd != NULL)
  74. {
  75. // it does -- tell it to recalc its layout
  76. if (!pFrameWnd->m_bInRecalcLayout)
  77. pFrameWnd->RecalcLayout();
  78. else
  79. PostMessage(WM_RECALCPARENT);
  80. }
  81. *pResult = 0;
  82. }
  83. LRESULT CXTPReBarBase::OnShowBand(WPARAM wParam, LPARAM)
  84. {
  85. LRESULT lResult = Default();
  86. if (lResult)
  87. {
  88. // keep window visible state in sync with band visible state
  89. REBARBANDINFO rbBand;
  90. rbBand.cbSize = sizeof(rbBand);
  91. rbBand.fMask = RBBIM_CHILD | RBBIM_STYLE;
  92. VERIFY(DefWindowProc(RB_GETBANDINFO, wParam, (LPARAM)&rbBand));
  93. CControlBar* pBar = DYNAMIC_DOWNCAST(CControlBar, CWnd::FromHandlePermanent(rbBand.hwndChild));
  94. BOOL bWindowVisible;
  95. if (pBar != NULL)
  96. bWindowVisible = pBar->IsVisible();
  97. else
  98. bWindowVisible = (::GetWindowLong(rbBand.hwndChild, GWL_STYLE) & WS_VISIBLE) != 0;
  99. BOOL bBandVisible = (rbBand.fStyle & RBBS_HIDDEN) == 0;
  100. if (bWindowVisible != bBandVisible)
  101. VERIFY(::ShowWindow(rbBand.hwndChild, bBandVisible ? SW_SHOW : SW_HIDE));
  102. }
  103. return lResult;
  104. }
  105. BOOL CXTPReBarBase::_AddBar(CWnd* pBar, REBARBANDINFO* pRBBI)
  106. {
  107. ASSERT_VALID(this);
  108. ASSERT(::IsWindow(m_hWnd));
  109. ASSERT(pBar != NULL);
  110. ASSERT(::IsWindow(pBar->m_hWnd));
  111. pRBBI->cbSize = sizeof(REBARBANDINFO);
  112. pRBBI->fMask |= RBBIM_CHILD | RBBIM_CHILDSIZE;
  113. pRBBI->hwndChild = pBar->m_hWnd;
  114. CSize size;
  115. CControlBar* pTemp = DYNAMIC_DOWNCAST(CControlBar, pBar);
  116. if (pTemp != NULL)
  117. {
  118. size = pTemp->CalcFixedLayout(FALSE, m_dwStyle & CBRS_ORIENT_HORZ);
  119. }
  120. else
  121. {
  122. CRect rect;
  123. pBar->GetWindowRect(&rect);
  124. size = rect.Size();
  125. }
  126. //WINBUG: COMCTL32.DLL is off by 4 pixels in its sizing logic.  Whatever
  127. //  is specified as the minimum size, the system rebar will allow that band
  128. //  to be 4 actual pixels smaller!  That's why we add 4 to the size here.
  129. ASSERT(m_iComCtlVersion != -1);
  130. pRBBI->cxMinChild = size.cx + (m_iComCtlVersion < VERSION_IE401 ? 4 : 0);
  131. pRBBI->cyMinChild = size.cy;
  132. BOOL bResult = (BOOL)DefWindowProc(RB_INSERTBAND, (WPARAM)-1, (LPARAM)pRBBI);
  133. CFrameWnd* pFrameWnd = GetParentFrame();
  134. if (pFrameWnd != NULL)
  135. pFrameWnd->RecalcLayout();
  136. return bResult;
  137. }
  138. BOOL CXTPReBarBase::AddBar(CWnd* pBar, LPCTSTR pszText, CBitmap* pbmp, DWORD dwStyle)
  139. {
  140. REBARBANDINFO rbBand;
  141. rbBand.fMask = RBBIM_STYLE;
  142. rbBand.fStyle = dwStyle;
  143. if (pszText != NULL)
  144. {
  145. rbBand.fMask |= RBBIM_TEXT;
  146. rbBand.lpText = const_cast<LPTSTR>(pszText);
  147. }
  148. if (pbmp != NULL)
  149. {
  150. rbBand.fMask |= RBBIM_BACKGROUND;
  151. rbBand.hbmBack = (HBITMAP)*pbmp;
  152. }
  153. return _AddBar(pBar, &rbBand);
  154. }
  155. BOOL CXTPReBarBase::AddBar(CWnd* pBar, COLORREF clrFore, COLORREF clrBack, LPCTSTR pszText, DWORD dwStyle)
  156. {
  157. REBARBANDINFO rbBand;
  158. rbBand.fMask = RBBIM_STYLE | RBBIM_COLORS;
  159. rbBand.fStyle = dwStyle;
  160. rbBand.clrFore = clrFore;
  161. rbBand.clrBack = clrBack;
  162. if (pszText != NULL)
  163. {
  164. rbBand.fMask |= RBBIM_TEXT;
  165. rbBand.lpText = const_cast<LPTSTR>(pszText);
  166. }
  167. return _AddBar(pBar, &rbBand);
  168. }
  169. CSize CXTPReBarBase::CalcFixedLayout(BOOL bStretch, BOOL bHorz)
  170. {
  171. ASSERT_VALID(this);
  172. ASSERT(::IsWindow(m_hWnd));
  173. // the union of the band rectangles is the total bounding rect
  174. int nCount = DefWindowProc(RB_GETBANDCOUNT, 0, 0);
  175. REBARBANDINFO rbBand;
  176. rbBand.cbSize = sizeof(rbBand);
  177. int nTemp;
  178. // sync up hidden state of the bands
  179. for (nTemp = nCount; nTemp--;)
  180. {
  181. rbBand.fMask = RBBIM_CHILD | RBBIM_STYLE;
  182. VERIFY(DefWindowProc(RB_GETBANDINFO, nTemp, (LPARAM)&rbBand));
  183. CControlBar* pBar = DYNAMIC_DOWNCAST(CControlBar, CWnd::FromHandlePermanent(rbBand.hwndChild));
  184. BOOL bWindowVisible;
  185. if (pBar != NULL)
  186. bWindowVisible = pBar->IsVisible();
  187. else
  188. bWindowVisible = (::GetWindowLong(rbBand.hwndChild, GWL_STYLE) & WS_VISIBLE) != 0;
  189. BOOL bBandVisible = (rbBand.fStyle & RBBS_HIDDEN) == 0;
  190. if (bWindowVisible != bBandVisible)
  191. VERIFY(DefWindowProc(RB_SHOWBAND, nTemp, bWindowVisible));
  192. }
  193. // determine bounding rect of all visible bands
  194. CRect rectBound;
  195. rectBound.SetRectEmpty();
  196. for (nTemp = nCount; nTemp--;)
  197. {
  198. rbBand.fMask = RBBIM_STYLE;
  199. VERIFY(DefWindowProc(RB_GETBANDINFO, nTemp, (LPARAM)&rbBand));
  200. if ((rbBand.fStyle & RBBS_HIDDEN) == 0)
  201. {
  202. CRect rect;
  203. VERIFY(DefWindowProc(RB_GETRECT, nTemp, (LPARAM)&rect));
  204. rectBound |= rect;
  205. }
  206. }
  207. // add borders as part of bounding rect
  208. if (!rectBound.IsRectEmpty())
  209. {
  210. CRect rect;
  211. rect.SetRectEmpty();
  212. CalcInsideRect(rect, bHorz);
  213. rectBound.right -= rect.Width();
  214. rectBound.bottom -= rect.Height();
  215. }
  216. return CSize((bHorz && bStretch) ? 32767 : rectBound.Width(),
  217. (!bHorz && bStretch) ? 32767 : rectBound.Height());
  218. }
  219. CSize CXTPReBarBase::CalcDynamicLayout(int /*nLength*/, DWORD dwMode)
  220. {
  221. if (dwMode & LM_HORZDOCK)
  222. ASSERT(dwMode & LM_HORZ);
  223. return CalcFixedLayout(dwMode & LM_STRETCH, dwMode & LM_HORZ);
  224. }
  225. BOOL CXTPReBarBase::Create(CWnd* pParentWnd, DWORD dwCtrlStyle, DWORD dwStyle, UINT nID)
  226. {
  227. ASSERT_VALID(pParentWnd);   // must have a parent
  228. ASSERT (!((dwStyle & CBRS_SIZE_FIXED) && (dwStyle & CBRS_SIZE_DYNAMIC)));
  229. // save the style
  230. m_dwStyle = (dwStyle & CBRS_ALL);
  231. if (nID == AFX_IDW_REBAR)
  232. m_dwStyle |= CBRS_HIDE_INPLACE;
  233. dwStyle &= ~CBRS_ALL;
  234. dwStyle |= CCS_NOPARENTALIGN | CCS_NOMOVEY | CCS_NODIVIDER | CCS_NORESIZE | RBS_VARHEIGHT;
  235. dwStyle |= dwCtrlStyle;
  236. // initialize common controls
  237. INITCOMMONCONTROLSEX icex;
  238. icex.dwSize = sizeof(icex);
  239. icex.dwICC = ICC_COOL_CLASSES;
  240. VERIFY(InitCommonControlsEx(&icex));
  241. // create the HWND
  242. CRect rect;
  243. rect.SetRectEmpty();
  244. if (!CWnd::Create(REBARCLASSNAME, NULL, dwStyle, rect, pParentWnd, nID))
  245. return FALSE;
  246. // Note: Parent must resize itself for control bar to be resized
  247. return TRUE;
  248. }
  249. void CXTPReBarBase::OnUpdateCmdUI(CFrameWnd* pTarget, BOOL bDisableIfNoHandler)
  250. {
  251. UpdateDialogControls(pTarget, bDisableIfNoHandler);
  252. }
  253. BOOL CXTPReBarBase::OnNcCreate(LPCREATESTRUCT lpCreateStruct)
  254. {
  255. if (!CControlBar::OnNcCreate(lpCreateStruct))
  256. return FALSE;
  257. // if the owner was set before the rebar was created, set it now
  258. if (m_hWndOwner != NULL)
  259. DefWindowProc(RB_SETPARENT, (WPARAM)m_hWndOwner, 0);
  260. return TRUE;
  261. }
  262. void CXTPReBarBase::OnNcCalcSize(BOOL /*bCalcValidRects*/, NCCALCSIZE_PARAMS* lpncsp)
  263. {
  264. // calculate border space (will add to top/bottom, subtract from right/bottom)
  265. CRect rect;
  266. rect.SetRectEmpty();
  267. BOOL bHorz = (m_dwStyle & CBRS_ORIENT_HORZ) != 0;
  268. CControlBar::CalcInsideRect(rect, bHorz);
  269. // adjust non-client area for border space
  270. lpncsp->rgrc[0].left += rect.left;
  271. lpncsp->rgrc[0].top += rect.top;
  272. lpncsp->rgrc[0].right += rect.right;
  273. lpncsp->rgrc[0].bottom += rect.bottom;
  274. }
  275. void CXTPReBarBase::OnNcPaint()
  276. {
  277. EraseNonClient();
  278. }
  279. static HWND _xtpAfxChildWindowFromPoint(HWND hWnd, POINT pt)
  280. {
  281. ASSERT(hWnd != NULL);
  282. // check child windows
  283. ::ClientToScreen(hWnd, &pt);
  284. HWND hWndChild = ::GetWindow(hWnd, GW_CHILD);
  285. for (; hWndChild != NULL; hWndChild = ::GetWindow(hWndChild, GW_HWNDNEXT))
  286. {
  287. if ((UINT)(WORD)::GetDlgCtrlID(hWndChild) != (WORD)-1 &&
  288. (::GetWindowLong(hWndChild, GWL_STYLE) & WS_VISIBLE))
  289. {
  290. // see if point hits the child window
  291. CRect rect;
  292. ::GetWindowRect(hWndChild, rect);
  293. if (rect.PtInRect(pt))
  294. return hWndChild;
  295. }
  296. }
  297. return NULL;    // not found
  298. }
  299. INT_PTR CXTPReBarBase::OnToolHitTest(CPoint point, TOOLINFO* pTI) const
  300. {
  301. ASSERT_VALID(this);
  302. ASSERT(::IsWindow(m_hWnd));
  303. HWND hWndChild = _xtpAfxChildWindowFromPoint(m_hWnd, point);
  304. CWnd* pWnd = CWnd::FromHandlePermanent(hWndChild);
  305. if (pWnd == NULL)
  306. return CControlBar::OnToolHitTest(point, pTI);
  307. ASSERT(pWnd->m_hWnd == hWndChild);
  308. return pWnd->OnToolHitTest(point, pTI);
  309. }
  310. LRESULT CXTPReBarBase::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
  311. {
  312. // special handling for certain messages (forwarding to owner/parent)
  313. switch (message)
  314. {
  315. case WM_POPMESSAGESTRING:
  316. case WM_SETMESSAGESTRING:
  317. return GetOwner()->SendMessage(message, wParam, lParam);
  318. }
  319. return CControlBar::WindowProc(message, wParam, lParam);
  320. }
  321. #endif
  322. /////////////////////////////////////////////////////////////////////////////
  323. // CXTPReBar
  324. CXTPReBar::CXTPReBar()
  325. {
  326. }
  327. CXTPReBar::~CXTPReBar()
  328. {
  329. }
  330. IMPLEMENT_DYNAMIC(CXTPReBar, CXTPReBarBase)
  331. BOOL CXTPReBar::AddToolBar(CXTPToolBar* pToolBar, DWORD dwStyle)
  332. {
  333. CSize sz = pToolBar->CalcDockingLayout(32000, LM_HORZDOCK | LM_HORZ | LM_COMMIT);
  334. pToolBar->MoveWindow(0, 0, sz.cx, sz.cy);
  335. if (pToolBar->GetDockBar())
  336. {
  337. pToolBar->GetDockBar()->RemoveCommandBar(pToolBar, -1);
  338. pToolBar->SetFlags(0, xtpFlagAlignAny | xtpFlagFloating);
  339. pToolBar->ModifyBarStyle(CBRS_GRIPPER, 0);
  340. }
  341. if (!AddBar(pToolBar, 0, 0, dwStyle))
  342. return FALSE;
  343. UINT nID = (UINT)pToolBar->GetBarID();
  344. int nCount = (int)DefWindowProc(RB_GETBANDCOUNT, 0, 0);
  345. REBARBANDINFO rbBand;
  346. rbBand.cbSize = sizeof(rbBand);
  347. rbBand.fMask = RBBIM_ID;
  348. rbBand.wID = nID;
  349. VERIFY(DefWindowProc(RB_SETBANDINFO, nCount - 1, (LPARAM)&rbBand));
  350. return TRUE;
  351. }
  352. void CXTPReBar::DeleteToolBar(CXTPToolBar* pToolBar)
  353. {
  354. int nBand = FindBand(pToolBar);
  355. if (nBand != -1)
  356. {
  357. DefWindowProc(RB_DELETEBAND, nBand, 0);
  358. }
  359. }
  360. CXTPToolBar* CXTPReBar::GetToolBar(int nBand)
  361. {
  362. REBARBANDINFO rbBand;
  363. rbBand.cbSize = sizeof(rbBand);
  364. rbBand.fMask = RBBIM_CHILD | RBBIM_STYLE | RBBIM_SIZE;
  365. VERIFY(DefWindowProc(RB_GETBANDINFO, nBand, (LPARAM)&rbBand));
  366. return DYNAMIC_DOWNCAST(CXTPToolBar, CWnd::FromHandlePermanent(rbBand.hwndChild));
  367. }
  368. int CXTPReBar::FindBand(CXTPToolBar* pToolBar)
  369. {
  370. int nCount = (int)DefWindowProc(RB_GETBANDCOUNT, 0, 0);
  371. // sync up hidden state of the bands
  372. for (int nTemp = nCount; nTemp--;)
  373. {
  374. if (GetToolBar(nTemp) == pToolBar)
  375. return nTemp;
  376. }
  377. return -1;
  378. }
  379. BEGIN_MESSAGE_MAP(CXTPReBar, CXTPReBarBase)
  380. //{{AFX_MSG_MAP(CXTPReBar)
  381. // NOTE - the ClassWizard will add and remove mapping macros here.
  382. //}}AFX_MSG_MAP
  383. ON_NOTIFY_REFLECT(RBN_CHILDSIZE, OnChildSize)
  384. ON_WM_PAINT()
  385. ON_WM_ERASEBKGND()
  386. END_MESSAGE_MAP()
  387. void CXTPReBar::OnPaint()
  388. {
  389. // background is already filled in gray
  390. CPaintDC dc(this);
  391. // Get the client rect.
  392. CXTPClientRect rectClient(this);
  393. // Paint to a memory device context to help
  394. // eliminate screen flicker.
  395. CXTPBufferDC memDC(dc, rectClient);
  396. memDC.FillSolidRect(rectClient, GetSysColor(COLOR_3DFACE));
  397. // Now let the window do its default painting...
  398. CWnd::DefWindowProc(WM_ERASEBKGND, (WPARAM)memDC.m_hDC, 0);
  399. CWnd::DefWindowProc(WM_PAINT, (WPARAM)memDC.m_hDC, 0);
  400. }
  401. BOOL CXTPReBar::OnEraseBkgnd(CDC* /*pDC*/)
  402. {
  403. return TRUE;
  404. }
  405. CSize CXTPReBar::CalcFixedLayout(BOOL bStretch, BOOL bHorz)
  406. {
  407. CSize szResult = CXTPReBarBase::CalcFixedLayout(bStretch, bHorz);
  408. Invalidate(FALSE);
  409. int nCount = (int)DefWindowProc(RB_GETBANDCOUNT, 0, 0);
  410. // sync up hidden state of the bands
  411. for (int nTemp = nCount; nTemp--;)
  412. {
  413. CXTPToolBar* pToolBar = GetToolBar(nTemp);
  414. if (pToolBar)
  415. {
  416. CXTPWindowRect rc(pToolBar);
  417. CSize szMin = pToolBar->CalcDockingLayout(32000, LM_HORZDOCK | LM_HORZ);
  418. CSize sz = pToolBar->CalcDockingLayout(rc.Width(), LM_HORZDOCK | LM_HORZ | LM_COMMIT | (pToolBar->GetFlags() & xtpFlagStretched ? LM_STRETCH : LM_HIDEWRAP));
  419. REBARBANDINFO rbbi;
  420. rbbi.cbSize = sizeof(rbbi);
  421. rbbi.fMask = RBBIM_CHILDSIZE | RBBIM_IDEALSIZE;
  422. rbbi.cxIdeal = sz.cx;
  423. rbbi.cxMinChild = szMin.cx;
  424. rbbi.cyMinChild = sz.cy;
  425. VERIFY(DefWindowProc(RB_SETBANDINFO, nTemp, (LPARAM)&rbbi));
  426. pToolBar->Redraw();
  427. }
  428. }
  429. return szResult;
  430. }
  431. void CXTPReBar::OnChildSize(NMHDR* pNotifyStruct, LRESULT* result)
  432. {
  433. OnHeightChange(pNotifyStruct, result);
  434. }
  435. void CXTPReBar::LoadState(LPCTSTR lpszProfileName)
  436. {
  437. // This function restores index, width and style from the registry for
  438. // each band in the rebar.
  439. CString strValue = AfxGetApp()->GetProfileString(lpszProfileName,
  440. m_lpszStateInfoEntry);
  441. if (!strValue.IsEmpty())
  442. {
  443. REBARBANDINFO rbbi;
  444. rbbi.cbSize = sizeof(rbbi);
  445. rbbi.fMask = RBBIM_STYLE | RBBIM_SIZE | RBBIM_ID;
  446. int nCount = (int)DefWindowProc(RB_GETBANDCOUNT, 0, 0);
  447. for (int nBand = 0; nBand < nCount; nBand++)
  448. {
  449. CString strBandState;
  450. VERIFY(AfxExtractSubString(strBandState, strValue, nBand, _T('n')));
  451. UINT nID, cx, nStyle;
  452. int nResult = SCANF_S(strBandState, m_lpszStateInfoFormat, &nID, &cx, &nStyle);
  453. ASSERT(nResult == 3);
  454. DefWindowProc(RB_MOVEBAND, DefWindowProc(RB_IDTOINDEX, nID, 0), nBand);
  455. VERIFY(DefWindowProc(RB_GETBANDINFO, nBand, (LPARAM)&rbbi));
  456. rbbi.cx = cx;
  457. rbbi.fStyle = (rbbi.fStyle & ~(RBBS_HIDDEN | RBBS_BREAK)) | nStyle;
  458. VERIFY(DefWindowProc(RB_SETBANDINFO, nBand, (LPARAM)&rbbi));
  459. CXTPToolBar* pToolBar = GetToolBar(nBand);
  460. if (pToolBar && (nStyle & RBBS_HIDDEN))
  461. {
  462. pToolBar->SetVisible(FALSE);
  463. }
  464. }
  465. }
  466. }
  467. void CXTPReBar::SaveState(LPCTSTR lpszProfileName)
  468. {
  469. // This function saves index, width and style in the registry for each
  470. // band in the rebar, so that it could be possible to restore all these
  471. // settings when the user runs the program next time.
  472. CString strValue;
  473. REBARBANDINFO rbbi;
  474. rbbi.cbSize = sizeof(rbbi);
  475. rbbi.fMask = RBBIM_STYLE | RBBIM_SIZE | RBBIM_ID;
  476. int nCount = (int)DefWindowProc(RB_GETBANDCOUNT, 0, 0);
  477. for (int nBand = 0; nBand < nCount; nBand++)
  478. {
  479. VERIFY(DefWindowProc(RB_GETBANDINFO, nBand, (LPARAM)&rbbi));
  480. CString strBandState;
  481. strBandState.Format(m_lpszStateInfoFormat, rbbi.wID, rbbi.cx, rbbi.fStyle);
  482. strValue += (strValue.IsEmpty() ? _T("") : _T("n")) + strBandState;
  483. }
  484. VERIFY(AfxGetApp()->WriteProfileString(lpszProfileName,
  485. m_lpszStateInfoEntry, strValue));
  486. }