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

对话框与窗口

开发平台:

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.  * -Ernesto Garcia *
  21.  * -Serge Koroleuve  *
  22.  ****************************************************************************/
  23. #include "stdafx.h"
  24. #include "GuiTabWnd.h"
  25. #include "GuiBasetab.h"
  26. #include "resource.h"
  27. #ifdef _DEBUG
  28. #define new DEBUG_NEW
  29. #undef THIS_FILE
  30. static char THIS_FILE[] = __FILE__;
  31. #endif
  32. /////////////////////////////////////////////////////////////////////////////
  33. // CGuiTabWnd
  34. #define  SPACE_TAB 4
  35. #define  DEFAULT_FLAT 18
  36. CGuiTabWnd::CGuiTabWnd()
  37. {
  38. m_rectCliente.SetRectEmpty();
  39. m_rectTab.SetRectEmpty();
  40. m_ActualVar=0;
  41. m_Numtabs=0;
  42. m_iSelectTab=0;
  43. m_sizeImag=CSize(15,15);
  44. m_pArray.RemoveAll();
  45. m_iMinValRec=0;  //minimo valor requerido para mostrar toda las carpetas
  46. m_cfont.CreateFont(-11,0,0,0,400,0,0,0,0,1,2,1,34,"MS Sans Serif");
  47. m_cfontBold.CreateFont(-11,2,0,0,FW_BOLD,0,0,0,0,1,2,1,34,"MS Sans Serif");
  48. m_style=S3D;
  49. m_ActualTitle=TRUE;
  50. m_alnTab=ALN_BOTTOM;
  51. m_TypeTab=TYPE_NORMAL;
  52. m_StyleDisplay=GUISTYLE_XP;
  53. }
  54. CGuiTabWnd::~CGuiTabWnd()
  55. {
  56. m_pArray.RemoveAll();
  57. }
  58. BEGIN_MESSAGE_MAP(CGuiTabWnd, CWnd)
  59. //{{AFX_MSG_MAP(CGuiTabWnd)
  60. ON_WM_ERASEBKGND()
  61. ON_WM_PAINT()
  62. ON_WM_CREATE()
  63. ON_WM_SIZE()
  64. ON_WM_LBUTTONDOWN()
  65. ON_WM_SYSCOLORCHANGE()
  66. ON_WM_RBUTTONDOWN()
  67. //}}AFX_MSG_MAP
  68. ON_WM_DESTROY()
  69. END_MESSAGE_MAP()
  70. /////////////////////////////////////////////////////////////////////////////
  71. // CGuiTabWnd message handlers
  72. BOOL CGuiTabWnd::PreTranslateMessage(MSG* pMsg) 
  73. {
  74. // TODO: Add your specialized code here and/or call the base class
  75. if (pMsg->message == WM_MOUSEMOVE)
  76. CToolTip.RelayEvent(pMsg);
  77. return CWnd::PreTranslateMessage(pMsg);
  78. }
  79. //****************************************************************************
  80. void CGuiTabWnd::OnSysColorChange( )
  81. {
  82. CWnd::OnSysColorChange( );
  83. }
  84. void CGuiTabWnd::SetTypeTab(TypeTab Type)
  85. {
  86. m_TypeTab=Type;
  87. }
  88. //****************************************************************************
  89. BOOL CGuiTabWnd::OnEraseBkgnd(CDC* pDC) 
  90. {
  91. // TODO: Add your message handler code here and/or call default
  92. if (m_Numtabs == 0)
  93. {
  94. CBrush cbr;
  95. cbr.CreateSysColorBrush(GuiDrawLayer::GetRGBColorFace(m_StyleDisplay));
  96. CRect m_rect;
  97. GetClientRect(m_rect);
  98. pDC->FillRect(m_rect,&cbr);
  99. cbr.DeleteObject();
  100. }
  101. return TRUE;
  102. }
  103. void CGuiTabWnd::SetActualTitle(BOOL bActual)
  104. {
  105. m_ActualTitle=bActual;
  106. }
  107. void CGuiTabWnd::SetALingTabs(AlingTab alnTab)
  108. {
  109. m_alnTab=alnTab;
  110. Invalidate();
  111. UpdateWindow();
  112. }
  113. void CGuiTabWnd::OnPaint() 
  114. {
  115. CPaintDC dc(this); // device context for painting
  116. if (m_Numtabs <=0) return;
  117. CBrush cbr;
  118. CRect m_rectDraw;
  119. CGuiTab* ct=(CGuiTab*) m_pArray[m_iSelectTab];
  120. if (m_alnTab!=ALN_TOP)
  121. cbr.CreateSolidBrush((GuiDrawLayer::m_Style== GUISTYLE_XP)?GuiDrawLayer::GetRGBColorTabs(): ct->m_clrHtab);
  122. else
  123. cbr.CreateSolidBrush(GuiDrawLayer::m_Style == GUISTYLE_XP?GuiDrawLayer::GetRGBColorFace(GuiDrawLayer::m_Style):ct->m_clrHtab);
  124. GetClientRect(m_rectCliente);
  125. m_rectTab=m_rectCliente;
  126. m_rectDraw=m_rectCliente;
  127. if (m_alnTab==ALN_BOTTOM)
  128. m_rectDraw.bottom=m_rectCliente.bottom-(m_sizeImag.cy+SPACE_TAB+2);
  129. else
  130. m_rectDraw.top=m_rectCliente.top+(m_sizeImag.cy+SPACE_TAB+2);
  131. if (m_style != S3D) //si son carpetas estilo excel o tabbed como devstudio 7
  132. {
  133. if (m_alnTab==ALN_BOTTOM)
  134. {
  135. m_rectCliente.bottom=m_rectCliente.bottom-(DEFAULT_FLAT);
  136. m_rectTab.top=m_rectCliente.bottom+2;
  137. }
  138. else
  139. {
  140. m_rectTab.bottom=m_rectCliente.top+(DEFAULT_FLAT)+3;
  141. }
  142. }
  143. if (m_alnTab!=ALN_TOP)
  144. {
  145. dc.FillRect(m_rectTab,&cbr);
  146. m_rectDraw.left+=1;
  147. dc.Draw3dRect(m_rectDraw,GuiDrawLayer::GetRGBColorShadow(GuiDrawLayer::m_Style),GuiDrawLayer::GetRGBColorShadow(GuiDrawLayer::m_Style));
  148. if (GuiDrawLayer::m_Style!= GUISTYLE_XP)
  149. {
  150. //eliminar la linea inferior
  151. m_rectDraw.top=m_rectDraw.bottom-1;
  152. m_rectDraw.left+=1;
  153. m_rectDraw.right-=1;
  154. dc.Draw3dRect(m_rectDraw,ct->m_clrHtab,ct->m_clrHtab);
  155. }
  156. m_rectDraw.left-=1;
  157. }
  158. else
  159. {
  160. CRect rc=m_rectDraw;
  161. for (int i=0; i< 2; i++)
  162. {
  163. dc.Draw3dRect(rc,GuiDrawLayer::GetRGBColorFace(GuiDrawLayer::m_Style),GuiDrawLayer::GetRGBColorFace(GuiDrawLayer::m_Style));
  164. rc.DeflateRect(1,1);
  165. }
  166. rc.InflateRect(3,3);
  167. dc.Draw3dRect(m_rectDraw,GuiDrawLayer::GetRGBColorShadow(GuiDrawLayer::m_Style),GuiDrawLayer::GetRGBColorShadow(GuiDrawLayer::m_Style));
  168. rc=m_rectDraw;
  169. rc.bottom=rc.top+3;
  170. dc.FillRect(rc,&cbr);
  171. }
  172. cbr.DeleteObject ();
  173. Drawtabs(&dc);
  174. }
  175. BOOL CGuiTabWnd::Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID) 
  176. {
  177. // TODO: Add your specialized code here and/or call the base class
  178. pParent= pParentWnd;
  179. return CWnd::Create(NULL, _T(""), dwStyle |WS_CLIPSIBLINGS|WS_CLIPCHILDREN, rect, pParentWnd, nID);
  180. }
  181. int CGuiTabWnd::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  182. {
  183. if (CWnd::OnCreate(lpCreateStruct) == -1)
  184. return -1;
  185. CToolTip.Create(this,TTS_ALWAYSTIP);
  186. CToolTip.Activate(TRUE);
  187. CToolTip.BringWindowToTop();
  188. // TODO: Add your specialized creation code here
  189. return 0;
  190. }
  191. void CGuiTabWnd::RecalLayout()
  192. {
  193. GetClientRect(m_rectCliente);
  194. m_rectCliente.DeflateRect(1,1);
  195. if (m_style == S3D)
  196. {
  197. m_rectCliente.bottom=m_rectCliente.bottom-(m_sizeImag.cy+SPACE_TAB+1);
  198. }
  199. else
  200. {
  201. if (m_alnTab==ALN_BOTTOM)
  202. m_rectCliente.bottom=m_rectCliente.bottom-(DEFAULT_FLAT);
  203. else
  204. {
  205. m_rectCliente.top+=DEFAULT_FLAT;
  206. m_rectCliente.bottom=m_rectCliente.bottom-(DEFAULT_FLAT+4);
  207. }
  208. }
  209. for (int iCont=0; iCont< m_Numtabs;iCont++)
  210. {
  211. CGuiTab* ct=(CGuiTab*) m_pArray[iCont];
  212. CWnd* m_tempWin= ct->pParent;
  213. ASSERT_VALID(m_tempWin);
  214. if (m_style == S3D)
  215. {
  216.    m_tempWin->SetWindowPos(NULL,m_rectCliente.left+(SPACE_TAB-2),
  217.    m_rectCliente.top+(SPACE_TAB/2),m_rectCliente.right-(SPACE_TAB+1),
  218.    m_rectCliente.bottom-(SPACE_TAB+2),SWP_NOACTIVATE|
  219.    SWP_NOZORDER);
  220. }
  221. else
  222. {
  223. if (m_alnTab==ALN_BOTTOM)
  224. {
  225.    m_tempWin->SetWindowPos(NULL,m_rectCliente.left+(SPACE_TAB-3),
  226.    m_rectCliente.top+1,m_rectCliente.right-2,
  227.    m_rectCliente.bottom+1,SWP_NOACTIVATE|SWP_NOZORDER);
  228. }
  229. else
  230. if (m_TypeTab == TYPE_NORMAL)
  231. {
  232.   m_tempWin->SetWindowPos(NULL,m_rectCliente.left+(SPACE_TAB-3),
  233.   m_rectCliente.top+3,m_rectCliente.right-2,
  234.   m_rectCliente.bottom,SWP_NOACTIVATE|SWP_NOZORDER);
  235. }
  236. }
  237. }
  238. }
  239. AjustTabs();
  240. Invalidate();
  241. UpdateWindow();
  242. }
  243. void CGuiTabWnd::AjustTabs()
  244. {
  245. int m_iSizeAct=0;
  246. m_iMinValRec=4;
  247. CClientDC dc(this);
  248. GetClientRect(m_rectCliente);
  249. if (m_alnTab==ALN_BOTTOM)
  250. m_rectCliente.bottom=m_rectCliente.bottom-(m_sizeImag.cy+SPACE_TAB+1);
  251. else
  252. m_rectCliente.bottom=m_rectCliente.top+(m_sizeImag.cy+SPACE_TAB+1);
  253. CFont* m_fontOld=dc.SelectObject(&m_cfont);
  254. for (int iCont=0; iCont< m_Numtabs;iCont++)
  255. {
  256. CGuiTab* ct=(CGuiTab*) m_pArray[iCont];
  257. CRect m_Arect;
  258. CSize m_sChar=dc.GetTextExtent(ct->lpMsg);
  259. m_Arect.left=m_iMinValRec+1;
  260. m_iMinValRec+=m_alnTab!=ALN_TOP?m_sizeImag.cx+2+m_sChar.cx+14:m_sChar.cx+14;
  261. if(m_alnTab==ALN_BOTTOM)
  262. {
  263. m_Arect.top=m_rectCliente.bottom;
  264. m_Arect.right=m_iMinValRec;
  265. m_Arect.bottom=m_rectCliente.bottom+4+m_sizeImag.cy;
  266. }
  267. else
  268. {
  269. m_Arect.top=m_rectCliente.top;
  270. m_Arect.right=m_iMinValRec+ (iCont ==m_iSelectTab?10:0);
  271. m_Arect.bottom=m_rectCliente.top+4+m_sizeImag.cy;
  272. }
  273. ct->rect= m_Arect;
  274. }
  275. dc.SelectObject(m_fontOld);
  276. //si el espacio requerido es mayor que el disponible
  277. //se debe proporcionar cada tab solo si es 3d
  278. if (m_style== S3D)
  279. {
  280. int m_NewResize=4;
  281. if (m_iMinValRec > m_rectCliente.Width()-4)
  282. {
  283. m_iSizeAct=(m_rectCliente.Width()-12)/m_Numtabs;
  284. for (int iCont=0; iCont< m_Numtabs;iCont++)
  285. {
  286. CGuiTab* ct=(CGuiTab*) m_pArray[iCont];
  287. CRect m_Arect;
  288. m_Arect.left=m_NewResize;
  289. m_Arect.right=m_NewResize+m_iSizeAct;
  290. m_Arect.top=m_rectCliente.bottom;
  291. m_Arect.bottom=m_rectCliente.bottom+4+m_sizeImag.cy;
  292. m_NewResize+=m_iSizeAct+1;
  293. ct->rect= m_Arect;
  294. }
  295. }
  296. }
  297. }
  298. void CGuiTabWnd::Drawtabs(CDC* dc)
  299. {
  300. CPen light(PS_SOLID,1,GetSysColor(COLOR_BTNHIGHLIGHT));
  301. CPen Dark(PS_SOLID,1,GuiDrawLayer::GetRGBColorShadow(m_StyleDisplay));
  302. CPen Black(PS_SOLID,1,GetSysColor(BLACK_PEN));
  303. CPen pPress(PS_SOLID,1,GuiDrawLayer::GetRGBCaptionXP());
  304. CRect rectText;
  305. CFont* m_fontOld=dc->SelectObject(&m_cfont);
  306. CPen* oldPen= dc->SelectObject(&light);
  307. CString szStrPoints=_T("...");
  308. CRect rcClient;
  309. GetClientRect(rcClient);
  310. if(m_StyleDisplay== GUISTYLE_2003)
  311. {
  312. CGuiTab* ct=(CGuiTab*) m_pArray[m_iSelectTab];
  313. CGradient M(CSize(m_rectTab.Width(),ct->rect.Height()+1));
  314. M.PrepareReverseVertTab(dc,m_StyleDisplay);
  315. M.Draw(dc,0,m_rectTab.bottom-ct->rect.Height(),0,0,m_rectTab.Width(),ct->rect.Height(),SRCCOPY);
  316. dc->LineTo(m_rectTab.left, m_rectTab.bottom+3);
  317. dc->MoveTo(m_rectTab.right, m_rectTab.bottom+3);
  318. }
  319. for (int iCont=0; iCont< m_Numtabs;iCont++)
  320. {
  321. CGuiTab* ct=(CGuiTab*) m_pArray[iCont];
  322. //si es la carpeta seleccionada, se debe 
  323. //eliminar las lineas oscuras de encima
  324. if(m_StyleDisplay== GUISTYLE_2003)
  325. {
  326. CRect  m_rectTabAux=ct->rect;
  327. CGradient M(CSize(m_rectTabAux.Width(),m_rectTabAux.Height()));
  328. M.PrepareReverseColorTab(dc,GUISTYLE_2003,ct->m_clrHtab,ct->m_clrLTab); //M.PrepareTabs(dc,ct->m_clrTab); //ojo este es para pintar a color
  329. M.Draw(dc,m_rectTabAux.left+1,m_rectTabAux.top,0,0,m_rectTabAux.Width()-1,m_rectTabAux.Height()-1,SRCCOPY);
  330. CPen* pOldPen=dc->SelectObject(&Dark);
  331. if(iCont ==0)
  332. {
  333. dc->MoveTo(m_rectTabAux.left, m_rectTabAux.top);
  334. dc->LineTo(m_rectTabAux.left, m_rectTabAux.bottom-2);
  335. }
  336. dc->MoveTo(m_rectTabAux.left, m_rectTabAux.bottom-2);
  337. dc->LineTo(m_rectTabAux.left+1, m_rectTabAux.bottom-1);
  338. dc->MoveTo(m_rectTabAux.left+1, m_rectTabAux.bottom-1);
  339. dc->LineTo(m_rectTabAux.right-2,m_rectTabAux.bottom-1 );
  340. dc->MoveTo(m_rectTabAux.right-2,m_rectTabAux.bottom-1  );
  341. dc->LineTo(m_rectTabAux.right, m_rectTabAux.bottom-3);
  342. dc->MoveTo(m_rectTabAux.right, m_rectTabAux.bottom-3);
  343. dc->LineTo(m_rectTabAux.right, m_rectTabAux.top-1);
  344. if (iCont ==m_iSelectTab)
  345. {
  346. dc->MoveTo(rcClient.left, m_rectTabAux.top);
  347. dc->LineTo(m_rectTabAux.left, m_rectTabAux.top);
  348. dc->MoveTo(m_rectTabAux.right, m_rectTabAux.top-1);
  349. dc->LineTo(rcClient.right, m_rectTabAux.top-1);
  350. }
  351. dc->SelectObject(pOldPen);
  352. }
  353. if(m_StyleDisplay== GUISTYLE_XP)
  354. {
  355. if (iCont ==m_iSelectTab)
  356. {
  357. CBrush cbr;
  358. CRect  m_rectTabAux=ct->rect;
  359. m_rectTabAux.DeflateRect(1,1);
  360. m_rectTabAux.top-=4;
  361. m_rectTabAux.bottom=m_rectTabAux.top+4;
  362. cbr.CreateSysColorBrush(COLOR_BTNFACE);
  363. dc->FillRect(ct->rect,&cbr);
  364. dc->MoveTo(ct->rect.left,ct->rect.top-3);
  365. dc->LineTo(ct->rect.left,ct->rect.bottom-1);
  366. dc->FillRect(m_rectTabAux,&cbr);
  367. dc->SelectStockObject(BLACK_PEN);
  368. dc->MoveTo(ct->rect.left,ct->rect.bottom-1);
  369. dc->LineTo(ct->rect.right,ct->rect.bottom-1);
  370. //linea derecha observe que se pinta dos veces para
  371. //dar el efecto de redondeada en la puntas
  372. dc->SelectStockObject(BLACK_PEN);
  373. dc->MoveTo(ct->rect.right-1,ct->rect.top-1);
  374. dc->LineTo(ct->rect.right-1,ct->rect.bottom-1);
  375. cbr.DeleteObject();
  376. }
  377. else
  378. {
  379. if(m_StyleDisplay== GUISTYLE_XP)
  380. {
  381. if ((iCont+1) != m_iSelectTab)
  382. {
  383. CPen* pOldPen=dc->SelectObject(&Dark);
  384. dc->MoveTo(ct->rect.right-1,ct->rect.top+2);
  385. dc->LineTo(ct->rect.right-1,ct->rect.bottom-2);
  386. dc->SelectObject(pOldPen);
  387. }
  388. }
  389. }
  390. }
  391. //se dibuja el icono
  392. int nMode = dc->SetBkMode(TRANSPARENT);
  393. CSize m_sChar=dc->GetTextExtent(ct->lpMsg,strlen(ct->lpMsg));
  394. COLORREF clrtext;
  395. if (iCont !=m_iSelectTab)
  396. clrtext=dc->SetTextColor(GuiDrawLayer::GetRGBColorGrayText());
  397. if (m_sizeImag.cx+m_sChar.cx < ct->rect.Width()-8)  
  398. {
  399. Image.Draw(dc,ct->uIcon,CPoint(ct->rect.left+2,ct->rect.top+2),ILD_TRANSPARENT);
  400. rectText=ct->rect;
  401. rectText.left+=m_sizeImag.cx+8;
  402. rectText.right-=2;
  403. dc->DrawText(ct->lpMsg,rectText,DT_SINGLELINE|DT_LEFT|DT_VCENTER);
  404. CToolTip.SetToolRect(this,iCont+1,CRect(0,0,0,0));
  405. }
  406. else
  407. {
  408. //verificamos si se puede poner algun texto o
  409. //por lo memos el icono
  410. if (m_sizeImag.cx < ct->rect.Width())
  411. {
  412. Image.Draw(dc,ct->uIcon,CPoint(ct->rect.left+2,ct->rect.top+2),ILD_TRANSPARENT);
  413. rectText=ct->rect;
  414. rectText.left+=m_sizeImag.cx+8;
  415. rectText.right-=5;
  416. CString m_cadBreak=ct->lpMsg;
  417. int c=0;
  418. int cont=m_cadBreak.GetLength();
  419. while(cont > 1 )
  420. {
  421. CString m_scadtemp=m_cadBreak+szStrPoints;
  422. CSize coor=dc->GetTextExtent(m_scadtemp,m_scadtemp.GetLength());
  423. if(coor.cx > rectText.Width())
  424. m_cadBreak=m_cadBreak.Left(m_cadBreak.GetLength()-1);
  425. else
  426. break;
  427. cont--;
  428. }
  429. m_cadBreak+=szStrPoints;
  430. rectText.right+=3;
  431. dc->DrawText(m_cadBreak,rectText,DT_SINGLELINE|DT_LEFT|DT_VCENTER);
  432. CToolTip.SetToolRect(this,iCont+1,&ct->rect);
  433. }
  434. }
  435. if (iCont !=m_iSelectTab)
  436. dc->SetTextColor(clrtext);
  437. dc->SetBkMode(nMode);
  438. }
  439. dc->SelectObject(oldPen);
  440. dc->SelectObject(m_fontOld);
  441. }
  442. void CGuiTabWnd::SetImageList(UINT nBitmapID, int cx, int nGrow, COLORREF crMask)
  443. {
  444. CBitmap cbmp;
  445. BITMAP bmp;
  446. Image.Create(nBitmapID,cx,nGrow,crMask);
  447. cbmp.LoadBitmap(nBitmapID);
  448. cbmp.GetBitmap(&bmp);
  449. Image.Add(&cbmp,crMask);
  450. m_sizeImag=CSize(cx,bmp.bmHeight);
  451. }
  452. CWnd* CGuiTabWnd::GetActiveWnd () const
  453. {
  454. return m_Numtabs == -1 ? NULL : 
  455. ((CGuiTab*) m_pArray [m_Numtabs])->pParent;
  456. }
  457. BOOL CGuiTabWnd::FindItem(HWND hWnd)
  458. {
  459. for (int iCont=0; iCont< m_Numtabs;iCont++)
  460. {
  461. CGuiTab* ct=(CGuiTab*) m_pArray[iCont];
  462. if (ct->pParent->GetSafeHwnd() == hWnd)
  463.     return TRUE;
  464. }
  465. return FALSE;
  466. }
  467. CWnd*  CGuiTabWnd::GetNumWnd(int m_numtab) const
  468. {
  469.         if (m_numtab > m_Numtabs)
  470. return NULL;
  471. else
  472. {
  473. if (m_pArray.GetSize() < 1) return NULL;
  474. CWnd* pw=((CGuiTab*) m_pArray [m_numtab])->pParent;
  475. if (HIWORD(pw)== NULL) return NULL;
  476. else
  477.   return ((CGuiTab*) m_pArray [m_numtab])->pParent;
  478. }
  479. }
  480. void CGuiTabWnd::UpdateCaption(CWnd* pWnd,CString m_Title)
  481. {
  482. for (int iCont=0; iCont< m_Numtabs;iCont++)
  483. {
  484. CGuiTab* ct=(CGuiTab*) m_pArray[iCont];
  485. if (ct->pParent->GetSafeHwnd() == pWnd->GetSafeHwnd())
  486. {
  487. CString x=ct->lpMsg;
  488. if(x!=m_Title)
  489. {
  490. ct->lpMsg=m_Title;
  491. GetParentFrame()->SendMessage(WM_SIZE);
  492. RecalLayout();
  493. Invalidate();
  494. UpdateWindow();
  495. }
  496. break;
  497. }
  498. }
  499. }
  500. void CGuiTabWnd::ShowTitle(CString m_Caption)
  501. {
  502. if (m_ActualTitle==TRUE)
  503. {
  504. CWnd* pParent=GetParent();
  505. pParent->SetWindowText(m_Caption);
  506. pParent->SendMessage(WM_COMMAND,WM_SHOWTITLE);
  507. }
  508. }
  509. void CGuiTabWnd::Addtab(CWnd *pParent, CString lpMsg, UINT uIcon)
  510. {
  511. ASSERT_VALID(pParent);
  512. m_pArray.SetAtGrow(m_Numtabs,new CGuiTab(pParent,lpMsg,uIcon));
  513. if (m_alnTab!=ALN_TOP || m_TypeTab == TYPE_NORMAL)
  514. {
  515. if (m_Numtabs==0)
  516. pParent->ShowWindow(SW_SHOW);
  517. else
  518. pParent->ShowWindow(SW_HIDE);
  519. m_iSelectTab=0;
  520. }
  521. else
  522. m_iSelectTab=m_Numtabs;
  523. m_Numtabs++;
  524. //assign color
  525. CGuiTab* ctn=(CGuiTab*) m_pArray[m_Numtabs-1]; 
  526. GuiDrawLayer::GetNextColor(m_Numtabs,ctn->m_clrLTab,ctn->m_clrHtab);
  527. if (m_alnTab==ALN_TOP && m_TypeTab != TYPE_NORMAL)
  528. {
  529. pParent->ShowWindow(SW_SHOWMAXIMIZED);
  530. }
  531. if (m_style == S3D)
  532. CToolTip.AddTool(this,lpMsg,CRect(0,0,0,0),m_Numtabs);
  533. RecalLayout();
  534. }
  535. void CGuiTabWnd::DeleteTab(int m_numtab)
  536. {
  537. if (m_numtab < m_Numtabs)
  538. {
  539. CGuiTab* ctn=(CGuiTab*) m_pArray[m_numtab]; 
  540. if (m_alnTab!=ALN_TOP)
  541. ASSERT_VALID(ctn->pParent);
  542. if (ctn)
  543. delete ctn;
  544. m_Numtabs--;
  545. m_pArray.RemoveAt(m_numtab,1);
  546. if (m_Numtabs >0)
  547. {
  548. if (m_iSelectTab == m_numtab)
  549. {
  550. m_iSelectTab=m_iSelectTab-1;
  551. if (m_iSelectTab< 0) m_iSelectTab=0;
  552. CGuiTab* ctn =(CGuiTab*) m_pArray[m_iSelectTab];
  553. CWnd* pParentNew=ctn->pParent;
  554. ASSERT_VALID(pParentNew);
  555. pParentNew->ShowWindow(SW_SHOW);
  556. }
  557. else
  558. {
  559. if (m_iSelectTab > m_numtab)
  560. {
  561. m_iSelectTab--;
  562. }
  563. }
  564. RecalLayout();
  565. }
  566. }
  567. }
  568. void CGuiTabWnd::OnSize(UINT nType, int cx, int cy) 
  569. {
  570. CWnd::OnSize(nType, cx, cy);
  571. if (m_Numtabs > 0)
  572. RecalLayout();
  573. }
  574. void CGuiTabWnd::SetCurtab(int m_numtab)
  575. {
  576. if (m_numtab < m_Numtabs && m_numtab != m_iSelectTab )
  577. {
  578. CGuiTab* ctn=(CGuiTab*) m_pArray[m_numtab]; 
  579. CWnd* pParentNew= ctn->pParent;
  580. CGuiTab* ct =(CGuiTab*) m_pArray[m_iSelectTab];
  581. CWnd* pParentActual=ct->pParent;
  582. ASSERT_VALID(pParentNew);
  583. ASSERT_VALID(pParentActual);
  584. if (m_alnTab==ALN_TOP && m_TypeTab != TYPE_NORMAL)
  585. {
  586. pParentNew->BringWindowToTop();
  587. }
  588. else
  589. {
  590. pParentActual->ShowWindow(SW_HIDE);
  591. pParentNew->ShowWindow(SW_SHOW);
  592. }
  593. m_iSelectTab=m_numtab;
  594. if (m_alnTab==ALN_TOP)
  595. AjustTabs();
  596. Invalidate();
  597. UpdateWindow();
  598. }
  599. }
  600. int CGuiTabWnd::GetCurtab()
  601. {
  602. return m_iSelectTab;
  603. }
  604. void CGuiTabWnd::OnLButtonDown(UINT nFlags, CPoint point) 
  605. {
  606. // TODO: Add your message handler code here and/or call default
  607. CWnd::OnLButtonDown(nFlags, point);
  608. for (int iCont=0; iCont< m_Numtabs;iCont++)
  609. {
  610. CGuiTab* ct=(CGuiTab*) m_pArray[iCont];
  611. if (ct->rect.PtInRect(point) != 0)
  612. {
  613.             SetCurtab(iCont);
  614. ShowTitle(ct->lpMsg);
  615. m_InTab=TRUE;
  616. return;
  617. }
  618. }
  619. }
  620. void CGuiTabWnd::OnRButtonDown(UINT nFlags, CPoint point)
  621. {
  622. // TODO: Add your message handler code here and/or call default
  623. m_InTab=FALSE;
  624. OnLButtonDown(nFlags,point); 
  625. if (((CGuiTab*)m_pArray[m_iSelectTab])->nMenu > 0 && m_InTab==TRUE)
  626. {
  627. CMenu m_menu;
  628. m_menu.LoadMenu(((CGuiTab*)m_pArray[m_iSelectTab])->nMenu);
  629. CMenu* m_SubMenu = m_menu.GetSubMenu(0);
  630. CRect rc=((CGuiTab*)m_pArray[m_iSelectTab])->rect;
  631. ClientToScreen(&point);
  632. m_SubMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_VERTICAL,
  633. point.x, point.y, AfxGetMainWnd(), &rc);
  634. }
  635. }
  636. //Thanks to Ernesto Garcia
  637. void CGuiTabWnd::SetStyle(Style estyle)
  638. {
  639. m_style=estyle;
  640. }
  641. void CGuiTabWnd::OnDestroy()
  642. {
  643. // Libera la memoria
  644.     for( int i=0; i<m_Numtabs; i++ )
  645.     {
  646.     CGuiTab *pTab = (CGuiTab*)m_pArray.GetAt(i);
  647.     if( pTab )
  648.         delete pTab;
  649.     }
  650. CWnd::OnDestroy();
  651. // TODO: Add your message handler code here
  652. }
  653. // daniel_h
  654. void CGuiTabWnd::SetTabsTitle(int iTabNr, CString sNewTitle)
  655. {
  656. CGuiTab* ct=(CGuiTab*) m_pArray[iTabNr];
  657. if (ct!=NULL)
  658. {
  659. ct->lpMsg=sNewTitle;
  660. m_pArray[iTabNr]=ct;
  661. AjustTabs();
  662. Invalidate();
  663. }
  664. }
  665. void  CGuiTabWnd::SetTabMenu(UINT nMENU,int nNumTab)
  666. {
  667. if (m_Numtabs >0)
  668. ((CGuiTab*)m_pArray[(nNumTab==0?m_Numtabs-1:nNumTab)])->AddMenu(nMENU);
  669. }
  670. BOOL CGuiTabWnd::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
  671. {
  672. // TODO: Add your specialized code here and/or call the base class
  673. CWnd::OnNotify(wParam,lParam,pResult);
  674. CWnd* pParent= GetParent();
  675. if (pParent->GetSafeHwnd())
  676. pParent->SendMessage(WM_NOTIFY, wParam, lParam);
  677. return TRUE;
  678. }