GuiFolder.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 "GuiFolder.h"
  15. #include "GuiDrawLayer.h"
  16. #ifdef _DEBUG
  17. #define new DEBUG_NEW
  18. #undef THIS_FILE
  19. static char THIS_FILE[] = __FILE__;
  20. #endif
  21. /////////////////////////////////////////////////////////////////////////////
  22. // CGuiFolder
  23. IMPLEMENT_DYNAMIC(CGuiFolder,CWnd)
  24. CFolderBar::CFolderBar(CWnd* m_wnd,LPCSTR lp_msg,UINT uImg)
  25. {
  26. m_Cwnd=m_wnd;
  27. m_lpMsg=lp_msg;
  28. m_img=uImg;
  29. m_rect=CRect(0,0,0,0);
  30. m_posUp=TRUE;
  31. }
  32. CGuiFolder::CGuiFolder()
  33. {
  34. m_ArrayFolder.RemoveAll();
  35. m_NumFolders=0;
  36. m_numFolderDown=0;
  37. m_numFolderUp=0;
  38. m_iSelected=0;
  39. m_ultimoFolderResal =-1;
  40. m_itemp=0;
  41. m_typel=mOutlook;//by default
  42. m_iWhatFolderIsDrawNow=0;
  43. }
  44. CGuiFolder::~CGuiFolder()
  45. {
  46. /* Modified By SunZhenyu 2003/8/22, Add next 7 lines. */
  47. for(int i=0; i<m_ArrayFolder.GetSize(); i++)
  48. {
  49. CFolderBar * p = (CFolderBar*)m_ArrayFolder[i];
  50. if( p )
  51. delete p;
  52. }
  53. m_ArrayFolder.RemoveAll();
  54. }
  55. BEGIN_MESSAGE_MAP(CGuiFolder, CWnd)
  56. //{{AFX_MSG_MAP(CGuiFolder)
  57. ON_WM_MOUSEMOVE()
  58. ON_WM_PAINT()
  59. ON_WM_SIZE()
  60. ON_WM_TIMER()
  61. ON_WM_ERASEBKGND()
  62. ON_WM_LBUTTONDOWN()
  63. ON_WM_LBUTTONUP()
  64. //}}AFX_MSG_MAP
  65. END_MESSAGE_MAP()
  66. /////////////////////////////////////////////////////////////////////////////
  67. // CGuiFolder message handlers
  68. BOOL CGuiFolder::Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID) 
  69. {
  70. // TODO: Add your specialized code here and/or call the base class
  71. return CWnd::Create(NULL,_T(""), dwStyle|WS_CHILD, rect, pParentWnd, nID);
  72. }
  73. void CGuiFolder::OnLButtonDown(UINT nFlags, CPoint point) 
  74. {
  75. // TODO: Add your message handler code here and/or call default
  76. int m_iNumBotton=m_ArrayFolder.GetSize();
  77. for( int iCont=0; iCont< m_iNumBotton;iCont++)
  78. {
  79. CFolderBar* cit=(CFolderBar*)m_ArrayFolder[iCont];
  80. if (cit->m_rect.PtInRect(point))
  81. {
  82. DrawFolder(cit,mPush);
  83. }
  84. }
  85. CWnd::OnLButtonDown(nFlags, point);
  86. }
  87. void CGuiFolder::PreSubclassWindow() 
  88. {
  89. ModifyStyle(0,BS_OWNERDRAW);
  90. CWnd::PreSubclassWindow();
  91. }
  92. void CGuiFolder::OnLButtonUp(UINT nFlags, CPoint point) 
  93. {
  94. // TODO: Add your message handler code here and/or call default
  95. int m_iNumBotton=m_ArrayFolder.GetSize();
  96. for( int iCont=0; iCont< m_iNumBotton;iCont++)
  97. {
  98. CFolderBar* cit=(CFolderBar*)m_ArrayFolder[iCont];
  99. if (cit->m_rect.PtInRect(point))
  100. {
  101. DrawFolder(cit,mFlat);
  102. m_itemp=m_iSelected;
  103. m_iSelected=iCont;
  104. EfectoScroll();
  105. }
  106. }
  107. CWnd::OnLButtonUp(nFlags, point);
  108. }
  109. void CGuiFolder::TypeLook(TypeFolder tol)
  110. {
  111. m_typel=tol;
  112. }
  113. void CGuiFolder::EfectoScroll()
  114. {
  115. int m_iNumBotton=m_ArrayFolder.GetSize();
  116. int m_iSentidoScroll=0; //1=hacia abajo, 2=hacia arriba
  117. if (m_iNumBotton > 0) //si existe un solo folder no haga nada
  118. {
  119. // si es el ultimo folder y no esta abajo no haga nada
  120. if (m_iSelected == m_NumFolders-1 &&
  121. ((CFolderBar*)m_ArrayFolder[m_iSelected])->m_posUp ==TRUE)
  122. {
  123. m_iSelected=m_itemp;
  124. return;
  125. }
  126. else if (((CFolderBar*)m_ArrayFolder[m_iSelected])->m_posUp ==TRUE )
  127. {
  128. if (((CFolderBar*)m_ArrayFolder[m_iSelected+1])->m_posUp ==FALSE)
  129. return;
  130. m_iSentidoScroll =1;
  131. //de esta posici髇 todos los folders hacia abajo 
  132. for (int iCont=m_iSelected+1;iCont < m_iNumBotton; iCont++)
  133. ((CFolderBar*)m_ArrayFolder[iCont])->m_posUp =FALSE;
  134. }
  135. else if (((CFolderBar*)m_ArrayFolder[m_iSelected])->m_posUp ==FALSE)
  136. {
  137. m_iSentidoScroll =2;
  138. //de esta posici髇 todos los folders van arriba
  139. for (int iCont=m_iSelected;iCont >0; iCont--)
  140. ((CFolderBar*)m_ArrayFolder[iCont])->m_posUp =TRUE;
  141. }
  142. }
  143. CRect m_rect=((CFolderBar*)m_ArrayFolder[m_iSelected])->m_rect;
  144. CClientDC dc(this);
  145. if (m_iSentidoScroll >0)
  146. {
  147. CWnd* pParent=((CFolderBar*)m_ArrayFolder[m_itemp])->m_Cwnd;
  148. ASSERT_VALID(pParent);
  149. CWnd* pParentn=((CFolderBar*)m_ArrayFolder[m_iSelected])->m_Cwnd;
  150. ASSERT_VALID(pParentn);
  151. pParent->ShowWindow(SW_HIDE);
  152. pParentn->ShowWindow(SW_SHOW);
  153. m_AntFolder=m_iSelected;
  154. }
  155. if (m_iSentidoScroll ==1)
  156. {
  157. /*CGuiFolderBar* cb=(CGuiFolderBar*)m_ArrayFolder[m_iSelected];
  158. CWnd* m_cwnd=((CGuiFolderBar*)m_ArrayFolder[m_iSelected])->m_Cwnd;
  159. CRect rctemp=cb->m_rect;
  160. while (m_rect.bottom < m_iPosDown)
  161. {
  162. m_cwnd->SetWindowPos(NULL,m_rect.left,cb->m_rect.bottom,m_rect.Width(),m_rect.bottom,
  163. SWP_NOACTIVATE|SWP_NOZORDER);
  164. m_rect.bottom+=10;
  165. //DrawFolder(cb,mFlat);
  166. //m_cwnd->Invalidate();
  167. //m_cwnd->SendMessage(WM_PAINT,0,0);
  168. }*/
  169. RecalLayout();
  170. }
  171. else if (m_iSentidoScroll ==2)
  172. {
  173. /*CWnd* m_cwnd=((CGuiFolderBar*)m_ArrayFolder[m_iSelected])->m_Cwnd;
  174. CGuiFolderBar* cb=(CGuiFolderBar*)m_ArrayFolder[m_iSelected];
  175. while (m_rect.top > m_iposUp)
  176. {
  177. m_cwnd->SetWindowPos(NULL,m_rect.left,m_iposUp-1,m_rect.Width(),m_iPosDown-m_iposUp,
  178. SWP_NOACTIVATE|SWP_NOZORDER);
  179. cb->m_rect.top-=10;
  180. cb->m_rect.bottom-=10;
  181. Sleep(50);
  182. DrawFolder(cb,mFlat);
  183. }
  184. */
  185. RecalLayout();
  186. }
  187. else
  188. m_iSelected=m_itemp;
  189. }
  190. void CGuiFolder::OnMouseMove(UINT nFlags, CPoint point) 
  191. {
  192. int m_iNumBotton= m_ArrayFolder.GetSize();
  193. static int m_AntTecla=-1;
  194. for( int iCont=0; iCont< m_iNumBotton;iCont++)
  195. {
  196. CFolderBar* cit=(CFolderBar*)m_ArrayFolder[iCont];
  197. m_iWhatFolderIsDrawNow=iCont;
  198. if (cit->m_rect.PtInRect(point))
  199. {
  200. if (m_ultimoFolderResal==m_AntTecla &&
  201. (m_ultimoFolderResal!=-1 && m_AntTecla !=-1)) return;
  202. else
  203. {
  204.   if (m_ultimoFolderResal != -1)
  205.   {
  206. CFolderBar* cit1=(CFolderBar*)m_ArrayFolder[m_ultimoFolderResal];
  207. DrawFolder(cit1,mFlat);
  208.   }
  209. }
  210. DrawFolder(cit,mNormal);
  211. m_AntTecla=m_ultimoFolderResal;
  212. m_ultimoFolderResal=iCont;
  213. SetTimer(1,100,NULL);
  214. return;
  215. }
  216. }
  217. if (m_ultimoFolderResal != -1)
  218.  {
  219. CFolderBar* cit1=(CFolderBar*)m_ArrayFolder[m_ultimoFolderResal];
  220. DrawFolder(cit1,mFlat);
  221. m_ultimoFolderResal=-1;
  222.  }
  223. m_AntTecla=-1;
  224. CWnd::OnMouseMove(nFlags, point);
  225. }
  226. void CGuiFolder::DrawFolder(CFolderBar* cfb,Style m_Style)
  227. {
  228. CRect rc=cfb->m_rect;
  229. CBrush cb;
  230. CClientDC pDC(this);
  231. cb.CreateSysColorBrush(COLOR_BTNFACE);
  232. rc.top+=1;
  233. rc.right-=1;
  234. pDC.FillRect(&rc,&cb);
  235. if (m_typel!=mOutlook)
  236. {
  237. rc.right-=30;
  238. }
  239. if (m_Style == mNormal)
  240. {
  241. pDC.Draw3dRect(rc, GuiDrawLayer::GetRGBColorBTNHigh(),GuiDrawLayer::GetRGBColorShadow());
  242. rc.DeflateRect(1,1);
  243. pDC.Draw3dRect(rc, GuiDrawLayer::GetRGBColorFace(),GuiDrawLayer::GetRGBColorShadow());
  244. }
  245. else if (m_Style == mFlat)
  246. pDC.Draw3dRect(rc, GuiDrawLayer::GetRGBColorBTNHigh(),GuiDrawLayer::GetRGBColorShadow());
  247. else if (m_Style == mPush)
  248. pDC.Draw3dRect(rc, GuiDrawLayer::GetRGBColorShadow(),GuiDrawLayer::GetRGBColorBTNHigh());
  249. int OldMode=pDC.SetBkMode(TRANSPARENT);
  250. cfont = pDC.SelectObject(CFont::FromHandle((HFONT)GetStockObject(DEFAULT_GUI_FONT)));
  251. CString m_cadBreak=cfb->m_lpMsg;
  252. int cont=m_cadBreak.GetLength();
  253. CSize coor=pDC.GetTextExtent(m_cadBreak,m_cadBreak.GetLength());
  254. if ( coor.cx > rc.Width())
  255. {
  256. rc.left+=1;
  257. while(cont > 1 )
  258. {
  259. CString m_scadtemp=m_cadBreak+"...";
  260. CSize coor=pDC.GetTextExtent(m_scadtemp,m_scadtemp.GetLength());
  261. if(coor.cx > rc.Width())
  262. m_cadBreak=m_cadBreak.Left(m_cadBreak.GetLength()-1);
  263. else
  264. break;
  265. cont--;
  266. }
  267. m_cadBreak+=_T("...");
  268. rc.right+=3;
  269. pDC.DrawText(m_cadBreak,rc,DT_SINGLELINE|DT_LEFT|DT_VCENTER);
  270. }
  271. else
  272. {
  273.   if (m_typel!=mOutlook)
  274. pDC.DrawText(cfb->m_lpMsg,rc,DT_SINGLELINE|DT_LEFT|DT_VCENTER);
  275.   else
  276. pDC.DrawText(cfb->m_lpMsg,rc,DT_WORDBREAK|DT_SINGLELINE|DT_CENTER|DT_VCENTER);
  277. }
  278.     pDC.SetBkColor(OldMode);
  279. // Modified By SunZhenyu
  280. pDC.SelectObject(cfont);
  281. }
  282. void CGuiFolder::OnPaint() 
  283. {
  284. CPaintDC dc(this); // device context for painting
  285. CRect mrect;
  286. int m_iNumFolder=m_ArrayFolder.GetSize();
  287. //mrect.InflateRect(1,1);
  288. //GetClientRect(mrect);
  289. //dc.Draw3dRect(mrect, ::GetSysColor(COLOR_BTNSHADOW),::GetSysColor(COLOR_BTNHIGHLIGHT));
  290. for ( int iCont=0; iCont< m_iNumFolder; iCont++)
  291. {
  292. m_iWhatFolderIsDrawNow=iCont;
  293. if (m_iSelected== iCont)
  294. DrawFolder((CFolderBar*) m_ArrayFolder[iCont],mFlat);
  295. else
  296. DrawFolder((CFolderBar*) m_ArrayFolder[iCont],mFlat);
  297. }
  298. }
  299. void CGuiFolder::OnSize(UINT nType, int cx, int cy) 
  300. {
  301. CWnd::OnSize(nType, cx, cy);
  302. if (m_NumFolders > 0)
  303. RecalLayout();
  304. // TODO: Add your message handler code here
  305. }
  306. void CGuiFolder::OnTimer(UINT nIDEvent) 
  307. {
  308. // TODO: Add your message handler code here and/or call default
  309. if (nIDEvent == 1)
  310. {
  311. CRect rc;
  312. CPoint pt(GetMessagePos());
  313. ScreenToClient (&pt);
  314. GetClientRect(&rc);
  315. if (m_ultimoFolderResal != -1)
  316. {
  317. CFolderBar* cfd=(CFolderBar*) m_ArrayFolder[m_ultimoFolderResal];
  318. rc=cfd->m_rect;
  319. }
  320. if (!rc.PtInRect(pt))
  321. {
  322. if (m_ultimoFolderResal != -1)
  323. {
  324. CFolderBar* cfd=(CFolderBar*) m_ArrayFolder[m_ultimoFolderResal];
  325. CClientDC dc(this);
  326. DrawFolder(cfd,mFlat);
  327. m_ultimoFolderResal=-1;
  328. }
  329. KillTimer(1);
  330. }
  331. }
  332. CWnd::OnTimer(nIDEvent);
  333. }
  334. int CGuiFolder::PointInFolder(CPoint pt)
  335. {
  336. for (int i=0; i < m_ArrayFolder.GetSize(); i++)
  337. {
  338. if ( ((CFolderBar*) m_ArrayFolder[i])->m_rect.PtInRect(pt) )
  339. return i;
  340. }
  341. return -1;
  342. }
  343. BOOL CGuiFolder::PreTranslateMessage(MSG* pMsg) 
  344. {
  345. // TODO: Add your specialized code here and/or call the base class
  346. return CWnd::PreTranslateMessage(pMsg);
  347. }
  348. void CGuiFolder::RecalLayout()
  349. {
  350. CRect m_rect;
  351. CRect m_rectFolder;
  352. m_iPosDown=0; //a partir de donde se ubica el anterior folder
  353. m_iposUp=0;   //a partir de donde se ubica el siguiente folder
  354. int m_iNumFolder=m_ArrayFolder.GetSize();
  355. GetClientRect(&m_rect);
  356. m_rectFolder=m_rect;
  357. m_iPosDown=m_rect.bottom;
  358. for ( int iCont=0; iCont< m_iNumFolder; iCont++)
  359. {
  360. CFolderBar* cfd=(CFolderBar*) m_ArrayFolder[iCont];
  361. if (iCont==0) //inevitablemente arriba
  362. {
  363. m_rectFolder.bottom=m_rect.top+21;
  364. m_iposUp+=m_rectFolder.Height()-1;
  365. cfd->m_rect=m_rectFolder;
  366. }
  367. else
  368. {
  369. if (cfd->m_posUp)
  370. {
  371. m_rectFolder.top=m_iposUp;
  372. m_rectFolder.bottom=m_rectFolder.top+20;
  373. m_iposUp+=m_rectFolder.Height();
  374. cfd->m_rect=m_rectFolder;
  375. }
  376. else
  377. {
  378. for(int iRev=m_iNumFolder-1; iRev>=iCont; iRev--)
  379. {
  380. CFolderBar* cfd=(CFolderBar*) m_ArrayFolder[iRev];
  381. m_rectFolder.bottom=m_iPosDown;
  382. m_rectFolder.top=m_rectFolder.bottom-20;
  383. m_iPosDown-=m_rectFolder.Height();
  384. cfd->m_rect=m_rectFolder;
  385. }
  386. break;
  387. }
  388. }
  389. }
  390. CFolderBar* cfd=(CFolderBar*) m_ArrayFolder[m_iSelected];
  391. CWnd* m_cwnd=cfd->m_Cwnd;
  392. m_cwnd->SetWindowPos(NULL,m_rect.left+1,m_iposUp+1,m_rectFolder.Width()-1,(m_iPosDown-m_iposUp),
  393. SWP_NOACTIVATE|SWP_NOZORDER);
  394. Invalidate();
  395. UpdateWindow();
  396. }
  397. void CGuiFolder::AddFolder(CWnd* pParent,LPCSTR lpMsg, UINT uIMg)
  398. {
  399. m_ArrayFolder.SetAtGrow(m_NumFolders, new CFolderBar(pParent,lpMsg,uIMg));
  400. if (m_NumFolders == 0)
  401.   m_numFolderUp=1;
  402. pParent->ShowWindow(SW_SHOW);
  403. m_iSelected=m_NumFolders;
  404. m_AntFolder=m_iSelected;
  405. m_NumFolders++;
  406. RecalLayout();
  407. }
  408. BOOL CGuiFolder::OnEraseBkgnd(CDC* pDC) 
  409. {
  410. CBrush cbr;
  411. cbr.CreateSolidBrush(GuiDrawLayer::GetRGBColorFace());
  412. CRect m_rect;
  413. GetClientRect(m_rect);
  414. if (m_NumFolders<= 0)
  415. pDC->FillRect(m_rect,&cbr);
  416. else
  417. {
  418. for (int i=0;i<2; i++)
  419. {
  420. pDC->Draw3dRect(m_rect,GuiDrawLayer::GetRGBColorFace(),GuiDrawLayer::GetRGBColorFace());
  421. m_rect.DeflateRect(1,1);
  422. }
  423. }
  424. return TRUE;
  425. }
  426. void CGuiFolder::DeleteFolder(int m_iNumFolder)
  427. {
  428. /* Modified By SunZhenyu 2003/8/22, replace all function lines. */
  429. if (m_iNumFolder >= 0 && m_iNumFolder < m_NumFolders)
  430. {
  431. m_NumFolders--;
  432. CFolderBar * p = (CFolderBar *)m_ArrayFolder.GetAt(m_iNumFolder);
  433. if( p ) delete p;
  434. m_ArrayFolder.RemoveAt(m_iNumFolder);
  435. if (m_iNumFolder == 0 || m_iNumFolder < m_NumFolders)
  436. m_iSelected=m_iNumFolder;
  437. else if(m_iNumFolder > 0)
  438. m_iSelected=m_iNumFolder-1;
  439. RecalLayout();
  440. }
  441. /*
  442. if (m_iNumFolder < m_NumFolders)
  443. {
  444. m_iNumFolder--;
  445. m_ArrayFolder.RemoveAt(m_iNumFolder,m_NumFolders);
  446. if (m_iNumFolder == 0 || m_iNumFolder == m_iNumFolder)
  447. m_iSelected=m_iNumFolder;
  448. else if(m_iNumFolder > 0)
  449. m_iSelected=m_iNumFolder-1;
  450. RecalLayout();
  451. }
  452. */
  453. }
  454. void CGuiFolder::RemoveAllFolder()
  455. {
  456. /* Modified By SunZhenyu 2003/8/22, Add next 6 lines. */
  457. for(int i=0; i<m_ArrayFolder.GetSize(); i++)
  458. {
  459. CFolderBar * p = (CFolderBar*)m_ArrayFolder[i];
  460. if( p )
  461. delete p;
  462. }
  463. m_ArrayFolder.RemoveAll();
  464. RecalLayout();
  465. m_NumFolders=-1;
  466. m_iSelected=-1;
  467. }