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

金融证券系统

开发平台:

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 "GuiWorkTab.h"
  15. #include "GuiBaseTab.h"
  16. #include "resource.h"
  17. #include "GuiToolButton.h"
  18. #ifdef _DEBUG
  19. #undef THIS_FILE
  20. static char THIS_FILE[]=__FILE__;
  21. #define new DEBUG_NEW
  22. #endif
  23. #define ID_WTABSPIN 501
  24. #define ID_SCROLLWINDOW 502
  25. //////////////////////////////////////////////////////////////////////
  26. // Construction/Destruction
  27. //////////////////////////////////////////////////////////////////////
  28. #define MIN_SCROLL ::GetSystemMetrics(SM_CXHSCROLL)*2
  29. CGuiWorkTab::CGuiWorkTab()
  30. {
  31. SetStyle(CGuiTabWnd::SHADOW);
  32. // Modified By SunZhenyu
  33. if( !m_cfont.CreateStockObject( DEFAULT_GUI_FONT ) )
  34. m_cfont.CreateStockObject( ANSI_VAR_FONT );
  35. // m_cfont.CreateFont(14,0,0,0,400,0,0,0,0,1,2,1,34,"Arial");
  36. m_deplaza=0;
  37. m_btndesplaza.SetRectEmpty();
  38. bIniciaArrastre=FALSE;
  39. m_EnableL=FALSE;
  40. m_EnableR=FALSE;
  41. }
  42. CGuiWorkTab::~CGuiWorkTab()
  43. {
  44. }
  45. BEGIN_MESSAGE_MAP(CGuiWorkTab,CGuiTabWnd)
  46. ON_WM_HSCROLL()
  47. ON_WM_LBUTTONDOWN()
  48. ON_WM_LBUTTONUP()
  49. ON_WM_MOUSEMOVE()
  50. ON_WM_SETCURSOR()
  51. ON_WM_SYSCOLORCHANGE()
  52. ON_COMMAND(ID_SPINIZ,OnSpiNiz)
  53. ON_COMMAND(ID_SPINDE,OnSpiNde)
  54. END_MESSAGE_MAP()
  55. void CGuiWorkTab::PintaSeparador(CDC* dc)
  56. {
  57. CRect m_rClient=m_rectTab;
  58. //se pinta el boton de desplazamiento
  59. if (m_btndesplaza.IsRectNull())
  60. {
  61.    /*Modified By SunZhenyu 2003/6/21
  62.    m_rClient.left=m_rClient.Width()/2;
  63.    */
  64.    m_rClient.left=5*m_rClient.Width()/6;
  65.    m_rClient.top-=3;
  66.    m_rClient.left-=5;
  67.    m_rClient.right=m_rClient.left+5;
  68.    m_rClient.bottom-=1;
  69.    m_btndesplaza=m_rClient;
  70.    m_scroll.SetWindowPos(NULL,m_btndesplaza.right ,m_rectTab.top,m_rectTab.right-(m_rClient.left+5),m_rectTab.Height()-1,SWP_NOACTIVATE|SWP_NOCOPYBITS);         
  71.       m_scroll.Invalidate();
  72.    m_scroll.UpdateWindow();
  73.    return;
  74. }
  75. else
  76. {
  77. CRect rcCli;
  78. GetClientRect(&rcCli);
  79.       if (m_btndesplaza.left+40 > rcCli.right)
  80. {
  81. m_btndesplaza.left= rcCli.right-40;
  82. m_btndesplaza.right=m_btndesplaza.left+5;
  83. }
  84. m_btndesplaza.top=m_rectTab.top;
  85. m_btndesplaza.bottom=m_rectTab.bottom;
  86. m_rClient=m_btndesplaza;
  87. }
  88. if (!bIniciaArrastre)
  89. {
  90. dc->Draw3dRect(m_rClient, ::GetSysColor(BLACK_PEN),
  91.   ::GetSysColor(COLOR_BTNHIGHLIGHT));
  92. m_rClient.DeflateRect(1,1);
  93. dc->Draw3dRect(m_rClient, ::GetSysColor(COLOR_BTNHIGHLIGHT),
  94.   ::GetSysColor(COLOR_BTNSHADOW));
  95. }
  96. }
  97. void CGuiWorkTab::OnSpiNiz()
  98. {
  99. if(m_EnableL==TRUE)
  100. {
  101.  m_PresLeft=TRUE;
  102.  m_PresRight=FALSE;
  103.  m_deplaza+=20;
  104.  CClientDC dc(this);
  105.  Drawtabs(&dc);
  106. }
  107. }
  108. void CGuiWorkTab::OnSpiNde()
  109. {
  110. if(m_EnableR==TRUE)
  111. {
  112. m_PresLeft=FALSE;
  113. m_PresRight=TRUE;
  114. m_deplaza-=20; 
  115. CClientDC dc(this);
  116. Drawtabs(&dc);
  117. }
  118. }
  119. // Modified By SunZhenyu, 2003/10/28, add the next function
  120. void CGuiWorkTab::ResetDeplaza( )
  121. {
  122. m_btndesplaza.SetRectEmpty();
  123. }
  124. void CGuiWorkTab::Drawtabs(CDC* dc)
  125. {
  126. int m_StrPos=0;
  127. BOOL m_ViewAlltab=TRUE;
  128. CRect m_rClient;
  129. CBrush cbr;
  130. CPen cp(PS_SOLID,1,::GetSysColor(COLOR_BTNSHADOW));
  131. int m_ianchoScroll=::GetSystemMetrics (SM_CXHSCROLL) * 2;
  132. m_EnableR=TRUE;
  133. m_EnableL=TRUE;
  134. cbr.CreateSolidBrush(m_wd.GetRGBColorXP());
  135. GetClientRect(m_rClient);
  136. CRect rectT=m_rectTab;
  137. rectT.right=m_btndesplaza.left;
  138. rectT.right+=4;
  139. dc->FillRect(rectT,&cbr);
  140. CPen *pOldPen = dc->SelectObject(&cp);
  141. dc->MoveTo(m_rectTab.left,m_rectTab.top);
  142. dc->LineTo(m_btndesplaza.right+1,m_rectTab.top);
  143. dc->Draw3dRect(m_rClient, ::GetSysColor(COLOR_BTNSHADOW),
  144.                   ::GetSysColor(COLOR_BTNHIGHLIGHT));
  145. if (!::IsWindow(m_mSpin.GetSafeHwnd()))
  146. {
  147. CRect r=m_rectTab;
  148. r.right=r.left+35;
  149. r.top+=1;
  150. r.bottom-=1;
  151. if (!m_mSpin.Create(_T(""),WS_VISIBLE | WS_CHILD |SS_OWNERDRAW, 
  152. r, this))
  153. m_mSpin.AlingButtons(CGuiMiniTool::ALIGN_LEFT);
  154. m_mSpin.SetColor(GuiDrawLayer::GetRGBColorFace());
  155. m_mSpin.SetImageList(IDB_DOCKBAR, 9,10, RGB(255,0,255));
  156. m_mSpin.AddButton(4,ID_SPINIZ,NULL,_T(""),"Left");
  157. m_mSpin.AddButton(2,ID_SPINDE,NULL,_T(""),"Right");
  158. m_mSpin.AutoSize(TRUE);
  159. m_mSpin.SetBorder(CGuiMiniTool::STYLEFRAME);
  160. CGuiToolButton* btn=m_mSpin.GetButton(ID_SPINIZ);
  161. btn->ShowDark(FALSE);
  162. btn=m_mSpin.GetButton(ID_SPINDE);
  163. btn->ShowDark(FALSE);
  164. }
  165. if (!::IsWindow(m_scroll.GetSafeHwnd()))
  166. {
  167. m_scroll.Create(WS_VISIBLE|WS_CHILD|UDS_HORZ,m_rectTab,this,ID_SCROLLWINDOW);
  168. }
  169. CRect rcSpin;
  170. m_mSpin.GetClientRect(rcSpin);m_StrPos=rcSpin.Width();
  171. if ((m_btndesplaza.left < rcSpin.right) && ! m_btndesplaza.IsRectEmpty())
  172. {
  173. m_btndesplaza.left=rcSpin.right+5;
  174. m_btndesplaza.right=m_btndesplaza.left+5;
  175. }
  176. PintaSeparador(dc);
  177. int m_Space=8;
  178. int m_Pos=10;
  179. int m_right=m_StrPos;
  180. if (m_iMinValRec-26 > m_btndesplaza.left) //No existe suficioente espacio para los tabs
  181. {
  182. m_ViewAlltab=FALSE;
  183. //m_spin.EnableScrollBar();
  184. if (m_PresLeft==TRUE)
  185. m_right+=m_deplaza;
  186. if (m_PresRight==TRUE)
  187. m_right+=m_deplaza;
  188. if (m_deplaza == 0)
  189. {
  190. m_EnableL=FALSE;
  191. m_EnableR=TRUE;
  192. ;//m_spin.EnableScrollBar(ESB_DISABLE_LTUP);
  193. }
  194. if ((m_iMinValRec+m_deplaza)-26 <= m_btndesplaza.left)
  195. {
  196. ;//m_spin.EnableScrollBar(ESB_DISABLE_RTDN);
  197. m_EnableR=FALSE;
  198. m_EnableL=TRUE;
  199. }
  200. }
  201. else
  202. {
  203. m_EnableL=FALSE;
  204. m_EnableR=FALSE;
  205. //m_spin.EnableScrollBar(ESB_DISABLE_BOTH);
  206. m_ViewAlltab=TRUE;
  207. m_deplaza=0;
  208. }
  209. CRect rectScroll; 
  210. CRgn reg;
  211. CRect rectRecorte;
  212. rectRecorte.left=m_rectTab.left+m_ianchoScroll;
  213. rectRecorte.top=m_rectTab.top;
  214. rectRecorte.bottom=m_rectTab.bottom;
  215. rectRecorte.right=m_btndesplaza.left;
  216. reg.CreateRectRgnIndirect(rectRecorte);
  217. dc->SelectClipRgn(&reg);
  218. for ( int iCont=0; iCont< m_Numtabs;iCont++)
  219. {
  220. //;
  221. CGuiTab* ctb=(CGuiTab*)m_pArray[iCont];
  222. CRect mrt=ctb->rect;
  223. int ancho=mrt.Width();
  224. mrt.left=m_right;
  225. mrt.right=mrt.left+ancho;
  226. CPoint Coor[4];
  227. //dibujar la hoja seleccionada
  228. if (iCont == 0 )
  229. {
  230. dc->MoveTo(mrt.left,mrt.top);
  231. dc->LineTo((mrt.left)+m_rectTab.Height()/2,mrt.bottom-1);
  232. dc->MoveTo((mrt.left)+m_rectTab.Height()/2,mrt.bottom-1);
  233. dc->LineTo((mrt.right)-m_rectTab.Height()/2,mrt.bottom-1);
  234. dc->MoveTo((mrt.right)-m_rectTab.Height()/2,mrt.bottom-1);
  235. if (m_iSelectTab ==iCont)
  236. dc->LineTo(mrt.right-2,mrt.top+2);
  237. else
  238. dc->LineTo((mrt.right)-3,mrt.top+(m_rectTab.Height()/2));
  239. m_right=mrt.right;
  240. }
  241. else
  242. {
  243. //Se dibuja la hoja siguiente a la seleccionada
  244. //no se dibuja toda la diagonal y no es la ultima hoja
  245. if (iCont-1 == m_iSelectTab ) 
  246. {
  247. dc->MoveTo(mrt.left+(m_rectTab.Height()/4)+1,mrt.top+m_rectTab.Height()/2);
  248. dc->LineTo((mrt.left)+m_rectTab.Height()/2,mrt.bottom-1);
  249. dc->MoveTo((mrt.left)+m_rectTab.Height()/2,mrt.bottom-1);
  250. dc->LineTo((mrt.right)-m_rectTab.Height()/2,mrt.bottom-1);
  251. dc->MoveTo((mrt.right)-m_rectTab.Height()/2,mrt.bottom-1);
  252. if (iCont == m_Numtabs-1)
  253. dc->LineTo((mrt.right-2),mrt.top+2);
  254. else
  255. dc->LineTo((mrt.right)-3,mrt.top+(m_rectTab.Height()/2));
  256. }
  257. else
  258. {
  259. dc->MoveTo(mrt.left,mrt.top);
  260. dc->LineTo((mrt.left)+m_rectTab.Height()/2,mrt.bottom-1);
  261. dc->MoveTo((mrt.left)+m_rectTab.Height()/2,mrt.bottom-1);
  262. dc->LineTo((mrt.right)-m_rectTab.Height()/2,mrt.bottom-1);
  263. dc->MoveTo((mrt.right)-m_rectTab.Height()/2,mrt.bottom-1);
  264. if (iCont == m_iSelectTab || iCont == m_Numtabs-1 )
  265. dc->LineTo((mrt.right-2),mrt.top+2);
  266. else
  267. dc->LineTo((mrt.right)-3,mrt.top+3+(m_rectTab.Height()/2));
  268. }
  269. m_right=mrt.right;
  270. }
  271. if (iCont == m_iSelectTab )
  272. {
  273. Coor[0].x=mrt.left;
  274. Coor[0].y=mrt.top;
  275. Coor[1].x=(mrt.left)+m_rectTab.Height()/2;
  276. Coor[1].y=mrt.bottom-1;
  277. Coor[2].x=(mrt.right)-m_rectTab.Height()/2; 
  278. Coor[2].y=mrt.bottom-1;
  279. Coor[3].x=(mrt.right-1);
  280. Coor[3].y=mrt.top+3;
  281. /* Modified By SunZhenyu, 2003/11/7, add the next 2 line */
  282. CBrush brush( m_clrSelectTabBK );
  283. CBrush * pOldBrush = dc->SelectObject( &brush );
  284. dc->Polygon(Coor,4);
  285. /* Modified By SunZhenyu, 2003/11/7, add the next 1 line */
  286. dc->SelectObject( pOldBrush );
  287. dc->SelectStockObject(WHITE_PEN);
  288. dc->MoveTo(mrt.left+3,mrt.top+3);
  289. dc->LineTo(mrt.right-1,mrt.top+3);
  290. dc->MoveTo(mrt.left+2,mrt.top+2);
  291. dc->LineTo(mrt.right,mrt.top+2);
  292. dc->SelectObject(&cp);
  293. /* Modified By SunZhenyu, 2003/11/9, add the next 1 line */
  294. dc->SetTextColor(m_clrSelectTabText);
  295. }
  296. else
  297. /* Modified By SunZhenyu, 2003/11/9, add the next 1 line */
  298. dc->SetTextColor(::GetSysColor(COLOR_BTNTEXT));
  299. CFont* m_fontOld=dc->SelectObject(&m_cfont);
  300. dc->SetBkMode(TRANSPARENT);
  301. CRect mrtt=mrt; mrtt.top+=2;
  302. dc->DrawText(ctb->lpMsg,mrtt,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
  303. // Modified By SunZhenyu
  304. dc->SelectObject(m_fontOld);
  305. ctb->rect=mrt;
  306. m_right-=(m_rectTab.Height()/2);
  307. if (!bIniciaArrastre)
  308. {
  309. CRect m_rectCli;
  310. GetClientRect(m_rectCli);
  311. if (m_btndesplaza.left <m_rectCli.left+rcSpin.left+1)
  312. {
  313. m_btndesplaza.left=m_rectCli.left+rcSpin.left+5;
  314. m_btndesplaza.right=m_btndesplaza.left+5;
  315. PintaSeparador(dc);
  316. }
  317. m_scroll.SetWindowPos(NULL,m_btndesplaza.right ,m_rectTab.top,m_rectCli.right-(m_btndesplaza.left+5),m_rectTab.Height()-1,SWP_NOACTIVATE|SWP_NOCOPYBITS);         
  318. m_scroll.Invalidate();
  319. m_scroll.UpdateWindow();
  320. m_mSpin.SetWindowPos(NULL,m_rectTab.left,m_rectTab.top,m_ianchoScroll,m_rectTab.Height()-2,SWP_NOACTIVATE|SWP_NOZORDER);
  321. }
  322. }
  323. dc->SelectClipRgn(NULL);
  324. // Modified By SunZhenyu
  325. dc->SelectObject(pOldPen);
  326. m_mSpin.Invalidate();
  327. m_mSpin.UpdateWindow();
  328. }
  329. void CGuiWorkTab::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
  330. {
  331. // TODO: Add your message handler code here and/or call default
  332. CWnd::OnHScroll(nSBCode, nPos, pScrollBar);
  333. /*Modified By SunZhenyu 2003/10/22, Remove the next 1 line
  334. if (pScrollBar == (CScrollBar*)&m_scroll )
  335. */
  336. {
  337. CGuiTab* ct=(CGuiTab*) m_pArray[m_iSelectTab];
  338. CWnd* ViewAc=ct->pParent;
  339. int rangmin,rangMax;
  340. ViewAc->SendMessage(WM_HSCROLL,MAKEWPARAM(nSBCode,nPos));
  341. ViewAc->GetScrollRange(SB_HORZ,&rangmin,&rangMax);
  342. m_scroll.SetScrollRange(rangmin,rangMax);
  343. m_scroll.SetScrollPos(ViewAc->GetScrollPos(SB_HORZ));
  344. return;
  345. }
  346.     CClientDC dc(this);
  347. Drawtabs(&dc);
  348. }
  349. BOOL CGuiWorkTab::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
  350. {
  351. CPoint ptCurPos;
  352. GetCursorPos (&ptCurPos);
  353. ScreenToClient (&ptCurPos);
  354. if (m_btndesplaza.PtInRect (ptCurPos))
  355. {
  356. SetCursor (LoadCursor(NULL, IDC_SIZEWE));
  357. return TRUE;
  358. }
  359. return CGuiTabWnd::OnSetCursor(pWnd, nHitTest, message);
  360. }
  361. void CGuiWorkTab::OnLButtonDown(UINT nFlags, CPoint point) 
  362. {
  363. // TODO: Add your message handler code here and/or call default
  364. if (m_btndesplaza.PtInRect(point) && !bIniciaArrastre)
  365. {
  366. bIniciaArrastre=TRUE;
  367. SetCapture ();
  368. InvalidateRect(m_btndesplaza,TRUE);
  369. }
  370. else CGuiTabWnd::OnLButtonDown(nFlags, point);
  371. }
  372. void CGuiWorkTab::OnLButtonUp(UINT nFlags, CPoint point) 
  373. {
  374. if (bIniciaArrastre==TRUE)
  375. {
  376. bIniciaArrastre=FALSE;
  377. int iDiferencia=m_rectTab.right-31;
  378. if (point.x < m_rectTab.left+31) point.x=m_rectTab.left+31;
  379. if (point.x > iDiferencia ) point.x= iDiferencia;
  380. m_btndesplaza.left=point.x;
  381. m_btndesplaza.right=m_btndesplaza.left+5;
  382. ReleaseCapture ();
  383. Invalidate();
  384. UpdateWindow();
  385. }
  386. CGuiTabWnd::OnLButtonUp(nFlags, point);
  387. }
  388. void CGuiWorkTab::OnMouseMove(UINT nFlags, CPoint point)
  389. {
  390. CRect m_rectCli;
  391. GetClientRect(m_rectCli);
  392.     if (bIniciaArrastre==TRUE)
  393.     {
  394. int iDiferencia=m_rectCli.right-31;
  395. if (point.x < m_rectTab.left+31) point.x=m_rectTab.left+31;
  396. if (point.x > iDiferencia ) point.x= iDiferencia;
  397. m_scroll.SetWindowPos(NULL,point.x ,m_rectTab.top,m_rectCli.right-point.x,m_rectTab.Height()-1, SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOCOPYBITS);         
  398. m_scroll.Invalidate();
  399. m_scroll.UpdateWindow();
  400. m_btndesplaza.left=point.x;
  401. m_rectCli=m_btndesplaza;
  402. m_rectCli.left-=5;
  403. InvalidateRect(m_btndesplaza,TRUE);
  404. UpdateWindow();
  405. }
  406. else
  407. CGuiTabWnd::OnMouseMove(nFlags, point);
  408. }
  409. void CGuiWorkTab::OnSysColorChange() 
  410. {
  411. CGuiTabWnd::OnSysColorChange();
  412. Invalidate ();
  413. UpdateWindow ();
  414. }