GuiToolBarWnd.cpp
上传用户:zhanglf88
上传日期:2013-11-19
资源大小:6036k
文件大小:33k
源码类别:

金融证券系统

开发平台:

Visual C++

  1. //-----------------------------------------------------------------------//
  2. // This is a part of the GuiLib MFC Extention.  //
  3. // Autor  :  Francisco Campos  //
  4. // (C) 2002 Francisco Campos <www.beyondata.com> All rights reserved     //
  5. // This code is provided "as is", with absolutely no warranty expressed  //
  6. // or implied. Any use is at your own risk.  //
  7. // You must obtain the author's consent before you can include this code //
  8. // in a software library.  //
  9. // If the source code in  this file is used in any application  //
  10. // then acknowledgement must be made to the author of this program  //
  11. // fcampos@tutopia.com  //
  12. //-----------------------------------------------------------------------//
  13. #include "stdafx.h"
  14. #include "GuiToolBarWnd.h"
  15. #include "resource.h"
  16. #include "GuiDrawlayer.h"
  17. #include "GuiDockContext.h"
  18. //#include "GuiColors.h"
  19. #ifdef _DEBUG
  20. #undef THIS_FILE
  21. static char THIS_FILE[]=__FILE__;
  22. #define new DEBUG_NEW
  23. #endif
  24. #define BTNS_SHOWTEXT           0x0040
  25. extern int gbintHorz; //Horz=0, Vert=1
  26. extern CRect rcMenu; //CRect of button
  27. class CDropmenu
  28. {
  29. public:
  30. UINT nIDboton;
  31. UINT nMenu;
  32. CDropmenu(UINT nID,UINT nMENU)
  33. {
  34. nIDboton=nID;
  35. nMenu=nMENU;
  36. }
  37. };
  38. //////////////////////////////////////////////////////////////////////
  39. // Construction/Destruction
  40. //////////////////////////////////////////////////////////////////////
  41. IMPLEMENT_DYNAMIC(CGuiToolBarWnd,CToolBar)
  42. BEGIN_MESSAGE_MAP(CGuiToolBarWnd,CToolBar)
  43. //{{AFX_MSG_MAP(CGuiToolBarWnd)
  44. ON_WM_PAINT()
  45. ON_WM_NCPAINT()
  46. ON_WM_NCCALCSIZE()
  47. ON_WM_WINDOWPOSCHANGING()
  48. ON_WM_LBUTTONDOWN()
  49. ON_NOTIFY_REFLECT_EX(TBN_DROPDOWN,OnDropDown)
  50. ON_WM_TIMER()
  51. ON_WM_LBUTTONUP()
  52. ON_WM_SYSCOLORCHANGE()
  53. ON_WM_SETCURSOR()
  54. ON_WM_CREATE()
  55. //}}AFX_MSG_MAP
  56.  END_MESSAGE_MAP()
  57. int _afxDropDownWidth = -1;
  58. int AFXAPI _AfxGetDropDownWidth()
  59. {
  60. // return cached version if already determined...
  61. if (_afxDropDownWidth != -1)
  62. return _afxDropDownWidth;
  63. // otherwise calculate it...
  64. HDC hDC = GetDC(NULL);
  65. ASSERT(hDC != NULL);
  66. HFONT hFont;
  67. if ((hFont = CreateFont(GetSystemMetrics(SM_CYMENUCHECK), 0, 0, 0,
  68. FW_NORMAL, 0, 0, 0, SYMBOL_CHARSET, 0, 0, 0, 0, _T("Marlett"))) != NULL)
  69. hFont = (HFONT)SelectObject(hDC, hFont);
  70. VERIFY(GetCharWidth(hDC, '6', '6', &_afxDropDownWidth));
  71. if (hFont != NULL)
  72. {
  73. SelectObject(hDC, hFont);
  74. DeleteObject(hFont);
  75. }
  76. ReleaseDC(NULL, hDC);
  77. ASSERT(_afxDropDownWidth != -1);
  78. return _afxDropDownWidth;
  79. }
  80. int CGuiToolBarWnd::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  81. {
  82. lpCreateStruct->dwExStyle |= WS_CLIPCHILDREN; // prevents flashing
  83. if (CToolBar::OnCreate(lpCreateStruct) == -1)
  84. return -1;
  85. if (m_pDockContext==NULL)
  86. m_pDockContext=new CGuiDockContext(this);
  87. ASSERT(m_pDockContext);
  88. //ModifyStyle(WS_CAPTION,0);
  89. return 0;
  90. }
  91. //***********************************************************************************
  92. void CGuiToolBarWnd::OnUpdateCmdUI( CFrameWnd* pTarget, BOOL bDisableIfNoHndler ) 
  93. {
  94.  CToolBar::OnUpdateCmdUI( pTarget, bDisableIfNoHndler ); 
  95. }
  96. //***********************************************************************************
  97. void CGuiToolBarWnd::OnWindowPosChanging(WINDOWPOS FAR* lpwndpos) 
  98. {
  99. CToolBar::OnWindowPosChanging(lpwndpos);
  100. if(!(m_dwStyle & CBRS_FLOATING))  
  101. SetSizes(m_sizeButton, m_sizeImage);
  102. if( !(lpwndpos->flags & SWP_NOMOVE) )
  103. Invalidate(FALSE);
  104. }
  105. //***********************************************************************************
  106. void CGuiToolBarWnd::OnSysColorChange( )
  107. {
  108. CToolBar::OnSysColorChange( );
  109. if(!(m_dwStyle & CBRS_FLOATING))  
  110. SetSizes(m_sizeButton, m_sizeImage);
  111. Invalidate(TRUE);
  112. GetParentFrame()->RecalcLayout();
  113. }
  114. //***********************************************************************************
  115. CGuiToolBarWnd::CGuiToolBarWnd()
  116. {
  117. m_style = Office2000; //Office97;  //by default
  118. m_pArray.RemoveAll();
  119. m_iElements=0;
  120. m_bIsXp=TRUE;
  121. bPressDown=FALSE;
  122. m_imgArrow.Create(IDB_DOCKBAR,9,10,RGB(255,0,255));
  123. _AfxGetDropDownWidth();
  124. //m_iWidthDrowDown=GetSystemMetrics(SM_CXHTHUMB);
  125. CBitmap cbmp;
  126. BITMAP bmp;
  127. cbmp.LoadBitmap(IDB_DOCKBAR);
  128. cbmp.GetBitmap(&bmp);
  129. mHeight=CPoint(bmp.bmWidth,bmp.bmHeight);
  130. // Modified Bu SunZhenyu
  131. if( !m_cfont.CreateStockObject( DEFAULT_GUI_FONT ) )
  132. m_cfont.CreateStockObject( ANSI_VAR_FONT );
  133. // m_cfont.CreateFont(14,0,0,0,400,0,0,0,0,1,2,1,34,_T("Marlett"));
  134. }
  135. CGuiToolBarWnd::~CGuiToolBarWnd()
  136. {
  137. /* Modified By SunZhenyu 2003/8/22, Add next 7 lines. */
  138. for(int i=0; i<m_pArray.GetSize(); i++)
  139. {
  140. CDropmenu * p = (CDropmenu*)m_pArray[i];
  141. if( p )
  142. delete p;
  143. }
  144. m_pArray.RemoveAll();
  145. }
  146. void CGuiToolBarWnd::SetXp(BOOL m_bXp)
  147. {
  148. m_bIsXp=m_bXp;
  149. }
  150. void CGuiToolBarWnd::SetTextButton(int IdButton,CString sztexto)
  151. {
  152. // CToolBarCtrl &tbc=GetToolBarCtrl();
  153. // tbc.SetStyle(tbc.GetStyle()| TBSTYLE_LIST | CCS_ADJUSTABLE);
  154. sztexto+=sztexto.Find( '&' ) == -1 ?"   ":"    ";
  155. CClientDC dc(this);
  156. SetButtonText(IdButton,sztexto);
  157. SetButtonStyle(IdButton,TBSTYLE_AUTOSIZE);
  158. SetSizes(m_sizeButton, m_sizeImage);
  159.             
  160. }
  161. void CGuiToolBarWnd::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS FAR* lpncsp) 
  162. {
  163. CToolBar::OnNcCalcSize(bCalcValidRects, lpncsp);
  164. }
  165. BOOL CGuiToolBarWnd::CreateCombo(CComboBox* pControl,UINT nID,int iSize,DWORD dwStyle)
  166. {
  167. CRect rect;
  168. CFont m_Font;
  169. m_Font.CreateStockObject (DEFAULT_GUI_FONT);
  170. int nIndex = this->GetToolBarCtrl().CommandToIndex(nID);
  171. this->SetButtonInfo(nIndex, nID, TBBS_SEPARATOR, iSize);
  172. this->GetToolBarCtrl().GetItemRect(nIndex, &rect);
  173. rect.bottom-=1;
  174. rect.top = 1;
  175. rect.bottom = rect.top +iSize/*drop height*/;
  176. if(!pControl->Create(dwStyle, rect, this, nID))
  177. {
  178. TRACE(_T("Failed to create combo-boxn"));
  179. return FALSE;
  180. }
  181. return TRUE;
  182. }
  183. BOOL CGuiToolBarWnd::CreateCombo(CComboBoxEx* pControl,UINT nID,int iSize,CImageList* m_imgList,DWORD dwStyle)
  184. {
  185. CRect rect;
  186. int nIndex = this->GetToolBarCtrl().CommandToIndex(nID);
  187. this->SetButtonInfo(nIndex, nID, TBBS_SEPARATOR, iSize);
  188. this->GetToolBarCtrl().GetItemRect(nIndex, &rect);
  189. rect.top = 1;
  190. rect.bottom = rect.top + 250 /*drop height*/;
  191. if(!pControl->Create(dwStyle, rect, this, nID))
  192. {
  193. TRACE(_T("Failed to create combo-boxn"));
  194. return FALSE;
  195. }
  196. pControl->SetImageList(m_imgList);
  197. return TRUE;
  198. }
  199. void CGuiToolBarWnd::AddRowComBoboxEx(CComboBoxEx* pControl,CString szMsg,int iItem,int iImage)
  200. {
  201. COMBOBOXEXITEM cb;
  202. cb.mask=CBEIF_TEXT | CBEIF_IMAGE |CBEIF_SELECTEDIMAGE;       
  203. cb.pszText=(LPTSTR)(LPCTSTR)szMsg;
  204. cb.iItem=iItem;
  205. cb.iImage=cb.iSelectedImage=iImage;
  206. cb.cchTextMax=20; 
  207. pControl->InsertItem(&cb);
  208. }
  209. void CGuiToolBarWnd::SetButtonDropDown(UINT nID,int iImage,UINT nMENU)
  210. {
  211. CToolBarCtrl &m_tbc= GetToolBarCtrl();
  212. m_tbc.SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS);
  213. m_tbc.SetStyle(m_tbc.GetStyle() | TBSTYLE_LIST | CCS_ADJUSTABLE);
  214. int nIndex = this->GetToolBarCtrl().CommandToIndex(nID);
  215. this->SetButtonInfo(nIndex, nID, TBBS_DROPDOWN, iImage);
  216. m_pArray.SetAtGrow(m_iElements,new CDropmenu(nID,nMENU));
  217. m_iElements++;
  218. }
  219. BOOL CGuiToolBarWnd::OnDropDown(NMHDR* pNMHDR, LRESULT* pRes)
  220. {
  221. const NMTOOLBAR& m_nmTb = *(NMTOOLBAR*)pNMHDR;
  222. CRect rc;
  223. GetToolBarCtrl().GetRect(m_nmTb.iItem, rc);
  224. ClientToScreen(&rc);
  225. for(int i=0; i < m_iElements; i++)
  226. {
  227. if (((CDropmenu*)m_pArray[i])->nIDboton == (UINT)m_nmTb.iItem)
  228. break;
  229. }
  230. bPressDown=TRUE;
  231. CMenu m_menu;
  232. m_menu.LoadMenu(((CDropmenu*)m_pArray[i])->nMenu);
  233. CMenu* m_SubMenu = m_menu.GetSubMenu(0);
  234. gbintHorz=0; //Horz=0, Vert=1
  235. rcMenu=rc; //CRect of button
  236. m_SubMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_VERTICAL,
  237. rc.left, rc.bottom-2, AfxGetMainWnd(), &rc);
  238. bPressDown=FALSE;
  239. return TRUE;
  240. }
  241. void CGuiToolBarWnd::OnNcPaint()
  242. {
  243. CRect rcWindow;
  244. CRect rcClient;
  245. CWindowDC dc(this);
  246. GetWindowRect(&rcWindow);
  247. GetClientRect(&rcClient);
  248.     rcClient.OffsetRect(-rcWindow.TopLeft());
  249.     rcWindow.OffsetRect(-rcWindow.TopLeft());
  250.     ScreenToClient(rcWindow);
  251. rcClient.OffsetRect(-rcWindow.left,-rcWindow.top);
  252. //if (!m_bIsXp)
  253. if (m_dwStyle & CBRS_ORIENT_HORZ && !(m_dwStyle & CBRS_FLOATING))
  254. {rcClient.top+=2;rcClient.left+=1;}
  255. dc.ExcludeClipRect(rcClient);   
  256. rcWindow.OffsetRect(-rcWindow.left, -rcWindow.top);
  257. rcWindow.DeflateRect(1,1);
  258. //pintamos la izquierda
  259. dc.FillSolidRect(0,0,rcWindow.right+1,rcWindow.bottom+2,::GetSysColor(COLOR_BTNFACE)); 
  260. dc.FillSolidRect(0,rcWindow.top+1,rcWindow.right+1,1,::GetSysColor(COLOR_BTNFACE)); 
  261. //pintamos el borde inferior
  262. dc.FillSolidRect(1,rcWindow.bottom-1,rcWindow.right+1,rcWindow.bottom-1,::GetSysColor(COLOR_BTNFACE)); 
  263. dc.FillSolidRect(0,rcWindow.bottom+1,rcWindow.right+1,rcWindow.bottom+1,::GetSysColor(COLOR_BTNFACE )); 
  264. //pintamos la derecha
  265. dc.FillSolidRect(rcWindow.right,0,rcWindow.right-1,rcWindow.bottom,::GetSysColor(COLOR_BTNFACE)); 
  266. dc.FillSolidRect(rcWindow.right+1,-1,rcWindow.right+4,rcWindow.bottom+4,::GetSysColor(COLOR_BTNFACE )); 
  267. dc.IntersectClipRect(rcWindow);
  268. CBrush cb;
  269. cb.CreateSolidBrush(GuiDrawLayer::GetRGBColorXP());
  270. dc.FillRect(rcWindow,&cb);
  271. DrawGripper(&dc,&rcWindow);
  272. }
  273. void CGuiToolBarWnd::OnPaint()
  274. {
  275. CPaintDC dc(this);  
  276. CRect rcBtn;
  277. int nBtn=GetToolBarCtrl().GetButtonCount();
  278. int iBitmap;
  279. UINT nID;
  280. UINT nStyle;
  281. WORD wStyle, wState;
  282. DWORD dwBarStyle = GetToolBarCtrl().GetStyle();
  283. BOOL mbIsPress;
  284. BOOL mbIsEnabled;
  285. CBrush cb;
  286. CImageList m_imgList;
  287. CRect rcUpdate;
  288. int iUltbot;
  289. CRect rcClient;
  290. GetClientRect(&rcClient);
  291. cb.CreateSolidBrush(GuiDrawLayer::GetRGBColorXP());
  292.     // draw borders in non-client area
  293.     CRect rcDraw = rcClient;
  294.  
  295. dc.FillRect(rcDraw, &cb);
  296. HIMAGELIST hiImg = 0;
  297. iBitmap=0;
  298. hiImg = HIMAGELIST(SendMessage(TB_GETIMAGELIST));
  299. m_imgList.Attach(hiImg);
  300. int j=0;
  301. for(int i=0; i < nBtn; i++)
  302. {
  303. bOver=FALSE;
  304. GetItemRect(i,&rcBtn);
  305. GetButtonInfo(i,nID,nStyle,iBitmap);
  306. wStyle= LOWORD(nStyle);
  307. wState= HIWORD(nStyle);
  308. if (wState & TBSTATE_HIDDEN) continue;
  309. if (wStyle == TBSTYLE_SEP)
  310. {
  311. if (!(wState & TBSTATE_WRAP) || ! IsFloating() )
  312. {
  313. CRect m_Separ;
  314. m_Separ=rcBtn;
  315. //si existe un separador vertical
  316. if (m_dwStyle & CBRS_ORIENT_HORZ)
  317. {
  318. dc.FillRect(&rcBtn,&cb);
  319. int nhalf=(m_Separ.Width()/2)-1;
  320. m_Separ.top-=1;
  321. m_Separ.left+=nhalf;
  322. m_Separ.right=m_Separ.left+1;
  323. m_Separ.bottom+=1;
  324. }
  325. else
  326. {
  327. int nhalf=(m_Separ.Width()/2)-1;
  328. int iHeigh=m_Separ.Height();
  329. m_Separ.left=0;
  330. m_Separ.right=m_Separ.left+m_Separ.Height()+1;
  331. m_Separ.top=iUltbot;
  332. m_Separ.bottom=m_Separ.top+m_Separ.Width();
  333. dc.FillRect(&m_Separ,&cb);
  334. m_Separ.left=0;
  335. m_Separ.right=m_Separ.left+iHeigh+1;
  336. m_Separ.top=iUltbot+nhalf;
  337. m_Separ.bottom=m_Separ.top+1;
  338. }
  339. CBrush cbt;
  340. cbt.CreateSolidBrush(RGB(167, 167, 167));
  341. dc.FillRect(m_Separ,&cbt);
  342. continue;
  343. }
  344.  
  345. }
  346. else {
  347. mbIsPress=(wState & TBSTATE_CHECKED) || (wState & TBSTATE_PRESSED);
  348. mbIsEnabled= GetToolBarCtrl().IsButtonEnabled((int)nID);
  349. CPoint pt;
  350. GetCursorPos(&pt);
  351. ScreenToClient(&pt);
  352. CBrush cblu;
  353. if(!rcBtn.PtInRect(pt))
  354. {
  355. if (wState & TBSTATE_CHECKED)
  356. {
  357. cblu.CreateSolidBrush(GuiDrawLayer::GetRGBPressBXP());
  358. dc.FillRect(rcBtn,&cblu);
  359. }
  360. else
  361. {
  362. dc.FillRect(rcBtn,&cb);
  363. }
  364. }
  365. else
  366. {
  367. if (bPressDown)
  368. dc.Draw3dRect(rcBtn,GuiDrawLayer::GetRGBColorShadow(),GuiDrawLayer::GetRGBColorShadow());
  369. else
  370. dc.Draw3dRect(rcBtn,GuiDrawLayer::GetRGBCaptionXP(),GuiDrawLayer::GetRGBCaptionXP());
  371. rcBtn.DeflateRect(1,1);
  372. if (wState & TBSTATE_CHECKED)
  373. {
  374. cblu.CreateSolidBrush(GuiDrawLayer::GetRGBFondoXP());
  375. dc.FillRect(rcBtn,&cblu);
  376. }
  377. else
  378. {
  379. if (bPressDown)
  380. {
  381. cblu.CreateSolidBrush(GuiDrawLayer::GetRGBColorXP());
  382. dc.FillRect(rcBtn,&cblu);
  383. }
  384. else
  385. {
  386. cblu.CreateSolidBrush(mbIsPress?GuiDrawLayer::GetRGBPressBXP():GuiDrawLayer::GetRGBFondoXP());
  387. dc.FillRect(rcBtn,&cblu);
  388. }
  389. if (wStyle == 8) 
  390. {
  391. CRect rcCli=rcBtn;
  392. int dif=rcBtn.right-_afxDropDownWidth;
  393. rcCli.left=dif+1;
  394. if (!bPressDown)
  395. {
  396. CPen Cp( PS_SOLID, 1, GuiDrawLayer::GetRGBCaptionXP());
  397. CPen* oldPen= dc.SelectObject(&Cp);
  398. dc.MoveTo(dif,rcBtn.top);
  399. dc.LineTo(dif,rcBtn.bottom);
  400. dc.SelectObject(oldPen);
  401. }
  402. }
  403. if (!mbIsPress && !bPressDown)
  404. bOver=TRUE;
  405. else
  406. bOver=FALSE;
  407. if (!bPressDown) 
  408. SetTimer(1,10,NULL);
  409. else
  410. KillTimer(1);
  411. }
  412. rcBtn.InflateRect(1,1);
  413. }
  414. }
  415. if (wStyle != TBSTYLE_SEP)
  416. {
  417. int OldMode=dc.SetBkMode(TRANSPARENT);
  418. IMAGEINFO pImageInfo;
  419. m_imgList.GetImageInfo(iBitmap,&pImageInfo);
  420. CRect rcima =pImageInfo.rcImage;
  421. CSize siImg=CSize(rcima.Width(),rcima.Height());
  422. /* Modified By SunZhenyu 2003/6/27, Replace by the next 5 lines, CPoint pti(rcBtn.left+2,rcBtn.top+4); */
  423. CPoint pti(rcBtn.left+(rcBtn.Width()-siImg.cx)/2,rcBtn.top+4);
  424. if( dwBarStyle & TBSTYLE_LIST ) // 文字在右边
  425. pti = CPoint(rcBtn.left+4,rcBtn.top+(rcBtn.Height()-siImg.cy)/2);
  426. else if( wStyle & TBSTYLE_DROPDOWN )
  427. pti.x -= _AfxGetDropDownWidth()/2;
  428. CString mszText=GetButtonText(i);
  429. CFont* m_fontOld=dc.SelectObject(&m_cfont);
  430. if (!(wState & TBSTATE_ENABLED))
  431. {
  432. if (bOver==TRUE)
  433. {
  434. pti.x+=1;
  435. pti.y+=1;
  436. dc.DrawState(pti,siImg,m_imgList.ExtractIcon(iBitmap),DSS_MONO,CBrush (GuiDrawLayer::GetRGBColorShadow()));
  437. pti.x-=2; pti.y-=2;
  438. }
  439. m_imgList.Draw(&dc, iBitmap, pti, ILD_TRANSPARENT);
  440. if (mszText.GetLength() > 0 && !bVertDocked)
  441. {
  442. CRect m_rctext=rcBtn;
  443. /* Modified By SunZhenyu 2003/6/27, Replace by the next 6 line, m_rctext.left+=siImg.cx+4; */
  444. if( dwBarStyle & TBSTYLE_LIST )
  445. m_rctext.left += siImg.cx+4;
  446. else
  447. m_rctext.top += siImg.cy+4;
  448. if( wStyle & TBSTYLE_DROPDOWN )
  449. m_rctext.right -= _AfxGetDropDownWidth();
  450. m_rctext.bottom-=1;
  451. /* Modified By SunZhenyu 2003/6/27, Replace by the next 5 line
  452. dc.DrawText(mszText,&m_rctext,DT_SINGLELINE|DT_BOTTOM|DT_CENTER);
  453. */
  454. m_rctext.right-=1;
  455. if( dwBarStyle & TBSTYLE_LIST )
  456. dc.DrawText(mszText,&m_rctext,DT_SINGLELINE|DT_VCENTER|DT_RIGHT);
  457. else
  458. dc.DrawText(mszText,&m_rctext,DT_SINGLELINE|DT_BOTTOM|DT_CENTER);
  459. }
  460. }
  461. else
  462. {
  463. dc.DrawState(pti,siImg,m_imgList.ExtractIcon(iBitmap),DSS_DISABLED,(CBrush*)NULL);
  464. CRect m_rctext=rcBtn;
  465. /* Modified By SunZhenyu 2003/6/27, Replace by the next 5 line, m_rctext.left+=siImg.cx+4; */
  466. if( dwBarStyle & TBSTYLE_LIST )
  467. m_rctext.left += siImg.cx+4;
  468. else
  469. m_rctext.top += siImg.cy+4;
  470. m_rctext.bottom-=1;
  471. CSize szText=dc.GetTextExtent(mszText);
  472. /* Modified By SunZhenyu 2003/6/27, Replace by the next 4 lines,
  473. pti.x= m_rctext.left+2;
  474. pti.y= (m_rctext.Height()/2)-1;
  475. */
  476. pti.x = m_rctext.left+(m_rctext.Width()-szText.cx)/2;
  477. if( wStyle & TBSTYLE_DROPDOWN )
  478. pti.x = m_rctext.left+(m_rctext.Width()-szText.cx-_AfxGetDropDownWidth())/2;
  479. pti.y= m_rctext.top+(m_rctext.Height()-szText.cy)/2;
  480. //DrawState(pt, m_Csize, m_szCaption, DSS_DISABLED, TRUE, 0, (HBRUSH)NULL);
  481. dc.DrawState(pti,szText,mszText,DSS_DISABLED,TRUE,0,(HBRUSH)NULL);
  482. }
  483. if (wStyle == TBSTYLE_DROPDOWN) 
  484. DrawArrow(&dc,rcBtn);
  485. dc.SetBkMode(OldMode);
  486. // Modified By SunZhenyu
  487. dc.SelectObject(m_fontOld);
  488. iBitmap++;
  489. iUltbot=rcBtn.bottom;
  490. j++;
  491. }
  492. }
  493. m_imgList.Detach();
  494.     ReleaseDC(&dc);
  495.   
  496. }
  497. void CGuiToolBarWnd::DrawArrow(CDC* pDC,CRect m_rc)
  498. {
  499. int difh =m_rc.Height()-mHeight.y;
  500. difh/=2;
  501. m_rc.left=m_rc.right-_AfxGetDropDownWidth();
  502. m_imgArrow.Draw(pDC,0,CPoint(m_rc.left+2,m_rc.top+difh),ILD_TRANSPARENT);
  503. }
  504. void CGuiToolBarWnd::DrawGripper(CWindowDC* dc,CRect* rcWin)
  505. {
  506. if (m_dwStyle & CBRS_FLOATING) return ;
  507. if(!m_bIsXp) //no es XP
  508. {
  509. if (m_dwStyle & CBRS_ORIENT_HORZ)
  510. {
  511. rcWin->top+=2;
  512. rcWin->left+=2;
  513. rcWin->right=rcWin->left+3;
  514. rcWin->bottom-=1;
  515. dc->Draw3dRect(rcWin,::GetSysColor(COLOR_BTNHIGHLIGHT),
  516.  ::GetSysColor(COLOR_BTNSHADOW));
  517. if (m_style == Office97)
  518. {
  519. rcWin->left=rcWin->right+1;
  520. rcWin->right=rcWin->left+3;
  521. dc->Draw3dRect(rcWin,::GetSysColor(COLOR_BTNHIGHLIGHT),
  522.  ::GetSysColor(COLOR_BTNSHADOW));
  523. }
  524. }
  525. else
  526. {
  527. rcWin->top+=2;
  528. //rcWin->left+=1;
  529. rcWin->right-=2;
  530. rcWin->bottom=rcWin->top+3;
  531. dc->Draw3dRect(rcWin,::GetSysColor(COLOR_BTNHIGHLIGHT),
  532.  ::GetSysColor(COLOR_BTNSHADOW));
  533. if (m_style == Office97)
  534. {
  535. rcWin->top=rcWin->bottom+1;
  536. rcWin->bottom=rcWin->top+3;
  537. dc->Draw3dRect(rcWin,::GetSysColor(COLOR_BTNHIGHLIGHT),
  538.  ::GetSysColor(COLOR_BTNSHADOW));
  539. }
  540. }
  541. }
  542. else
  543. {
  544. if (m_dwStyle & CBRS_ORIENT_HORZ)
  545. {
  546. rcWin->top+=5;
  547. rcWin->left+=4;
  548. rcWin->right=rcWin->left+3;
  549. rcWin->bottom-=3;
  550. for (int i=0; i < rcWin->Height(); i+=2)
  551. {
  552. CRect rcWindow;
  553. CBrush cb;
  554. cb.CreateSolidBrush(::GetSysColor(COLOR_BTNSHADOW));
  555. rcWindow=rcWin;
  556. rcWindow.top=rcWin->top+i;
  557. rcWindow.bottom=rcWindow.top+1;
  558. dc->FillRect(rcWindow,&cb);
  559. }
  560. }
  561. else
  562. {
  563. rcWin->top+=2;
  564. rcWin->left+=2;
  565. rcWin->right-=2;
  566. rcWin->bottom=rcWin->top+3;
  567. for (int i=0; i < rcWin->Width(); i+=2)
  568. {
  569. CRect rcWindow;
  570. CBrush cb;
  571. cb.CreateSolidBrush(::GetSysColor(COLOR_BTNSHADOW));
  572. rcWindow=rcWin;
  573. rcWindow.left=rcWindow.left+i;
  574. rcWindow.right=rcWindow.left+1;
  575. dc->FillRect(rcWindow,&cb);
  576. }
  577. }
  578. }
  579. }
  580. void CGuiToolBarWnd::OnLButtonDown(UINT nFlags, CPoint point) 
  581. {
  582. CToolBar::OnLButtonDown(nFlags, point);
  583. if (m_iSelected == 1) return;
  584. m_iSelected =1;
  585. }
  586. BOOL CGuiToolBarWnd::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
  587. {
  588. CPoint ptCurPos; 
  589. CRect rc;GetClientRect(rc);
  590. GetCursorPos (&ptCurPos);
  591. ScreenToClient (&ptCurPos);
  592. if (m_dwStyle & CBRS_ORIENT_HORZ)
  593. {
  594. rc.right=rc.left+2;
  595. if (ptCurPos.x< 0)
  596. {
  597. SetCursor (LoadCursor(NULL, IDC_SIZEALL));
  598. return TRUE;
  599. }
  600. }
  601. else
  602. {
  603. rc.bottom=rc.top+2;
  604. if (ptCurPos.y< 0)
  605. {
  606. SetCursor (LoadCursor(NULL, IDC_SIZEALL));
  607. return TRUE;
  608. }
  609. }
  610. return CToolBar::OnSetCursor(pWnd, nHitTest, message);
  611. }
  612. void CGuiToolBarWnd::OnLButtonUp(UINT nFlags, CPoint point) 
  613. {
  614. CToolBar::OnLButtonUp(nFlags, point);
  615. if (m_iSelected == 1)
  616. {
  617. m_iSelected =0;
  618. KillTimer(1);
  619. SetTimer(1,10,NULL);
  620. }
  621. }
  622. void CGuiToolBarWnd::OnTimer(UINT nIDEvent) 
  623. {
  624. // TODO: Add your message handler code here and/or call default
  625. CRect m_rect;
  626. CPoint pt(GetMessagePos());
  627. ScreenToClient(&pt);
  628. GetClientRect(m_rect);
  629. if (nIDEvent == 1)
  630. {
  631. if (!m_rect.PtInRect(pt))
  632. {
  633. m_iSelected =0;
  634. KillTimer(1);
  635. Invalidate();
  636. UpdateWindow();
  637. }
  638. }
  639. CToolBar::OnTimer(nIDEvent);
  640. }
  641. //**************************************************************************
  642. int CGuiToolBarWnd::GetLastPos()
  643. {
  644. int nNumBars=(int)m_pDockBar->m_arrBars.GetSize();
  645. int m_pos=m_pDockBar->FindBar(this);
  646. for(int i=m_pos+1; i< nNumBars;i++)
  647. {
  648. if (m_pDockBar->m_arrBars[i]== NULL)
  649.     return i-1;
  650. }
  651. return -1;
  652. }
  653. //**************************************************************************
  654. int CGuiToolBarWnd::GetFirstPos()
  655. {
  656. int m_pos=m_pDockBar->FindBar(this);
  657. for(int i=m_pos; i>=0;i--)
  658. {
  659. if (m_pDockBar->m_arrBars[i]== NULL)
  660.     return i+1;
  661. }
  662. return -1;
  663. }
  664. //**************************************************************************
  665. CRect CGuiToolBarWnd::GetDockRect()
  666. {
  667. CRect rcWin;
  668. if (IsVert())
  669. if (IsLeft())
  670. m_pDockSite->GetControlBar(AFX_IDW_DOCKBAR_LEFT)->GetWindowRect(rcWin);
  671. else
  672. m_pDockSite->GetControlBar(AFX_IDW_DOCKBAR_RIGHT)->GetWindowRect(rcWin);
  673. else
  674. if(IsBottom())
  675. m_pDockSite->GetControlBar(AFX_IDW_DOCKBAR_BOTTOM)->GetWindowRect(rcWin);
  676. else
  677. m_pDockSite->GetControlBar(AFX_IDW_DOCKBAR_TOP)->GetWindowRect(rcWin);
  678. return rcWin;
  679. }
  680. //**************************************************************************
  681. int CGuiToolBarWnd::GetHiWid()
  682. {
  683. CRect rcWin;
  684. rcWin=GetDockRect();
  685. if (IsVert())
  686. return rcWin.Height() ;
  687. else
  688. return rcWin.Width() ;
  689. }
  690. //**************************************************************************
  691. void CGuiToolBarWnd::SetRealSize()
  692. {
  693. CRect rcWinFrame;
  694. CRect rcThisBar;
  695. int nVisibles=0;
  696. int nThis = m_pDockBar->FindBar(this);
  697. int nFirst= GetFirstPos();
  698. int nLast=  GetLastPos();
  699. UINT m_nDockBarID = m_pDockBar->GetDlgCtrlID();
  700. int  nMaxlen=GetHiWid();
  701.     int  nLen=0; 
  702. for (int i=nFirst;i <nLast;  i++)
  703. {
  704. CGuiToolBarWnd* pBar;
  705. pBar = (CGuiToolBarWnd*) m_pDockBar->m_arrBars[i];
  706. if (HIWORD(pBar) == 0) continue; 
  707. if (!pBar->IsVisible()) continue;
  708. CRect rc;
  709. pBar->GetWindowRect(rc);
  710. if (IsVert())
  711. nLen+=rc.Height() ;
  712. else
  713. nLen+= rc.Width() ;
  714. nVisibles++;
  715. }
  716. if ( nLen > nMaxlen)
  717. {
  718. int nDif=nLen-nMaxlen;
  719. }
  720. /* if (rcThisBar.Width() > nAfterThis)
  721. {
  722. if (nVisibles > 0)
  723. nAfterThis/=nVisibles;
  724. }
  725. */
  726. }
  727. #define CX_OVERLAP  0
  728. //***************************************************************************
  729. CSize  CGuiToolBarWnd::CalcSize(TBBUTTON* pData, int nCount)
  730. {
  731. ASSERT(pData != NULL && nCount > 0);
  732. BOOL bDrow=FALSE;
  733. int  nNumDrow=0;
  734. CPoint cur(0,0);
  735. CSize sizeResult(0,0);
  736. CClientDC dc(this);
  737. int xSizeMin=32;
  738. if(m_dwStyle & CBRS_FLOATING )  
  739. SetSizes(m_sizeButton, m_sizeImage);
  740. if (bVertDocked)
  741.  ::SendMessage(m_hWnd, TB_SETMAXTEXTROWS, 0, 0);
  742. else
  743.  ::SendMessage(m_hWnd, TB_SETMAXTEXTROWS, 1, 0);
  744. //CFont* m_fontOld=dc.SelectObject(&m_cfont);
  745. // SetRealSize();
  746. DWORD dwExtendedStyle = DefWindowProc(TB_GETEXTENDEDSTYLE, 0, 0);
  747. for (int i = 0; i < nCount; i++)
  748. {
  749. if ((pData[i].fsStyle &  TBSTYLE_SEP) &&(pData[i].idCommand!=0))
  750. {
  751.     if (bVertDocked)
  752. {
  753.  CWnd * pWnd =GetDlgItem(pData[i].idCommand);
  754.  ASSERT_VALID(pWnd);
  755.  pWnd->ShowWindow( SW_HIDE   );
  756.  pData[i].fsState |= TBSTATE_HIDDEN;
  757.  continue;
  758. }
  759. else
  760. {
  761. CWnd * pWnd =GetDlgItem(pData[i].idCommand);
  762. ASSERT_VALID(pWnd);
  763. pData[i].fsState &= ~TBSTATE_HIDDEN;
  764. pWnd->ShowWindow( SW_SHOW   );
  765. }
  766. }
  767. int cySep = pData[i].iBitmap;
  768. cySep = cySep * 2 / 3;
  769. CRect rci;
  770. GetItemRect(i, &rci);
  771. int cx=rci.Width();
  772. xSizeMin=min(xSizeMin,cx);
  773. if (pData[i].fsStyle & TBSTYLE_SEP)
  774. {
  775. // a separator represents either a height or width
  776. if (pData[i].fsState & TBSTATE_WRAP)
  777. sizeResult.cy = max(cur.y + m_sizeButton.cy + cySep, sizeResult.cy);
  778. else
  779. sizeResult.cx = max(cur.x + pData[i].iBitmap, sizeResult.cx);
  780. }
  781. else
  782. {
  783. // check for dropdown style, but only if the buttons are being drawn
  784. if ((pData[i].fsStyle & TBSTYLE_DROPDOWN) &&
  785. (dwExtendedStyle & TBSTYLE_EX_DRAWDDARROWS))
  786. {
  787. // add size of drop down
  788. cx += (_afxDropDownWidth);
  789. nNumDrow++;
  790. bDrow=TRUE;
  791. }
  792. sizeResult.cx = max(cur.x + cx, sizeResult.cx);
  793. sizeResult.cy = max(cur.y + m_sizeButton.cy, sizeResult.cy);
  794. }
  795. if (pData[i].fsStyle & TBSTYLE_SEP)
  796. cur.x += pData[i].iBitmap;
  797. else
  798. cur.x += cx - CX_OVERLAP;
  799. if (pData[i].fsState & TBSTATE_WRAP)
  800. {
  801. cur.x = 0;
  802. cur.y += m_sizeButton.cy;
  803. if (pData[i].fsStyle & TBSTYLE_SEP)
  804. cur.y += cySep;
  805. }
  806. }
  807. if (bDrow == TRUE)
  808. {
  809. if (bVertDocked)
  810. {
  811. sizeResult.cx-=_afxDropDownWidth;
  812. sizeResult.cy+=_afxDropDownWidth-2;//*nNumDrow;
  813. }
  814. else
  815. {
  816. sizeResult.cx-=_afxDropDownWidth*nNumDrow;
  817. }
  818. }
  819. else
  820. {
  821. if (bVertDocked)
  822. sizeResult.cy+=_afxDropDownWidth/2;
  823. }
  824. return sizeResult;
  825. }
  826. int  CGuiToolBarWnd::WrapToolBar(TBBUTTON* pData, int nCount, int nWidth)
  827. {
  828. ASSERT(pData != NULL && nCount > 0);
  829. int nResult = 0;
  830. int x = 0;
  831. for (int i = 0; i < nCount; i++)
  832. {
  833. pData[i].fsState &= ~TBSTATE_WRAP;
  834. if (pData[i].fsState & TBSTATE_HIDDEN)
  835. continue;
  836. int dx, dxNext;
  837. if (pData[i].fsStyle & TBSTYLE_SEP)
  838. {
  839. dx = pData[i].iBitmap;
  840. dxNext = dx;
  841. }
  842. else
  843. {
  844. dx = m_sizeButton.cx;
  845. dxNext = dx - CX_OVERLAP;
  846. }
  847. if (x + dx > nWidth)
  848. {
  849. BOOL bFound = FALSE;
  850. for (int j = i; j >= 0  &&  !(pData[j].fsState & TBSTATE_WRAP); j--)
  851. {
  852. // Find last separator that isn't hidden
  853. // a separator that has a command ID is not
  854. // a separator, but a custom control.
  855. if ((pData[j].fsStyle & TBSTYLE_SEP) &&
  856. (pData[j].idCommand == 0) &&
  857. !(pData[j].fsState & TBSTATE_HIDDEN))
  858. {
  859. bFound = TRUE; i = j; x = 0;
  860. pData[j].fsState |= TBSTATE_WRAP;
  861. nResult++;
  862. break;
  863. }
  864. }
  865. if (!bFound)
  866. {
  867. for (int j = i - 1; j >= 0 && !(pData[j].fsState & TBSTATE_WRAP); j--)
  868. {
  869. // Never wrap anything that is hidden,
  870. // or any custom controls
  871. if ((pData[j].fsState & TBSTATE_HIDDEN) ||
  872. ((pData[j].fsStyle & TBSTYLE_SEP) &&
  873. (pData[j].idCommand != 0)))
  874. continue;
  875. bFound = TRUE; i = j; x = 0;
  876. pData[j].fsState |= TBSTATE_WRAP;
  877. nResult++;
  878. break;
  879. }
  880. if (!bFound)
  881. x += dxNext;
  882. }
  883. }
  884. else
  885. x += dxNext;
  886. }
  887. return nResult + 1;
  888. }
  889. void   CGuiToolBarWnd::SizeToolBar(TBBUTTON* pData, int nCount, int nLength, BOOL bVert)
  890. {
  891. ASSERT(pData != NULL && nCount > 0);
  892. bVert;
  893. if (!bVert)
  894. {
  895. int nMin, nMax, nTarget, nCurrent, nMid;
  896. // Wrap ToolBar as specified
  897. nMax = nLength;
  898. nTarget = WrapToolBar(pData, nCount, nMax);
  899. // Wrap ToolBar vertically
  900. nMin = 0;
  901. nCurrent = WrapToolBar(pData, nCount, nMin);
  902. if (nCurrent != nTarget)
  903. {
  904. while (nMin < nMax)
  905. {
  906. nMid = (nMin + nMax) / 2;
  907. nCurrent = WrapToolBar(pData, nCount, nMid);
  908. if (nCurrent == nTarget)
  909. nMax = nMid;
  910. else
  911. {
  912. if (nMin == nMid)
  913. {
  914. WrapToolBar(pData, nCount, nMax);
  915. break;
  916. }
  917. nMin = nMid;
  918. }
  919. }
  920. }
  921. CSize size = CalcSize(pData, nCount);
  922. WrapToolBar(pData, nCount, size.cx);
  923. }
  924. else
  925. {
  926. CSize sizeMax, sizeMin, sizeMid;
  927. // Wrap ToolBar vertically
  928. WrapToolBar(pData, nCount, 0);
  929. sizeMin = CalcSize(pData, nCount);
  930. // Wrap ToolBar horizontally
  931. WrapToolBar(pData, nCount, 32767);
  932. sizeMax = CalcSize(pData, nCount);
  933. while (sizeMin.cx < sizeMax.cx)
  934. {
  935. sizeMid.cx = (sizeMin.cx + sizeMax.cx) / 2;
  936. WrapToolBar(pData, nCount, sizeMid.cx);
  937. sizeMid = CalcSize(pData, nCount);
  938. if (nLength < sizeMid.cy)
  939. {
  940. if (sizeMin == sizeMid)
  941. {
  942. WrapToolBar(pData, nCount, sizeMax.cx);
  943. return;
  944. }
  945. sizeMin = sizeMid;
  946. }
  947. else if (nLength > sizeMid.cy)
  948. sizeMax = sizeMid;
  949. else
  950. return;
  951. }
  952. }
  953. }
  954. struct _AFX_CONTROLPOS
  955. {
  956. int nIndex, nID;
  957. CRect rectOldPos;
  958. };
  959. CSize  CGuiToolBarWnd::CalcLayout(DWORD dwMode, int nLength)
  960. {
  961. ASSERT_VALID(this);
  962. ASSERT(::IsWindow(m_hWnd));
  963. if (dwMode & LM_HORZDOCK)
  964. ASSERT(dwMode & LM_HORZ);
  965. if (dwMode & LM_HORZ)
  966. bVertDocked=FALSE;
  967. else
  968. bVertDocked=TRUE;
  969. int nCount;
  970. TBBUTTON* pData = NULL;
  971. CSize sizeResult(0,0);
  972. //BLOCK: Load Buttons
  973. {
  974. nCount = DefWindowProc(TB_BUTTONCOUNT, 0, 0);
  975. if (nCount != 0)
  976. {
  977. int i;
  978. pData = new TBBUTTON[nCount];
  979. for (i = 0; i < nCount; i++)
  980. _GetButton(i, &pData[i]);
  981. }
  982. }
  983. if (nCount > 0)
  984. {
  985. if (!(m_dwStyle & CBRS_SIZE_FIXED))
  986. {
  987. BOOL bDynamic = m_dwStyle & CBRS_SIZE_DYNAMIC;
  988. if (bDynamic && (dwMode & LM_MRUWIDTH))
  989. SizeToolBar(pData, nCount, m_nMRUWidth);
  990. else if (bDynamic && (dwMode & LM_HORZDOCK))
  991. SizeToolBar(pData, nCount, 32767);
  992. else if (bDynamic && (dwMode & LM_VERTDOCK))
  993. SizeToolBar(pData, nCount, 0);
  994. else if (bDynamic && (nLength != -1))
  995. {
  996. CRect rect; rect.SetRectEmpty();
  997. CalcInsideRect(rect, (dwMode & LM_HORZ));
  998. BOOL bVert = (dwMode & LM_LENGTHY);
  999. int nLen = nLength + (bVert ? rect.Height() : rect.Width());
  1000. SizeToolBar(pData, nCount, nLen, bVert);
  1001. }
  1002. else if (bDynamic && (m_dwStyle & CBRS_FLOATING))
  1003. SizeToolBar(pData, nCount, m_nMRUWidth);
  1004. else
  1005. SizeToolBar(pData, nCount, (dwMode & LM_HORZ) ? 32767 : 0);
  1006. }
  1007. sizeResult = CalcSize(pData, nCount);
  1008. if (dwMode & LM_COMMIT)
  1009. {
  1010. _AFX_CONTROLPOS* pControl = NULL;
  1011. int nControlCount = 0;
  1012. BOOL bIsDelayed = m_bDelayedButtonLayout;
  1013. m_bDelayedButtonLayout = FALSE;
  1014. for (int i = 0; i < nCount; i++)
  1015. if ((pData[i].fsStyle & TBSTYLE_SEP) && (pData[i].idCommand != 0))
  1016. nControlCount++;
  1017. if (nControlCount > 0)
  1018. {
  1019. pControl = new _AFX_CONTROLPOS[nControlCount];
  1020. nControlCount = 0;
  1021. for(int i = 0; i < nCount; i++)
  1022. {
  1023. if ((pData[i].fsStyle & TBSTYLE_SEP) && (pData[i].idCommand != 0))
  1024. {
  1025. pControl[nControlCount].nIndex = i;
  1026. pControl[nControlCount].nID = pData[i].idCommand;
  1027. CRect rect;
  1028. GetItemRect(i, &rect);
  1029. ClientToScreen(&rect);
  1030. pControl[nControlCount].rectOldPos = rect;
  1031. nControlCount++;
  1032. }
  1033. }
  1034. }
  1035. if ((m_dwStyle & CBRS_FLOATING) && (m_dwStyle & CBRS_SIZE_DYNAMIC))
  1036. m_nMRUWidth = sizeResult.cx;
  1037. for (i = 0; i < nCount; i++)
  1038. _SetButton(i, &pData[i]);
  1039. if (nControlCount > 0)
  1040. {
  1041. for (int i = 0; i < nControlCount; i++)
  1042. {
  1043. CWnd* pWnd = GetDlgItem(pControl[i].nID);
  1044. if (pWnd != NULL)
  1045. {
  1046. CRect rect;
  1047. pWnd->GetWindowRect(&rect);
  1048. CPoint pt = rect.TopLeft() - pControl[i].rectOldPos.TopLeft();
  1049. GetItemRect(pControl[i].nIndex, &rect);
  1050. pt = rect.TopLeft() + pt;
  1051. pWnd->SetWindowPos(NULL, pt.x, pt.y, 0, 0, SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOZORDER);
  1052. }
  1053. }
  1054. delete[] pControl;
  1055. }
  1056. m_bDelayedButtonLayout = bIsDelayed;
  1057. }
  1058. delete[] pData;
  1059. }
  1060. //BLOCK: Adjust Margins
  1061. {
  1062. CRect rect; rect.SetRectEmpty();
  1063. CalcInsideRect(rect, (dwMode & LM_HORZ));
  1064. sizeResult.cy -= rect.Height();
  1065. sizeResult.cx -= rect.Width();
  1066. CSize size = CControlBar::CalcFixedLayout((dwMode & LM_STRETCH), (dwMode & LM_HORZ));
  1067. sizeResult.cx = max(sizeResult.cx, size.cx);
  1068. sizeResult.cy = max(sizeResult.cy, size.cy);
  1069. }
  1070. return sizeResult;
  1071. }
  1072. CSize  CGuiToolBarWnd::CalcFixedLayout(BOOL bStretch, BOOL bHorz)
  1073. {
  1074. DWORD dwMode = bStretch ? LM_STRETCH : 0;
  1075. dwMode |= bHorz ? LM_HORZ : 0;
  1076. return CalcLayout(dwMode);
  1077. }
  1078. CSize  CGuiToolBarWnd::CalcDynamicLayout(int nLength, DWORD dwMode)
  1079. {
  1080. if ((nLength == -1) && !(dwMode & LM_MRUWIDTH) && !(dwMode & LM_COMMIT) &&
  1081. ((dwMode & LM_HORZDOCK) || (dwMode & LM_VERTDOCK)))
  1082. {
  1083. return CalcFixedLayout(dwMode & LM_STRETCH, dwMode & LM_HORZDOCK);
  1084. }
  1085. return CalcLayout(dwMode, nLength);
  1086. }
  1087. void   CGuiToolBarWnd::_GetButton(int nIndex, TBBUTTON* pButton) const
  1088. {
  1089. CGuiToolBarWnd* pBar = (CGuiToolBarWnd*)this;
  1090. VERIFY(pBar->DefWindowProc(TB_GETBUTTON, nIndex, (LPARAM)pButton));
  1091. // TBSTATE_ENABLED == TBBS_DISABLED so invert it
  1092. pButton->fsState ^= TBSTATE_ENABLED;
  1093. }
  1094. void   CGuiToolBarWnd::_SetButton(int nIndex, TBBUTTON* pButton)
  1095. {
  1096. // get original button state
  1097. TBBUTTON button;
  1098. VERIFY(DefWindowProc(TB_GETBUTTON, nIndex, (LPARAM)&button));
  1099. // prepare for old/new button comparsion
  1100. button.bReserved[0] = 0;
  1101. button.bReserved[1] = 0;
  1102. // TBSTATE_ENABLED == TBBS_DISABLED so invert it
  1103. pButton->fsState ^= TBSTATE_ENABLED;
  1104. pButton->bReserved[0] = 0;
  1105. pButton->bReserved[1] = 0;
  1106. // nothing to do if they are the same
  1107. if (memcmp(pButton, &button, sizeof(TBBUTTON)) != 0)
  1108. {
  1109. // don't redraw everything while setting the button
  1110. DWORD dwStyle = GetStyle();
  1111. ModifyStyle(WS_VISIBLE, 0);
  1112. VERIFY(DefWindowProc(TB_DELETEBUTTON, nIndex, 0));
  1113. VERIFY(DefWindowProc(TB_INSERTBUTTON, nIndex, (LPARAM)pButton));
  1114. ModifyStyle(0, dwStyle & WS_VISIBLE);
  1115. // invalidate appropriate parts
  1116. if (((pButton->fsStyle ^ button.fsStyle) & TBSTYLE_SEP) ||
  1117. ((pButton->fsStyle & TBSTYLE_SEP) && pButton->iBitmap != button.iBitmap))
  1118. {
  1119. // changing a separator
  1120. Invalidate();
  1121. }
  1122. else
  1123. {
  1124. // invalidate just the button
  1125. CRect rect;
  1126. if (DefWindowProc(TB_GETITEMRECT, nIndex, (LPARAM)&rect))
  1127. InvalidateRect(rect);
  1128. }
  1129. }
  1130. }
  1131. BOOL CGuiToolBarWnd::IsLeft()
  1132. {
  1133. if (nDockBarAling == AFX_IDW_DOCKBAR_LEFT) return TRUE;
  1134. return FALSE;
  1135. }
  1136. BOOL CGuiToolBarWnd::IsRight()
  1137. {
  1138. if (nDockBarAling == AFX_IDW_DOCKBAR_RIGHT) return TRUE;
  1139. return FALSE;
  1140. }
  1141. BOOL CGuiToolBarWnd::IsTop()
  1142. {
  1143. if (nDockBarAling == AFX_IDW_DOCKBAR_TOP) return TRUE;
  1144. return FALSE;
  1145. }
  1146. BOOL CGuiToolBarWnd::IsBottom()
  1147. {
  1148. if (nDockBarAling == AFX_IDW_DOCKBAR_BOTTOM) return TRUE;
  1149. return FALSE;
  1150. }
  1151. BOOL CGuiToolBarWnd::IsVert()
  1152. {
  1153. if (IsLeft() || IsRight()) return TRUE;
  1154. return FALSE;
  1155. }
  1156. BOOL CGuiToolBarWnd::IsHorz()
  1157. {
  1158. if (IsTop() || IsBottom()) return TRUE;
  1159. return FALSE;
  1160. }
  1161. BOOL CGuiToolBarWnd::IsFloating()
  1162. {
  1163. if (nDockBarAling == AFX_IDW_DOCKBAR_FLOAT) return TRUE;
  1164. return FALSE;
  1165. }