GuiToolBarWnd.cpp
上传用户:wlkj888
上传日期:2022-08-01
资源大小:806k
文件大小:42k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. /****************************************************************************
  2.  * *  
  3.  * GuiToolKit   *
  4.  *  (MFC extension) *  
  5.  * Created by Francisco Campos G. www.beyondata.com fcampos@beyondata.com *
  6.  *--------------------------------------------------------------------------*    
  7.  * *
  8.  * This program is free software;so you are free to use it any of your *
  9.  * applications (Freeware, Shareware, Commercial),but leave this header *
  10.  * intact. *
  11.  * *
  12.  * These files are provided "as is" without warranty of any kind. *
  13.  * *
  14.  *        GuiToolKit is forever FREE CODE !!!!! *
  15.  * *
  16.  *--------------------------------------------------------------------------*
  17.  * Created by: Francisco Campos G. *
  18.  * Bug Fixes and improvements : (Add your name) *
  19.  * -Francisco Campos *
  20.  * -Serge Koroleuve  *
  21.  * -Ernesto Garcia *
  22.  ****************************************************************************/
  23. #include "stdafx.h" 
  24. #include "GuiToolBarWnd.h"
  25. #include "GuiDrawlayer.h"
  26. #include "GuiDockContext.h"
  27. #include "GuiMiniFrameWnd.h"
  28. #ifdef _DEBUG
  29. #undef THIS_FILE
  30. static char THIS_FILE[]=__FILE__;
  31. #define new DEBUG_NEW
  32. #endif
  33. #define BTNS_SHOWTEXT           0x0040
  34. extern int gbintHorz; //Horz=0, Vert=1
  35. extern CRect rcMenu; //CRect of button
  36. class CDropmenu
  37. {
  38. public:
  39. UINT nIDboton;
  40. UINT nMenu;
  41. CWnd* m_pWnd;
  42. LPCTSTR mTitle;
  43. CDropmenu(UINT nID,UINT nMENU)
  44. {
  45. nIDboton=nID;
  46. nMenu=nMENU;
  47. m_pWnd=NULL;
  48. mTitle=NULL;
  49. }
  50. CDropmenu(UINT nID,CWnd* pWnd,LPCTSTR lpTitle)
  51. {
  52. nIDboton=nID;
  53. nMenu=NULL;
  54. m_pWnd=pWnd;
  55. mTitle=lpTitle;
  56. }
  57. };
  58. //////////////////////////////////////////////////////////////////////
  59. // Construction/Destruction
  60. //////////////////////////////////////////////////////////////////////
  61. IMPLEMENT_DYNAMIC(CGuiToolBarWnd,CToolBar)
  62. BEGIN_MESSAGE_MAP(CGuiToolBarWnd,CToolBar)
  63. //{{AFX_MSG_MAP(CGuiToolBarWnd)
  64. ON_WM_PAINT()
  65. ON_WM_NCPAINT()
  66. ON_WM_NCCALCSIZE()
  67. ON_WM_WINDOWPOSCHANGING()
  68. ON_WM_LBUTTONDOWN()
  69. ON_WM_LBUTTONDBLCLK()
  70. ON_WM_RBUTTONDOWN()
  71. ON_NOTIFY_REFLECT_EX(TBN_DROPDOWN,OnDropDown)
  72. ON_WM_TIMER()
  73. ON_WM_LBUTTONUP()
  74. ON_WM_SYSCOLORCHANGE()
  75. ON_WM_SETCURSOR()
  76. ON_WM_CREATE()
  77. //}}AFX_MSG_MAP
  78. ON_WM_DESTROY()
  79. ON_WM_MOUSEMOVE()
  80. END_MESSAGE_MAP()
  81. int _afxDropDownWidth = -1;
  82. int AFXAPI _AfxGetDropDownWidth()
  83. {
  84. // return cached version if already determined...
  85. if (_afxDropDownWidth != -1)
  86. return _afxDropDownWidth;
  87. // otherwise calculate it...
  88. HDC hDC = GetDC(NULL);
  89. ASSERT(hDC != NULL);
  90. HFONT hFont;
  91. if ((hFont = CreateFont(GetSystemMetrics(SM_CYMENUCHECK), 0, 0, 0,
  92. FW_NORMAL, 0, 0, 0, SYMBOL_CHARSET, 0, 0, 0, 0, _T("Marlett"))) != NULL)
  93. hFont = (HFONT)SelectObject(hDC, hFont);
  94. VERIFY(GetCharWidth(hDC, '6', '6', &_afxDropDownWidth));
  95. if (hFont != NULL)
  96. {
  97. SelectObject(hDC, hFont);
  98. DeleteObject(hFont);
  99. }
  100. ReleaseDC(NULL, hDC);
  101. ASSERT(_afxDropDownWidth != -1);
  102. return _afxDropDownWidth;
  103. }
  104.  
  105. int CGuiToolBarWnd::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  106. {
  107. lpCreateStruct->dwExStyle |= WS_CLIPSIBLINGS|WS_CLIPCHILDREN; // prevents flashing
  108. if (CToolBar::OnCreate(lpCreateStruct) == -1)
  109. return -1;
  110. if (m_pDockContext==NULL)
  111. m_pDockContext=new CGuiDockContext(this);
  112. ASSERT(m_pDockContext);
  113. ModifyStyle(0,TBSTYLE_FLAT);
  114. SetSizes(m_sizeButton, m_sizeImage);
  115. return 0;
  116. }
  117. void CGuiToolBarWnd::SetTextOptions()
  118. {
  119.     ASSERT( ::IsWindow( m_hWnd ) );
  120.     CToolBarCtrl& tbCtrl = GetToolBarCtrl();
  121.     DWORD dwStyleEx = tbCtrl.GetExtendedStyle();
  122. ModifyStyle(TBSTYLE_LIST,TBSTYLE_LIST  );
  123. TBBUTTON tbButton;
  124. int nCountBtn;
  125. UINT nID;
  126. UINT nStyle;
  127. WORD wStyle, wState;
  128. int iBitmap;
  129. nCountBtn = SendMessage (TB_BUTTONCOUNT, 0, 0);
  130. for(int i=0; i < nCountBtn; i++)
  131. {
  132. SendMessage(TB_GETBUTTON, i, (LPARAM)&tbButton);
  133. GetButtonInfo(i,nID,nStyle,iBitmap);
  134. wStyle= LOWORD(nStyle);
  135. wState= HIWORD(nStyle);
  136. bOver=FALSE;
  137. if (wState & TBSTATE_HIDDEN) continue;
  138. if (wStyle != TBSTYLE_SEP)
  139. {
  140.   CString m_szCad=GetButtonText(i);
  141. if (!m_szCad.IsEmpty())
  142. {
  143. int nString = (int)DefWindowProc(TB_ADDSTRING, 0, (LPARAM)(LPCTSTR)m_szCad);
  144. if (nString != -1)
  145. {
  146. ModifyStyle(0,wStyle|TBSTYLE_AUTOSIZE |BTNS_SHOWTEXT);
  147. }
  148. else
  149. {
  150. wStyle &= ~BTNS_SHOWTEXT;
  151. wStyle |= TBSTYLE_AUTOSIZE;
  152. ModifyStyle(0,wStyle);
  153. }
  154. wState ^= TBSTATE_ENABLED;
  155. wState ^= TBSTATE_ENABLED;
  156. _SetButton(i,&tbButton);
  157. }
  158. }
  159. }
  160. ::SendMessage(m_hWnd, TB_SETMAXTEXTROWS, 1, 0);
  161. GetParentFrame()->RecalcLayout();
  162. OnIdleUpdateCmdUI(TRUE, 0L);
  163. SetSizes(m_sizeButton, m_sizeImage);
  164. }
  165. //***********************************************************************************
  166. void CGuiToolBarWnd::OnUpdateCmdUI( CFrameWnd* pTarget, BOOL bDisableIfNoHndler ) 
  167. {
  168.  CToolBar::OnUpdateCmdUI( pTarget, bDisableIfNoHndler ); 
  169. }
  170. //***********************************************************************************
  171. void CGuiToolBarWnd::OnWindowPosChanging(WINDOWPOS FAR* lpwndpos) 
  172. {
  173. CToolBar::OnWindowPosChanging(lpwndpos);
  174. /*if(!(m_dwStyle & CBRS_FLOATING))  
  175. SetSizes(m_sizeButton, m_sizeImage);
  176. */
  177. if( !(lpwndpos->flags & SWP_NOMOVE) )
  178. Invalidate(FALSE);
  179. }
  180. //***********************************************************************************
  181. void CGuiToolBarWnd::OnSysColorChange( )
  182. {
  183. CToolBar::OnSysColorChange( );
  184. /*if(!(m_dwStyle & CBRS_FLOATING))  
  185. SetSizes(m_sizeButton, m_sizeImage);*/
  186. Invalidate(TRUE);
  187. GetParentFrame()->RecalcLayout();
  188. }
  189. //***********************************************************************************
  190. CGuiToolBarWnd::CGuiToolBarWnd()
  191. {
  192. m_style = Office97;  //by default
  193. m_pArray.RemoveAll();
  194. m_iElements=0;
  195. m_bIsXp=TRUE;
  196. bPressDown=FALSE;
  197. m_imgArrow.Create(IDB_GUI_DOCKBAR,9,10,RGB(255,0,255));
  198. _AfxGetDropDownWidth();
  199. //m_iWidthDrowDown=GetSystemMetrics(SM_CXHTHUMB);
  200. CBitmap cbmp;
  201. BITMAP bmp;
  202. cbmp.LoadBitmap(IDB_GUI_DOCKBAR);
  203. cbmp.GetBitmap(&bmp);
  204. mHeight=CPoint(bmp.bmWidth,bmp.bmHeight);
  205. //m_cfont.CreateFont(-11,0,0,0,400,0,0,0,0,1,2,1,34,"MS Sans Serif");
  206. m_cfont.CreateFont(14,0,0,0,400,0,0,0,0,1,2,1,34,_T("Marlett"));
  207. m_idLock=-1;
  208. bLoad=FALSE;
  209. m_ActualBtn=-1;
  210. m_StyleDisplay=GUISTYLE_XP;
  211. }
  212. CGuiToolBarWnd::~CGuiToolBarWnd()
  213. {
  214. m_pArray.RemoveAll();
  215. m_imgList.Detach();
  216. }
  217. void CGuiToolBarWnd::SetTextButton(int IdButton,CString sztexto)
  218. {
  219. //sztexto+=sztexto.Find( '&' ) == -1 ?"   ":"    ";
  220. CClientDC dc(this);
  221. SetButtonText(IdButton,sztexto);
  222. SetButtonStyle(IdButton,TBSTYLE_AUTOSIZE);
  223. SetTextOptions();
  224. SetSizes(m_sizeButton, m_sizeImage);
  225.             
  226. }
  227. void CGuiToolBarWnd::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS FAR* lpncsp) 
  228. {
  229. CToolBar::OnNcCalcSize(bCalcValidRects, lpncsp);
  230. }
  231. BOOL CGuiToolBarWnd::CreateCombo(CComboBox* pControl,UINT nID,int iSize,DWORD dwStyle)
  232. {
  233. CRect rect;
  234. CFont m_Font;
  235. m_Font.CreateStockObject (DEFAULT_GUI_FONT);
  236. int nIndex = this->GetToolBarCtrl().CommandToIndex(nID);
  237. this->SetButtonInfo(nIndex, nID, TBBS_SEPARATOR, iSize);
  238. this->GetToolBarCtrl().GetItemRect(nIndex, &rect);
  239. rect.top = 1;
  240. //rect.bottom-=1;
  241. rect.bottom = rect.top +iSize/*drop height*/;
  242. if(!pControl->Create(dwStyle, rect, this, nID))
  243. {
  244. TRACE(_T("Failed to create combo-boxn"));
  245. return FALSE;
  246. }
  247. return TRUE;
  248. }
  249. BOOL CGuiToolBarWnd::CreateCombo(CComboBoxEx* pControl,UINT nID,int iSize,CImageList* m_imgList,DWORD dwStyle)
  250. {
  251. CRect rect;
  252. int nIndex = this->GetToolBarCtrl().CommandToIndex(nID);
  253. this->SetButtonInfo(nIndex, nID, TBBS_SEPARATOR, iSize);
  254. this->GetToolBarCtrl().GetItemRect(nIndex, &rect);
  255. rect.top = 1;
  256. rect.bottom = rect.top + 250 /*drop height*/;
  257. if(!pControl->Create(dwStyle, rect, this, nID))
  258. {
  259. TRACE(_T("Failed to create combo-boxn"));
  260. return FALSE;
  261. }
  262. pControl->SetImageList(m_imgList);
  263. return TRUE;
  264. }
  265. void CGuiToolBarWnd::AddRowComBoboxEx(CComboBoxEx* pControl,CString szMsg,int iItem,int iImage)
  266. {
  267. COMBOBOXEXITEM cb;
  268. cb.mask=CBEIF_TEXT | CBEIF_IMAGE |CBEIF_SELECTEDIMAGE;       
  269. cb.pszText=(LPTSTR)(LPCTSTR)szMsg;
  270. cb.iItem=iItem;
  271. cb.iImage=cb.iSelectedImage=iImage;
  272. cb.cchTextMax=20; 
  273. pControl->InsertItem(&cb);
  274. }
  275. void CGuiToolBarWnd::SetButtonDropDown(UINT nID,int iImage,UINT nMENU)
  276. {
  277. CToolBarCtrl &m_tbc= GetToolBarCtrl();
  278. m_tbc.SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS);
  279. m_tbc.SetStyle(m_tbc.GetStyle() | TBSTYLE_LIST | CCS_ADJUSTABLE);
  280. int nIndex = this->GetToolBarCtrl().CommandToIndex(nID);
  281. this->SetButtonInfo(nIndex, nID, TBBS_DROPDOWN, iImage);
  282. m_pArray.SetAtGrow(m_iElements,new CDropmenu(nID,nMENU));
  283. m_iElements++;
  284. }
  285. void CGuiToolBarWnd::SetButtonDropDown(UINT nID,int iImage,CWnd* pWnd,LPCTSTR lpTitle)
  286. {
  287. CToolBarCtrl &m_tbc= GetToolBarCtrl();
  288. m_tbc.SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS);
  289. m_tbc.SetStyle(m_tbc.GetStyle() | TBSTYLE_LIST | CCS_ADJUSTABLE);
  290. int nIndex = this->GetToolBarCtrl().CommandToIndex(nID);
  291. this->SetButtonInfo(nIndex, nID, TBBS_DROPDOWN, iImage);
  292. pWnd->ShowWindow(SW_HIDE);
  293. m_pArray.SetAtGrow(m_iElements,new CDropmenu(nID,pWnd,lpTitle));
  294. m_iElements++;
  295. }
  296. BOOL CGuiToolBarWnd::OnDropDown(NMHDR* pNMHDR, LRESULT* pRes)
  297. {
  298. const NMTOOLBAR& m_nmTb = *(NMTOOLBAR*)pNMHDR;
  299. CRect rc;
  300. BOOL bFind=FALSE;
  301. GetToolBarCtrl().GetRect(m_nmTb.iItem, rc);
  302. ClientToScreen(&rc);
  303. for(int i=0; i < m_iElements; i++)
  304. {
  305. if (((CDropmenu*)m_pArray[i])->nIDboton == (UINT)m_nmTb.iItem)
  306. {
  307. bFind=TRUE;
  308. break;
  309. }
  310. }
  311. if (!bFind) return FALSE;
  312. if (((CDropmenu*)m_pArray[i])->nMenu > 0)
  313. {
  314. bPressDown=TRUE;
  315. CMenu m_menu;
  316. m_menu.LoadMenu(((CDropmenu*)m_pArray[i])->nMenu);
  317. CMenu* m_SubMenu = m_menu.GetSubMenu(0);
  318. gbintHorz=0; //Horz=0, Vert=1
  319. rcMenu=rc; //CRect of button
  320. m_SubMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_VERTICAL,
  321. rc.left, rc.bottom-2, AfxGetMainWnd(), &rc);
  322. bPressDown=FALSE;
  323. }
  324. else
  325. {
  326. if(((CDropmenu*)m_pArray[i])->m_pWnd)
  327. {
  328. bPressDown=TRUE;
  329. CRect rc;
  330. GetItemRect (CommandToIndex (((CDropmenu*)m_pArray[i])->nIDboton), rc);
  331. m_idLock=((CDropmenu*)m_pArray[i])->nIDboton;
  332. ClientToScreen (rc);
  333. rc.bottom += 1;
  334. CGuiMiniFrameWnd* p = new CGuiMiniFrameWnd;
  335. if (!p->Create(this,((CDropmenu*)m_pArray[i])->m_pWnd,rc,
  336. ((CDropmenu*)m_pArray[i])->mTitle,rc.Width()-1))
  337. {
  338. if (((CDropmenu*)m_pArray[i])->m_pWnd->IsWindowVisible())
  339. {
  340. UnlockWindowUpdate();
  341. bPressDown=FALSE;
  342. return TRUE;
  343. }
  344. }
  345. InvalidateRect(m_rcSaveFloat,TRUE);
  346. UpdateWindow();
  347. LockWindowUpdate();
  348. bPressDown=FALSE;
  349. }
  350. }
  351. return TRUE;
  352. }
  353. //Thanks to Ernesto Garcia 
  354. void CGuiToolBarWnd::OnDestroy()
  355. {
  356. for( int i=0; i<m_iElements; i++ )
  357.     {
  358.     CDropmenu *pArr = (CDropmenu*)m_pArray.GetAt(i);
  359.     if( pArr )
  360.         delete pArr;
  361.     }
  362. CToolBar::OnDestroy();
  363. // TODO: Add your message handler code here
  364. }
  365. void CGuiToolBarWnd::OnNcPaint()
  366. {
  367. CRect rcWindow;
  368. CRect rcClient;
  369. CWindowDC dc(this);
  370. GetWindowRect(&rcWindow);
  371. GetClientRect(&rcClient);
  372.     rcClient.OffsetRect(-rcWindow.TopLeft());
  373.     rcWindow.OffsetRect(-rcWindow.TopLeft());
  374.     ScreenToClient(rcWindow);
  375. rcClient.OffsetRect(-rcWindow.left,-rcWindow.top);
  376. //if (!m_bIsXp)
  377. // if (m_dwStyle & CBRS_ORIENT_HORZ && !(m_dwStyle & CBRS_FLOATING))
  378. // {rcClient.top+=2;rcClient.left+=1;}
  379. dc.ExcludeClipRect(rcClient);   
  380. rcWindow.OffsetRect(-rcWindow.left, -rcWindow.top);
  381. // office xp
  382. if (m_StyleDisplay==GUISTYLE_XP)
  383. rcWindow.DeflateRect(1,1);
  384. //pintamos la izquierda
  385. dc.FillSolidRect(0,0,rcWindow.right+1,rcWindow.bottom+2,GuiDrawLayer::GetRGBColorFace(m_StyleDisplay)); 
  386. dc.FillSolidRect(0,rcWindow.top+1,rcWindow.right+1,1,GuiDrawLayer::GetRGBColorFace(m_StyleDisplay)); 
  387. //pintamos el borde inferior
  388. dc.FillSolidRect(1,rcWindow.bottom-1,rcWindow.right+1,rcWindow.bottom-1,GuiDrawLayer::GetRGBColorFace(m_StyleDisplay)); 
  389. dc.FillSolidRect(0,rcWindow.bottom+1,rcWindow.right+1,rcWindow.bottom+1, GuiDrawLayer::GetRGBColorFace(m_StyleDisplay)); 
  390. if (m_StyleDisplay==GUISTYLE_2003)
  391. dc.FillSolidRect(0,rcWindow.bottom+1,rcWindow.right+1,rcWindow.bottom+1,GuiDrawLayer::GetRGBColorShadow(m_StyleDisplay)); 
  392. //pintamos la derecha
  393. dc.FillSolidRect(rcWindow.right,0,rcWindow.right-1,rcWindow.bottom,GuiDrawLayer::GetRGBColorFace(m_StyleDisplay)); 
  394. dc.FillSolidRect(rcWindow.right+1,-1,rcWindow.right+4,rcWindow.bottom+4,GuiDrawLayer::GetRGBColorFace(m_StyleDisplay)); 
  395. dc.IntersectClipRect(rcWindow);
  396. //office xp
  397. CBrush cb;
  398. cb.CreateSolidBrush(GuiDrawLayer::GetRGBColorFace(m_StyleDisplay));
  399. dc.FillRect(rcWindow,&cb);
  400. CRect rcW=rcWindow;
  401. DrawGripper(&dc,&rcWindow);
  402. return;
  403. }
  404. void CGuiToolBarWnd::OnPaint()
  405. {
  406. CPaintDC dc (this);
  407. TBBUTTON tbButton;
  408. HIMAGELIST hiImg;
  409. int nCountBtn;
  410. CRect rcBtn;
  411. CBrush cb;
  412. CRect rcClient;
  413. CRect rcAreaUpdate;
  414. UINT nID;
  415. UINT nStyle;
  416. WORD wStyle, wState;
  417. int iBitmap;
  418. int iUltbot=0;
  419. BOOL mbIsPress;
  420. BOOL mbIsEnabled;
  421. BOOL mIsSilver2003=FALSE;
  422. int OldMode=dc.SetBkMode(TRANSPARENT);
  423. GetClientRect(&rcClient);
  424. hiImg = (HIMAGELIST)SendMessage (TB_GETIMAGELIST, 0, 0);
  425.     nCountBtn = SendMessage (TB_BUTTONCOUNT, 0, 0);
  426. if (m_StyleDisplay == GUISTYLE_2003)
  427. {
  428. COLORREF clrNear=dc.GetNearestColor(GuiDrawLayer::GetRGBCaptionXP());
  429. if(clrNear ==13221564)
  430. mIsSilver2003=TRUE;
  431. if (m_dwStyle & CBRS_ORIENT_HORZ)
  432. {
  433. CGradient M(CSize(rcClient.Width(),rcClient.Height()));
  434. if (GuiDrawLayer::m_Theme)
  435. M.PrepareVertical(&dc,m_StyleDisplay,GuiDrawLayer::GetRGBFondoXP());
  436. else
  437. M.PrepareVertical(&dc,m_StyleDisplay);
  438. M.Draw(&dc,0,0,0,0,rcClient.Width(),rcClient.Height(),SRCCOPY);
  439. }
  440. else
  441. {
  442. CGradient M(CSize(rcClient.Width(),rcClient.Height()));
  443. if (GuiDrawLayer::m_Theme)
  444. M.PrepareHorizontal(&dc,m_StyleDisplay,GuiDrawLayer::GetRGBFondoXP());
  445. else
  446. M.PrepareHorizontal(&dc,m_StyleDisplay);
  447. M.Draw(&dc,0,0,0,0,rcClient.Width(),rcClient.Height(),SRCCOPY);
  448. }
  449. }
  450. else
  451. {
  452. //  oficce xp
  453. cb.CreateSolidBrush(GuiDrawLayer::GetRGBColorXP());
  454. dc.FillRect(rcClient,&cb);
  455. }
  456. int j=0;
  457. dc.GetClipBox (rcAreaUpdate);
  458. for(int i=0; i < nCountBtn; i++)
  459. {
  460. SendMessage(TB_GETBUTTON, i, (LPARAM)&tbButton);
  461. GetItemRect(i,&rcBtn);
  462. GetButtonInfo(i,nID,nStyle,iBitmap);
  463. wStyle= LOWORD(nStyle);
  464. wState= HIWORD(nStyle);
  465. bOver=FALSE;
  466. if (wState & TBSTATE_HIDDEN) continue;
  467. if (wStyle == TBSTYLE_SEP)
  468. {
  469. if (!(wState & TBSTATE_WRAP) || ! IsFloating() )
  470. {
  471. CRect m_Separ;
  472. m_Separ=rcBtn;
  473. //si existe un separador vertical
  474. if (m_dwStyle & CBRS_ORIENT_HORZ)
  475. {
  476. // dc.FillRect(&rcBtn,&cb);
  477. int nhalf=(m_Separ.Width()/2)-1;
  478. m_Separ.top+=m_StyleDisplay == GUISTYLE_2003? 4:1;
  479. m_Separ.left+=nhalf;
  480. m_Separ.right=m_Separ.left+1;
  481. m_Separ.bottom-=m_StyleDisplay == GUISTYLE_2003? 2:1;
  482. }
  483. else
  484. {
  485. int nhalf=(m_Separ.Width()/2)-1;
  486. int iHeigh=m_Separ.Height();
  487. m_Separ.left=0;
  488. m_Separ.right=m_Separ.left+m_Separ.Height()+1;
  489. m_Separ.top=iUltbot;
  490. m_Separ.bottom=m_Separ.top+m_Separ.Width();
  491. // dc.FillRect(&m_Separ,&cb);
  492. m_Separ.left=0;
  493. m_Separ.right=m_Separ.left+iHeigh+1;
  494. m_Separ.top=iUltbot+nhalf;
  495. m_Separ.bottom=m_Separ.top+1;
  496. }
  497. CBrush cbt;
  498. cbt.CreateSolidBrush(GuiDrawLayer::GetRGBColorShadow(m_StyleDisplay));
  499. if (!((wStyle &  TBSTYLE_SEP) &&(nID !=0)))
  500. {
  501. dc.FillRect(m_Separ,&cbt);
  502. cbt.DeleteObject();
  503. cbt.CreateSolidBrush(GuiDrawLayer::GetRGBColorTabs());
  504. m_Separ.left+=2;
  505. m_Separ.top+=1;
  506. m_Separ.bottom+=1;
  507. dc.FillRect(m_Separ,&cbt);
  508. }
  509. cbt.DeleteObject();
  510. continue;
  511. }
  512. }
  513. else
  514. {
  515. if( ! CRect().IntersectRect(rcAreaUpdate, rcBtn) )
  516. continue;
  517. mbIsPress=(wState & TBSTATE_CHECKED) || (wState & TBSTATE_PRESSED);
  518. mbIsEnabled= GetToolBarCtrl().IsButtonEnabled((int)nID);
  519. if (mbIsEnabled)
  520. {
  521. CPoint pt;
  522. GetCursorPos(&pt);
  523. ScreenToClient(&pt);
  524. CBrush cblu;
  525. if(!rcBtn.PtInRect(pt))
  526. {
  527. if (wState & TBSTATE_CHECKED)
  528. {
  529. dc.Draw3dRect(rcBtn,GuiDrawLayer::GetRGBCaptionXP(),GuiDrawLayer::GetRGBCaptionXP());
  530. rcBtn.DeflateRect(1,1);
  531. if (m_StyleDisplay == GUISTYLE_2003)
  532. cblu.CreateSolidBrush(GuiDrawLayer::m_Theme? RGB(249,200,102):GuiDrawLayer::GetRGBFondoXP());
  533. else
  534. cblu.CreateSolidBrush(GuiDrawLayer::GetRGBFondoXP());
  535. dc.FillRect(rcBtn,&cblu);
  536. }
  537. else
  538. {
  539. if (m_StyleDisplay == GUISTYLE_XP)
  540. dc.FillRect(rcBtn,&cb);
  541. }
  542. }
  543. else
  544. {
  545. if (bPressDown )
  546. dc.Draw3dRect(rcBtn,GuiDrawLayer::GetRGBMenu(),GuiDrawLayer::GetRGBMenu());
  547. else  
  548. if (!mIsSilver2003)
  549. dc.Draw3dRect(rcBtn,GuiDrawLayer::GetRGBCaptionXP(),GuiDrawLayer::GetRGBCaptionXP());
  550. else
  551. dc.Draw3dRect(rcBtn,GuiDrawLayer::GetRGBColorShadow(GuiDrawLayer::m_Style),GuiDrawLayer::GetRGBColorShadow(GuiDrawLayer::m_Style));
  552. rcBtn.DeflateRect(1,1);
  553. if (wState & TBSTATE_CHECKED)
  554. {
  555. cblu.CreateSolidBrush(GuiDrawLayer::GetRGBFondoXP());
  556. dc.FillRect(rcBtn,&cblu);
  557. }
  558. else
  559. {
  560. if (bPressDown)
  561. {
  562. if (m_StyleDisplay == GUISTYLE_2003)
  563. if(wStyle != TBSTYLE_DROPDOWN) 
  564. cblu.CreateSolidBrush(GuiDrawLayer::m_Theme? RGB(249,200,102):GuiDrawLayer::GetRGBColorXP());
  565. else
  566. {
  567. if (mbIsPress)
  568. cblu.CreateSolidBrush(RGB(249,200,102));
  569. else
  570. cblu.CreateStockObject(NULL_BRUSH);
  571. }
  572. else
  573. cblu.CreateSolidBrush(GuiDrawLayer::GetRGBColorXP());
  574. dc.FillRect(rcBtn,&cblu);
  575. }
  576. else
  577. {
  578. if (m_StyleDisplay == GUISTYLE_2003)
  579. {
  580. if (GuiDrawLayer::m_Theme)
  581. {
  582. if(wStyle != TBSTYLE_DROPDOWN) 
  583. cblu.CreateSolidBrush(mbIsPress?RGB(249,200,102):RGB(252,230,186));
  584. else
  585. cblu.CreateSolidBrush(mbIsPress?GuiDrawLayer::GetRGBFondoXP():RGB(252,230,186));
  586. }
  587. else
  588. cblu.CreateSolidBrush(mbIsPress?GuiDrawLayer::GetRGBPressBXP():GuiDrawLayer::GetRGBFondoXP());
  589. }
  590. else
  591. cblu.CreateSolidBrush(mbIsPress?GuiDrawLayer::GetRGBPressBXP():GuiDrawLayer::GetRGBFondoXP());
  592. dc.FillRect(rcBtn,&cblu);
  593. }
  594. if (wStyle == 8) 
  595. {
  596. CRect rcCli=rcBtn;
  597. int dif=rcBtn.right-_afxDropDownWidth;
  598. rcCli.left=dif+1;
  599. if (!bPressDown)
  600. {
  601. CPen Cp( PS_SOLID, 1, GuiDrawLayer::GetRGBCaptionXP());
  602. CPen* oldPen= dc.SelectObject(&Cp);
  603. dc.MoveTo(dif,rcBtn.top);
  604. dc.LineTo(dif,rcBtn.bottom);
  605. dc.SelectObject(oldPen);
  606. }
  607. }
  608. if (!mbIsPress && !bPressDown)
  609. bOver=TRUE;
  610. else
  611. bOver=FALSE;
  612.   
  613. }
  614. rcBtn.InflateRect(1,1);
  615. }
  616. }
  617. }
  618. if (wStyle != TBSTYLE_SEP)
  619. {
  620. HICON hIcon = ImageList_ExtractIcon (NULL, hiImg, iBitmap);
  621. IMAGEINFO pImageInfo;
  622. CRect rcima =pImageInfo.rcImage;
  623. CSize siImg=CSize(rcima.Width(),rcima.Height());
  624. CPoint pti(rcBtn.left+2,rcBtn.top+4);
  625. CString mszText=GetButtonText(i);
  626. CFont* m_fontOld=dc.SelectObject(&m_cfont);
  627. if (!(wState & TBSTATE_ENABLED))
  628. {
  629. if (GuiDrawLayer::m_Style != GUISTYLE_2003)
  630. if (bOver==TRUE)
  631. {
  632. pti.x+=1;
  633. pti.y+=1;
  634. dc.DrawState(pti,m_sizeImage,hIcon,DSS_MONO,CBrush (GuiDrawLayer::GetRGBColorShadow()));
  635. pti.x-=2; pti.y-=2;
  636. }
  637. dc.DrawState(pti,m_sizeImage,hIcon,DSS_NORMAL,CBrush (GuiDrawLayer::GetRGBColorShadow()));
  638. // m_imgList.Draw(&m_dc, iBitmap, pti, ILD_TRANSPARENT);
  639. if (mszText.GetLength() > 0 && !bVertDocked)
  640. {
  641. CRect m_rctext=rcBtn;
  642. m_rctext.left+=m_sizeImage.cx+4;
  643. m_rctext.bottom-=1;
  644. dc.DrawText(mszText,&m_rctext,DT_SINGLELINE|DT_BOTTOM);
  645. }
  646. }
  647. else
  648. {
  649.  dc.DrawState(pti,m_sizeImage,hIcon,DSS_MONO,CBrush (GuiDrawLayer::GetRGBColorShadow()));
  650. // m_dc.DrawState(pti,siImg,m_imgList.ExtractIcon(iBitmap),DSS_DISABLED,(CBrush*)NULL);
  651.  CRect m_rctext=rcBtn;
  652.  m_rctext.left+=m_sizeImage.cx+4;
  653.  m_rctext.bottom-=1;
  654.  CSize szText=dc.GetTextExtent(mszText);
  655.  pti.x= m_rctext.left+2;
  656.  pti.y=(m_rctext.Height()/2)-1;
  657.  //DrawState(pt, m_Csize, m_szCaption, DSS_DISABLED, TRUE, 0, (HBRUSH)NULL);
  658.  dc.DrawState(pti,szText,mszText,DSS_DISABLED,TRUE,0,(HBRUSH)NULL);
  659. }
  660. DestroyIcon (hIcon);
  661. if (wStyle == 8) 
  662. DrawArrow(&dc,rcBtn);
  663. iBitmap++;
  664. iUltbot=rcBtn.bottom;
  665. j++;
  666. dc.SelectObject(m_fontOld);
  667. }
  668. }
  669. dc.SetBkMode(OldMode);
  670. }
  671. void CGuiToolBarWnd::DrawArrow(CDC* pDC,CRect m_rc)
  672. {
  673. int difh =m_rc.Height()-mHeight.y;
  674. difh/=2;
  675. m_rc.left=m_rc.right-_AfxGetDropDownWidth();
  676. m_imgArrow.Draw(pDC,0,CPoint(m_rc.left+2,m_rc.top+difh),ILD_TRANSPARENT);
  677. }
  678. void CGuiToolBarWnd::DrawGripper(CWindowDC* dc,CRect* rcWin)
  679. {
  680. if (m_StyleDisplay == GUISTYLE_2003)
  681. {
  682. if (m_dwStyle & CBRS_ORIENT_HORZ)
  683. {
  684. CGradient M(CSize(rcWin->Width(),rcWin->Height()));
  685. M.PrepareVertical(dc,m_StyleDisplay);
  686. M.Draw(dc,0,2,2,4,1,rcWin->Height()-1,SRCCOPY);
  687. M.Draw(dc,1,1,1,0,1,rcWin->Height()-1,SRCCOPY);
  688. M.Draw(dc,2,0,0,0,rcWin->Width()-4,rcWin->Height(),SRCCOPY);
  689. M.Draw(dc,rcWin->Width()-1,3,0,1,rcWin->Width(),rcWin->Height()-1,SRCCOPY);
  690. M.Draw(dc,rcWin->Width()-2,2,0,1,rcWin->Width(),rcWin->Height()-1,SRCCOPY);
  691. if (m_StyleDisplay==GUISTYLE_2003)
  692.  dc->FillSolidRect(rcWin->left+1,rcWin->bottom,rcWin->right-2,rcWin->bottom,GuiDrawLayer::GetRGBColorShadow(m_StyleDisplay)); 
  693. }
  694. else
  695. {
  696. CGradient M(CSize(rcWin->Width(),rcWin->Height()));
  697. M.PrepareHorizontal(dc,m_StyleDisplay);
  698. M.Draw(dc,0,0,0,0,rcWin->Width()-4,rcWin->Height(),SRCCOPY);
  699. }
  700. }
  701. else
  702. {
  703.  dc->FillSolidRect(rcWin,GuiDrawLayer::GetRGBColorXP()); 
  704. }
  705. if (m_dwStyle & CBRS_FLOATING) return ;
  706. if(m_StyleDisplay == GUISTYLE_2003) //no es XP
  707. {
  708. if (m_dwStyle & CBRS_ORIENT_HORZ)
  709. {
  710. rcWin->top+=7;
  711. rcWin->left+=5;
  712. rcWin->right=rcWin->left+2;
  713. rcWin->bottom-=4;
  714. CRect rcBlack;
  715. for (int i=0; i < rcWin->Height(); i+=4)
  716. {
  717. CRect rcWindow;
  718. CBrush cb;
  719. cb.CreateSolidBrush(::GetSysColor(COLOR_BTNHIGHLIGHT));
  720. rcWindow=rcWin;
  721. rcWindow.top=rcWin->top+i;
  722. rcWindow.bottom=rcWindow.top+2;
  723. dc->FillRect(rcWindow,&cb);
  724. rcBlack=rcWindow;
  725. rcBlack.left-=1;
  726. rcBlack.top=(rcWin->top+i)-1;
  727. rcBlack.bottom=rcBlack.top+2;
  728. rcBlack.right=rcBlack.left+2;
  729. cb.DeleteObject();
  730. cb.CreateSolidBrush(GuiDrawLayer::GetRGBColorShadow(m_StyleDisplay));
  731. dc->FillRect(rcBlack,&cb);
  732. }
  733. }
  734. else
  735. {
  736. rcWin->top+=3;
  737. rcWin->left+=4;
  738. rcWin->right-=2;
  739. rcWin->bottom=rcWin->top+2;
  740. CRect rcBlack;
  741. for (int i=0; i < rcWin->Width(); i+=4)
  742. {
  743. CRect rcWindow;
  744. CBrush cb;
  745. cb.CreateSolidBrush(::GetSysColor(COLOR_BTNHIGHLIGHT));
  746. rcWindow=rcWin;
  747. rcWindow.left=rcWindow.left+i;
  748. rcWindow.right=rcWindow.left+2;
  749. dc->FillRect(rcWindow,&cb);
  750. rcBlack=rcWindow;
  751. rcBlack.top-=1;
  752. rcBlack.left-=1;
  753. rcBlack.bottom=rcBlack.top+2;
  754. rcBlack.right=rcBlack.left+2;
  755. cb.DeleteObject();
  756. cb.CreateSolidBrush(GuiDrawLayer::GetRGBColorShadow(m_StyleDisplay));
  757. dc->FillRect(rcBlack,&cb);
  758. }
  759. }
  760. }
  761. else
  762. {
  763. if (m_dwStyle & CBRS_ORIENT_HORZ)
  764. {
  765. rcWin->top+=6;
  766. rcWin->left+=4;
  767. rcWin->right=rcWin->left+3;
  768. rcWin->bottom-=3;
  769. for (int i=0; i < rcWin->Height(); i+=2)
  770. {
  771. CRect rcWindow;
  772. CBrush cb;
  773. cb.CreateSolidBrush(::GetSysColor(COLOR_BTNSHADOW));
  774. rcWindow=rcWin;
  775. rcWindow.top=rcWin->top+i;
  776. rcWindow.bottom=rcWindow.top+1;
  777. dc->FillRect(rcWindow,&cb);
  778. }
  779. }
  780. else
  781. {
  782. rcWin->top+=2;
  783. rcWin->left+=2;
  784. rcWin->right-=2;
  785. rcWin->bottom=rcWin->top+3;
  786. for (int i=0; i < rcWin->Width(); i+=2)
  787. {
  788. CRect rcWindow;
  789. CBrush cb;
  790. cb.CreateSolidBrush(::GetSysColor(COLOR_BTNSHADOW));
  791. rcWindow=rcWin;
  792. rcWindow.left=rcWindow.left+i;
  793. rcWindow.right=rcWindow.left+1;
  794. dc->FillRect(rcWindow,&cb);
  795. }
  796. }
  797. }
  798. }
  799. void CGuiToolBarWnd::OnLButtonDown(UINT nFlags, CPoint point) 
  800. {
  801. CToolBar::OnLButtonDown(nFlags, point);
  802. if (m_iSelected == 1) return;
  803. m_iSelected =1;
  804. }
  805. void CGuiToolBarWnd::OnRButtonDown(UINT nFlags, CPoint point) 
  806. {
  807. CToolBar::OnRButtonDown(nFlags,point);
  808. ClientToScreen (&point);
  809. CMenu m_menu;
  810. m_menu.LoadMenu(MenuContext);
  811. if (!m_menu.GetSafeHmenu())
  812. return ;
  813. CMenu* m_SubMenu = m_menu.GetSubMenu(0);
  814. m_SubMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_VERTICAL,
  815. point.x, point.y-2, AfxGetMainWnd());
  816. Invalidate();
  817. UpdateWindow();
  818. }
  819. void CGuiToolBarWnd::OnLButtonDblClk(UINT nFlags, CPoint point) 
  820. {
  821. }
  822. BOOL CGuiToolBarWnd::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
  823. {
  824. CPoint ptCurPos; 
  825. CRect rc;GetClientRect(rc);
  826. GetCursorPos (&ptCurPos);
  827. ScreenToClient (&ptCurPos);
  828. if (m_dwStyle & CBRS_ORIENT_HORZ)
  829. {
  830. rc.right=rc.left+2;
  831. if (ptCurPos.x< 0)
  832. {
  833. SetCursor (LoadCursor(NULL, IDC_SIZEALL));
  834. return TRUE;
  835. }
  836. }
  837. else
  838. {
  839. rc.bottom=rc.top+2;
  840. if (ptCurPos.y< 0)
  841. {
  842. SetCursor (LoadCursor(NULL, IDC_SIZEALL));
  843. return TRUE;
  844. }
  845. }
  846. return CToolBar::OnSetCursor(pWnd, nHitTest, message);
  847. }
  848. void CGuiToolBarWnd::OnLButtonUp(UINT nFlags, CPoint point) 
  849. {
  850. CToolBar::OnLButtonUp(nFlags, point);
  851. if (m_iSelected == 1)
  852. {
  853. m_iSelected =0;
  854. KillTimer(1);
  855. SetTimer(1,10,NULL);
  856. }
  857. }
  858. void CGuiToolBarWnd::OnTimer(UINT nIDEvent) 
  859. {
  860. // TODO: Add your message handler code here and/or call default
  861. CRect m_rect;
  862. CPoint pt(GetMessagePos());
  863. ScreenToClient(&pt);
  864. GetClientRect(m_rect);
  865. if (nIDEvent == 1)
  866. {
  867. if (!m_rcBtnGlobal.PtInRect(pt))
  868. {
  869. m_iSelected =0;
  870. KillTimer(1);
  871. if (!bPressDown)
  872. {
  873. InvalidateRect(m_rcBtnGlobal);
  874. UpdateWindow();
  875. }
  876. m_rcBtnGlobal.SetRectEmpty();
  877. }
  878. }
  879. CToolBar::OnTimer(nIDEvent);
  880. }
  881. //**************************************************************************
  882. int CGuiToolBarWnd::GetLastPos()
  883. {
  884. int nNumBars=(int)m_pDockBar->m_arrBars.GetSize();
  885. int m_pos=m_pDockBar->FindBar(this);
  886. for(int i=m_pos+1; i< nNumBars;i++)
  887. {
  888. if (m_pDockBar->m_arrBars[i]== NULL)
  889.     return i-1;
  890. }
  891. return -1;
  892. }
  893. //**************************************************************************
  894. int CGuiToolBarWnd::GetFirstPos()
  895. {
  896. int m_pos=m_pDockBar->FindBar(this);
  897. for(int i=m_pos; i>=0;i--)
  898. {
  899. if (m_pDockBar->m_arrBars[i]== NULL)
  900.     return i+1;
  901. }
  902. return -1;
  903. }
  904. //**************************************************************************
  905. CRect CGuiToolBarWnd::GetDockRect()
  906. {
  907. CRect rcWin;
  908. rcWin.SetRectEmpty();
  909. if(!m_pDockSite->GetControlBar(AFX_IDW_DOCKBAR_LEFT)->GetSafeHwnd())
  910. return rcWin;
  911. if(!m_pDockSite->GetControlBar(AFX_IDW_DOCKBAR_RIGHT)->GetSafeHwnd())
  912. return rcWin;
  913. if(!m_pDockSite->GetControlBar(AFX_IDW_DOCKBAR_BOTTOM)->GetSafeHwnd())
  914. return rcWin;
  915. if(!m_pDockSite->GetControlBar(AFX_IDW_DOCKBAR_TOP)->GetSafeHwnd())
  916. return rcWin;
  917. if (IsVert())
  918. if (IsLeft())
  919. m_pDockSite->GetControlBar(AFX_IDW_DOCKBAR_LEFT)->GetWindowRect(rcWin);
  920. else
  921. m_pDockSite->GetControlBar(AFX_IDW_DOCKBAR_RIGHT)->GetWindowRect(rcWin);
  922. else
  923. if(IsBottom())
  924. m_pDockSite->GetControlBar(AFX_IDW_DOCKBAR_BOTTOM)->GetWindowRect(rcWin);
  925. else
  926. m_pDockSite->GetControlBar(AFX_IDW_DOCKBAR_TOP)->GetWindowRect(rcWin);
  927. return rcWin;
  928. }
  929. //**************************************************************************
  930. int CGuiToolBarWnd::GetHiWid()
  931. {
  932. CRect rcWin;
  933. rcWin=GetDockRect();
  934. if (rcWin.IsRectEmpty())
  935. return rcWin.Width() ;
  936. if (!(m_dwStyle & CBRS_ORIENT_HORZ))
  937. {
  938. m_pDockSite->GetControlBar(AFX_IDW_DOCKBAR_LEFT)->GetWindowRect(rcWin);
  939. return rcWin.Height() ;
  940. }
  941. else
  942. {
  943. m_pDockSite->GetControlBar(AFX_IDW_DOCKBAR_TOP)->GetWindowRect(rcWin);
  944. return rcWin.Width() ;
  945. }
  946. }
  947. //**************************************************************************
  948. void CGuiToolBarWnd::SetRealSize()
  949. {
  950. CRect rcWinFrame;
  951. CRect rcThisBar;
  952. int nVisibles=0;
  953. int nThis = m_pDockBar->FindBar(this);
  954. int nFirst= GetFirstPos();
  955. int nLast=  GetLastPos();
  956. UINT m_nDockBarID = m_pDockBar->GetDlgCtrlID();
  957. int  nMaxlen=GetHiWid();
  958.     int  nLen=0; 
  959. for (int i=nFirst;i <nLast;  i++)
  960. {
  961. CGuiToolBarWnd* pBar;
  962. pBar = (CGuiToolBarWnd*) m_pDockBar->m_arrBars[i];
  963. if (HIWORD(pBar) == 0) continue; 
  964. if (!pBar->IsVisible()) continue;
  965. CRect rc;
  966. pBar->GetWindowRect(rc);
  967. if (IsVert())
  968. nLen+=rc.Height() ;
  969. else
  970. nLen+= rc.Width() ;
  971. nVisibles++;
  972. }
  973. if ( nLen > nMaxlen)
  974. {
  975. int nDif=nLen-nMaxlen;
  976. }
  977. /* if (rcThisBar.Width() > nAfterThis)
  978. {
  979. if (nVisibles > 0)
  980. nAfterThis/=nVisibles;
  981. }
  982. */
  983. }
  984. #define CX_OVERLAP  0
  985. //***************************************************************************
  986. CSize  CGuiToolBarWnd::CalcSize(TBBUTTON* pData, int nCount)
  987. {
  988. ASSERT(pData != NULL && nCount > 0);
  989. BOOL bDrow=FALSE;
  990. int  nNumDrow=0;
  991. CPoint cur(0,0);
  992. CSize sizeResult(0,0);
  993. CClientDC dc(this);
  994. int xSizeMin=32;
  995. //if(m_dwStyle & CBRS_FLOATING )  
  996. int nSizeBar=0;
  997. int nSizeBarReal=0;
  998. int nSizeHoWid=GetHiWid();
  999. DWORD dwExtendedStyle = DefWindowProc(TB_GETEXTENDEDSTYLE, 0, 0);
  1000. for (int i = 0; i < nCount; i++)
  1001. {
  1002. CRect rcButton;
  1003. GetItemRect ( i, &rcButton );
  1004. if ((pData[i].fsStyle &  TBSTYLE_SEP) &&(pData[i].idCommand!=0))
  1005. {
  1006.     if (bVertDocked || IsFloating())
  1007. {
  1008.  CWnd * pWnd =GetDlgItem(pData[i].idCommand);
  1009.  ASSERT_VALID(pWnd);
  1010.  pWnd->ShowWindow( SW_HIDE   );
  1011.  pData[i].fsState |= TBSTATE_HIDDEN;
  1012.  continue;
  1013. }
  1014. else
  1015. {
  1016. CWnd * pWnd =GetDlgItem(pData[i].idCommand);
  1017. ASSERT_VALID(pWnd);
  1018. pData[i].fsState &= ~TBSTATE_HIDDEN;
  1019. pWnd->ShowWindow( SW_SHOW   );
  1020. }
  1021. }
  1022. int cySep = pData[i].iBitmap;
  1023. cySep = cySep * 2 / 3;
  1024. CRect rci;
  1025. GetItemRect(i, &rci);
  1026. int cx=rci.Width();
  1027. xSizeMin=min(xSizeMin,cx);
  1028. if (pData[i].fsStyle & TBSTYLE_SEP)
  1029. {
  1030. // a separator represents either a height or width
  1031. if (pData[i].fsState & TBSTATE_WRAP)
  1032. sizeResult.cy = max(cur.y + m_sizeButton.cy + cySep, sizeResult.cy);
  1033. else
  1034. sizeResult.cx = max(cur.x + pData[i].iBitmap, sizeResult.cx);
  1035. }
  1036. else
  1037. {
  1038. // check for dropdown style, but only if the buttons are being drawn
  1039. if ((pData[i].fsStyle & TBSTYLE_DROPDOWN) &&
  1040. (dwExtendedStyle & TBSTYLE_EX_DRAWDDARROWS))
  1041. {
  1042. // add size of drop down
  1043. cx += (_afxDropDownWidth);
  1044. nNumDrow++;
  1045. bDrow=TRUE;
  1046. }
  1047. sizeResult.cx = max(cur.x + cx, sizeResult.cx);
  1048. sizeResult.cy = max(cur.y + m_sizeButton.cy, sizeResult.cy);
  1049. }
  1050. if (pData[i].fsStyle & TBSTYLE_SEP)
  1051. cur.x += pData[i].iBitmap;
  1052. else
  1053. cur.x += cx - CX_OVERLAP;
  1054. if (pData[i].fsState & TBSTATE_WRAP)
  1055. {
  1056. cur.x = 0;
  1057. cur.y += m_sizeButton.cy;
  1058. if (pData[i].fsStyle & TBSTYLE_SEP)
  1059. cur.y += cySep;
  1060. }
  1061. }
  1062. if (bDrow == TRUE)
  1063. {
  1064. if (bVertDocked)
  1065. {
  1066. sizeResult.cx-=_afxDropDownWidth;
  1067. sizeResult.cy+=_afxDropDownWidth-2;//*nNumDrow;
  1068. }
  1069. else
  1070. {
  1071. sizeResult.cx-=_afxDropDownWidth*nNumDrow;
  1072. }
  1073. }
  1074. else
  1075. {
  1076. if (bVertDocked)
  1077. sizeResult.cy+=_afxDropDownWidth/2;
  1078. }
  1079. return sizeResult;
  1080. }
  1081. int  CGuiToolBarWnd::WrapToolBar(TBBUTTON* pData, int nCount, int nWidth)
  1082. {
  1083. ASSERT(pData != NULL && nCount > 0);
  1084. int nResult = 0;
  1085. int x = 0;
  1086. for (int i = 0; i < nCount; i++)
  1087. {
  1088. pData[i].fsState &= ~TBSTATE_WRAP;
  1089. if (pData[i].fsState & TBSTATE_HIDDEN)
  1090. continue;
  1091. int dx, dxNext;
  1092. if (pData[i].fsStyle & TBSTYLE_SEP)
  1093. {
  1094. dx = pData[i].iBitmap;
  1095. dxNext = dx;
  1096. }
  1097. else
  1098. {
  1099. dx = m_sizeButton.cx;
  1100. dxNext = dx - CX_OVERLAP;
  1101. }
  1102. if (x + dx > nWidth)
  1103. {
  1104. BOOL bFound = FALSE;
  1105. for (int j = i; j >= 0  &&  !(pData[j].fsState & TBSTATE_WRAP); j--)
  1106. {
  1107. // Find last separator that isn't hidden
  1108. // a separator that has a command ID is not
  1109. // a separator, but a custom control.
  1110. if ((pData[j].fsStyle & TBSTYLE_SEP) &&
  1111. (pData[j].idCommand == 0) &&
  1112. !(pData[j].fsState & TBSTATE_HIDDEN))
  1113. {
  1114. bFound = TRUE; i = j; x = 0;
  1115. pData[j].fsState |= TBSTATE_WRAP;
  1116. nResult++;
  1117. break;
  1118. }
  1119. }
  1120. if (!bFound)
  1121. {
  1122. for (int j = i - 1; j >= 0 && !(pData[j].fsState & TBSTATE_WRAP); j--)
  1123. {
  1124. // Never wrap anything that is hidden,
  1125. // or any custom controls
  1126. if ((pData[j].fsState & TBSTATE_HIDDEN) ||
  1127. ((pData[j].fsStyle & TBSTYLE_SEP) &&
  1128. (pData[j].idCommand != 0)))
  1129. continue;
  1130. bFound = TRUE; i = j; x = 0;
  1131. pData[j].fsState |= TBSTATE_WRAP;
  1132. nResult++;
  1133. break;
  1134. }
  1135. if (!bFound)
  1136. x += dxNext;
  1137. }
  1138. }
  1139. else
  1140. x += dxNext;
  1141. }
  1142. return nResult + 1;
  1143. }
  1144. void   CGuiToolBarWnd::SizeToolBar(TBBUTTON* pData, int nCount, int nLength, BOOL bVert)
  1145. {
  1146. ASSERT(pData != NULL && nCount > 0);
  1147. bVert;
  1148. if (!bVert)
  1149. {
  1150. int nMin, nMax, nTarget, nCurrent, nMid;
  1151. // Wrap ToolBar as specified
  1152. nMax = nLength;
  1153. nTarget = WrapToolBar(pData, nCount, nMax);
  1154. // Wrap ToolBar vertically
  1155. nMin = 0;
  1156. nCurrent = WrapToolBar(pData, nCount, nMin);
  1157. if (nCurrent != nTarget)
  1158. {
  1159. while (nMin < nMax)
  1160. {
  1161. nMid = (nMin + nMax) / 2;
  1162. nCurrent = WrapToolBar(pData, nCount, nMid);
  1163. if (nCurrent == nTarget)
  1164. nMax = nMid;
  1165. else
  1166. {
  1167. if (nMin == nMid)
  1168. {
  1169. WrapToolBar(pData, nCount, nMax);
  1170. break;
  1171. }
  1172. nMin = nMid;
  1173. }
  1174. }
  1175. }
  1176. CSize size = CalcSize(pData, nCount);
  1177. WrapToolBar(pData, nCount, size.cx);
  1178. }
  1179. else
  1180. {
  1181. CSize sizeMax, sizeMin, sizeMid;
  1182. // Wrap ToolBar vertically
  1183. WrapToolBar(pData, nCount, 0);
  1184. sizeMin = CalcSize(pData, nCount);
  1185. // Wrap ToolBar horizontally
  1186. WrapToolBar(pData, nCount, 32767);
  1187. sizeMax = CalcSize(pData, nCount);
  1188. while (sizeMin.cx < sizeMax.cx)
  1189. {
  1190. sizeMid.cx = (sizeMin.cx + sizeMax.cx) / 2;
  1191. WrapToolBar(pData, nCount, sizeMid.cx);
  1192. sizeMid = CalcSize(pData, nCount);
  1193. if (nLength < sizeMid.cy)
  1194. {
  1195. if (sizeMin == sizeMid)
  1196. {
  1197. WrapToolBar(pData, nCount, sizeMax.cx);
  1198. return;
  1199. }
  1200. sizeMin = sizeMid;
  1201. }
  1202. else if (nLength > sizeMid.cy)
  1203. sizeMax = sizeMid;
  1204. else
  1205. return;
  1206. }
  1207. }
  1208. }
  1209. struct _AFX_CONTROLPOS
  1210. {
  1211. int nIndex, nID;
  1212. CRect rectOldPos;
  1213. };
  1214. CSize  CGuiToolBarWnd::CalcLayout(DWORD dwMode, int nLength)
  1215. {
  1216. ASSERT_VALID(this);
  1217. ASSERT(::IsWindow(m_hWnd));
  1218. if (dwMode & LM_HORZDOCK)
  1219. ASSERT(dwMode & LM_HORZ);
  1220. if (dwMode & LM_HORZ)
  1221. bVertDocked=FALSE;
  1222. else
  1223. bVertDocked=TRUE;
  1224. int nCount;
  1225. TBBUTTON* pData = NULL;
  1226. CSize sizeResult(0,0);
  1227. //BLOCK: Load Buttons
  1228. {
  1229. nCount = DefWindowProc(TB_BUTTONCOUNT, 0, 0);
  1230. if (nCount != 0)
  1231. {
  1232. int i;
  1233. pData = new TBBUTTON[nCount];
  1234. for (i = 0; i < nCount; i++)
  1235. {
  1236. _GetButton(i, &pData[i]);
  1237. }
  1238. }
  1239. }
  1240. if (nCount > 0)
  1241. {
  1242. if (!(m_dwStyle & CBRS_SIZE_FIXED))
  1243. {
  1244. BOOL bDynamic = m_dwStyle & CBRS_SIZE_DYNAMIC;
  1245. if (bDynamic && (dwMode & LM_MRUWIDTH))
  1246. SizeToolBar(pData, nCount, m_nMRUWidth);
  1247. else if (bDynamic && (dwMode & LM_HORZDOCK))
  1248. SizeToolBar(pData, nCount, 32767);
  1249. else if (bDynamic && (dwMode & LM_VERTDOCK))
  1250. SizeToolBar(pData, nCount, 0);
  1251. else if (bDynamic && (nLength != -1))
  1252. {
  1253. CRect rect; rect.SetRectEmpty();
  1254. CalcInsideRect(rect, (dwMode & LM_HORZ));
  1255. BOOL bVert = (dwMode & LM_LENGTHY);
  1256. int nLen = nLength + (bVert ? rect.Height() : rect.Width());
  1257. SizeToolBar(pData, nCount, nLen, bVert);
  1258. }
  1259. else if (bDynamic && (m_dwStyle & CBRS_FLOATING))
  1260. SizeToolBar(pData, nCount, m_nMRUWidth);
  1261. else
  1262. SizeToolBar(pData, nCount, (dwMode & LM_HORZ) ? 32767 : 0);
  1263. }
  1264. sizeResult = CalcSize(pData, nCount);
  1265. if (dwMode & LM_COMMIT)
  1266. {
  1267. _AFX_CONTROLPOS* pControl = NULL;
  1268. int nControlCount = 0;
  1269. BOOL bIsDelayed = m_bDelayedButtonLayout;
  1270. m_bDelayedButtonLayout = FALSE;
  1271. for (int i = 0; i < nCount; i++)
  1272. if ((pData[i].fsStyle & TBSTYLE_SEP) && (pData[i].idCommand != 0))
  1273. nControlCount++;
  1274. if (nControlCount > 0)
  1275. {
  1276. pControl = new _AFX_CONTROLPOS[nControlCount];
  1277. nControlCount = 0;
  1278. for(int i = 0; i < nCount; i++)
  1279. {
  1280. if ((pData[i].fsStyle & TBSTYLE_SEP) && (pData[i].idCommand != 0))
  1281. {
  1282. pControl[nControlCount].nIndex = i;
  1283. pControl[nControlCount].nID = pData[i].idCommand;
  1284. CRect rect;
  1285. GetItemRect(i, &rect);
  1286. ClientToScreen(&rect);
  1287. pControl[nControlCount].rectOldPos = rect;
  1288. nControlCount++;
  1289. }
  1290. }
  1291. }
  1292. if ((m_dwStyle & CBRS_FLOATING) && (m_dwStyle & CBRS_SIZE_DYNAMIC))
  1293. m_nMRUWidth = sizeResult.cx;
  1294. for (i = 0; i < nCount; i++)
  1295. _SetButton(i, &pData[i]);
  1296. if (nControlCount > 0)
  1297. {
  1298. for (int i = 0; i < nControlCount; i++)
  1299. {
  1300. CWnd* pWnd = GetDlgItem(pControl[i].nID);
  1301. if (pWnd != NULL)
  1302. {
  1303. CRect rect;
  1304. pWnd->GetWindowRect(&rect);
  1305. CPoint pt = rect.TopLeft() - pControl[i].rectOldPos.TopLeft();
  1306. GetItemRect(pControl[i].nIndex, &rect);
  1307. pt = rect.TopLeft() + pt;
  1308. pWnd->SetWindowPos(NULL, pt.x, pt.y, 0, 0, SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOZORDER);
  1309. }
  1310. }
  1311. delete[] pControl;
  1312. }
  1313. m_bDelayedButtonLayout = bIsDelayed;
  1314. }
  1315. delete[] pData;
  1316. }
  1317. //BLOCK: Adjust Margins
  1318. {
  1319. CRect rect; rect.SetRectEmpty();
  1320. CalcInsideRect(rect, (dwMode & LM_HORZ));
  1321. sizeResult.cy -= rect.Height();
  1322. sizeResult.cx -= rect.Width();
  1323. CSize size = CControlBar::CalcFixedLayout((dwMode & LM_STRETCH), (dwMode & LM_HORZ));
  1324. sizeResult.cx = max(sizeResult.cx, size.cx);
  1325. sizeResult.cy = max(sizeResult.cy, size.cy);
  1326. }
  1327. return sizeResult;
  1328. }
  1329. CSize  CGuiToolBarWnd::CalcFixedLayout(BOOL bStretch, BOOL bHorz)
  1330. {
  1331. DWORD dwMode = bStretch ? LM_STRETCH : 0;
  1332. dwMode |= bHorz ? LM_HORZ : 0;
  1333. return CalcLayout(dwMode);
  1334. }
  1335. CSize  CGuiToolBarWnd::CalcDynamicLayout(int nLength, DWORD dwMode)
  1336. {
  1337. if ((nLength == -1) && !(dwMode & LM_MRUWIDTH) && !(dwMode & LM_COMMIT) &&
  1338. ((dwMode & LM_HORZDOCK) || (dwMode & LM_VERTDOCK)))
  1339. {
  1340. return CalcFixedLayout(dwMode & LM_STRETCH, dwMode & LM_HORZDOCK);
  1341. }
  1342. return CalcLayout(dwMode, nLength);
  1343. }
  1344. void   CGuiToolBarWnd::_GetButton(int nIndex, TBBUTTON* pButton) const
  1345. {
  1346. CGuiToolBarWnd* pBar = (CGuiToolBarWnd*)this;
  1347. VERIFY(pBar->DefWindowProc(TB_GETBUTTON, nIndex, (LPARAM)pButton));
  1348. // TBSTATE_ENABLED == TBBS_DISABLED so invert it
  1349. pButton->fsState ^= TBSTATE_ENABLED;
  1350. }
  1351. void   CGuiToolBarWnd::_SetButton(int nIndex, TBBUTTON* pButton)
  1352. {
  1353. // get original button state
  1354. TBBUTTON button;
  1355. VERIFY(DefWindowProc(TB_GETBUTTON, nIndex, (LPARAM)&button));
  1356. // prepare for old/new button comparsion
  1357. button.bReserved[0] = 0;
  1358. button.bReserved[1] = 0;
  1359. // TBSTATE_ENABLED == TBBS_DISABLED so invert it
  1360. pButton->fsState ^= TBSTATE_ENABLED;
  1361. pButton->bReserved[0] = 0;
  1362. pButton->bReserved[1] = 0;
  1363. // nothing to do if they are the same
  1364. if (memcmp(pButton, &button, sizeof(TBBUTTON)) != 0)
  1365. {
  1366. // don't redraw everything while setting the button
  1367. DWORD dwStyle = GetStyle();
  1368. ModifyStyle(WS_VISIBLE, 0);
  1369. VERIFY(DefWindowProc(TB_DELETEBUTTON, nIndex, 0));
  1370. VERIFY(DefWindowProc(TB_INSERTBUTTON, nIndex, (LPARAM)pButton));
  1371. ModifyStyle(0, dwStyle & WS_VISIBLE);
  1372. // invalidate appropriate parts
  1373. if (((pButton->fsStyle ^ button.fsStyle) & TBSTYLE_SEP) ||
  1374. ((pButton->fsStyle & TBSTYLE_SEP) && pButton->iBitmap != button.iBitmap))
  1375. {
  1376. // changing a separator
  1377. Invalidate();
  1378. }
  1379. else
  1380. {
  1381. // invalidate just the button
  1382. CRect rect;
  1383. if (DefWindowProc(TB_GETITEMRECT, nIndex, (LPARAM)&rect))
  1384. InvalidateRect(rect);
  1385. }
  1386. }
  1387. }
  1388. BOOL CGuiToolBarWnd::IsLeft()
  1389. {
  1390. if (nDockBarAling == AFX_IDW_DOCKBAR_LEFT) return TRUE;
  1391. return FALSE;
  1392. }
  1393. BOOL CGuiToolBarWnd::IsRight()
  1394. {
  1395. if (nDockBarAling == AFX_IDW_DOCKBAR_RIGHT) return TRUE;
  1396. return FALSE;
  1397. }
  1398. BOOL CGuiToolBarWnd::IsTop()
  1399. {
  1400. if (nDockBarAling == AFX_IDW_DOCKBAR_TOP) return TRUE;
  1401. return FALSE;
  1402. }
  1403. BOOL CGuiToolBarWnd::IsBottom()
  1404. {
  1405. if (nDockBarAling == AFX_IDW_DOCKBAR_BOTTOM) return TRUE;
  1406. return FALSE;
  1407. }
  1408. BOOL CGuiToolBarWnd::IsVert()
  1409. {
  1410. if (IsLeft() || IsRight())
  1411. return TRUE;
  1412. return FALSE;
  1413. }
  1414. BOOL CGuiToolBarWnd::IsHorz()
  1415. {
  1416. if (IsTop() || IsBottom())
  1417. return TRUE;
  1418. return FALSE;
  1419. }
  1420. BOOL CGuiToolBarWnd::IsFloating()
  1421. {
  1422. if (nDockBarAling == AFX_IDW_DOCKBAR_FLOAT)
  1423. return TRUE;
  1424. return FALSE;
  1425. }
  1426. void CGuiToolBarWnd::OnMouseMove(UINT nFlags, CPoint point)
  1427. {
  1428. // TODO: Add your message handler code here and/or call default
  1429. int nCountBtn=  nCountBtn = SendMessage (TB_BUTTONCOUNT, 0, 0);
  1430. CRect rc;
  1431. if (!IsTopParentActive() || !GetTopLevelParent()->IsWindowEnabled())
  1432. return;
  1433. for (int i=0; i< nCountBtn; i++)
  1434. {
  1435. GetItemRect(i,rc);
  1436. if (GetButtonStyle(i) == TBBS_SEPARATOR)
  1437. continue;
  1438. else
  1439. {
  1440. if (rc.PtInRect(point) && m_ActualBtn != i)
  1441. {
  1442. m_ActualBtn=i;
  1443. InvalidateRect(rc,TRUE);
  1444. m_rcBtnGlobal=rc;
  1445. m_rcSaveFloat=rc;
  1446. }
  1447. if (m_ActualBtn == i)
  1448. m_rcBtnGlobal=rc;
  1449. }
  1450. }
  1451. SetTimer(1, 250, 0);
  1452. CToolBar::OnMouseMove(nFlags, point);
  1453. }